2016-01-05 15 views
0

只有在所有地圖都運行後,我需要在一臺計算機上發送mapper的輸出。Hadoop map reduce--發送mapper的輸出後才能減少所有地圖的運行

例如:

如果計算機#1跑了他的地圖功能的1000倍,我要發送一次輸出所有1000米的地圖發生了。

有沒有辦法做到這一點?

編輯 - 爲什麼我想這樣做了解釋:

我實現算法篷。 我的計劃是在我擁有的每臺機器上運行頂蓋,並找到它的本地數據的質心。

一旦我找到本地質心,我想發送到reducer局部質心和多少點與他們有關。

例如: 機器#1找到3個質心,每個質心有30個視圖。 我想提交以減少(質心,意見)。 但問題是,只有在機器的所有地圖功能都運行後,我纔會知道這些視圖。這就是爲什麼我想發送機器映射器的輸出以減少一次全部運行。

+1

我不知道你爲什麼想這樣做,但肯定有一個可以設置的配置字符串。我不記得它叫什麼了。我們總是讓我們的默認值(我相信是99%或95%)。 – gardenhead

回答

2

實現接近此目的的唯一方法是調整配置屬性mapreduce.job.reduce.slowstart.completedmaps。這個設置在Apache Hadoop文檔中對mapred-default.xml進行了討論。

<property> 
    <name>mapreduce.job.reduce.slowstart.completedmaps</name> 
    <value>0.05</value> 
    <description>Fraction of the number of maps in the job which should be 
    complete before reduces are scheduled for the job. 
    </description> 
</property> 

但是,忽略此設置可能會損害羣集的吞吐量。通常,減速器可以在地圖任務完成時儘早從地圖任務中提取中間地圖輸出。將此調整爲1.0將防止減速器獲取任何東西,直到所有地圖任務完成。當最後的地圖任務完成並且減速器開始提取時,這會導致突然的網絡帶寬利用率突然增加。

正常情況下,減速器獲取映射輸出的時間不應改變MapReduce程序的正確性。這一切都發生在MapReduce shuffle內部。無論Reducer如何獲取地圖輸出的時間,最終呈現給Reducer代碼的數據都是相同的。

1

在map任務完成之前,reducer端沒有任何反應,除了mapper輸出被複制到reducer節點。 Reducer只有在完成所有地圖任務後纔會啓動。爲什麼要這樣做有特定的原因嗎?

+0

我正在實現算法冠層以便在每個映射器中查找質心。一旦映射器完成,我想將它們發送到reducer,並再次在映射器的質心上做頂蓋。例如,如果映射器1找到3個質心並且每個都有30個相關的點。我想發送以減少每個質心和相關點的數量。但是由於我只在所有映射器運行後才知道相關點的數量,我只想在映射器運行後發送輸出。 – AsafSH

1

通過將slowstart設置爲1.0可以輕鬆完成。

編輯mapred-sites.xml中:

登錄作爲用戶的hadoop

# vim ~/hadoopuser/hadoop/etc/hadoop/mapred-sites.xml <-- Hadoop 2.x 

# vim ~/hadoopuser/hadoop/conf/hadoop/mapred-sites.xml <-- Hadoop 1.x 

和變化值至1.0如實施例下面:

<property> 
    <name>mapreduce.job.reduce.slowstart.completedmaps</name> 
    <value>1.0</value> 
    <description>The setting would start once all maps are finished </description> 
</property> 

這是有效的的hadoop 1.2。 1,2.x和Cloudera。

在Cloudera V5.5中。1配置下

website: http://localhost:7180/cmf/services/10/config 
**Page 3** 

Number of Map Tasks to Complete Before Reduce Tasks 
mapred.reduce.slowstart.completed.maps 

從默認值變爲0.05到1.0。