2017-02-20 56 views
0

我新來的Hadoop。當它在羣集環境中時,我在理解MapReduce時遇到問題。如何數據簇映射合併減少對環境的

採取字數示例代碼假設我有三個節點,每有一個地圖的任務。 機A:

hello 1 
word 1 
data 1 
... 

機B:地圖後

hello 1 
xu 2 
... 

地圖的輸出被保存在本地文件和機器。 我的問題是跨多臺機器的這些數據如何在傳遞到reduce階段之前被合併?例如,減少statge接收

hello <1, 1> 
xu 1 

回答

1
  1. 在這個例子中映射器獲取從輸入數據的每一行的最後一個單元的平均值。它不會計算單詞,因此請記住,您不會使用此映射器從本地數據集中獲取此類單詞計數輸出數據;
  2. 開始您減少階段MR框架之前,將每個節點的每一個映射器的輸出組成一個單一的關鍵數據集進行排序。最終,它將被分成一組減少工作,你定義你減少邏輯。

機A:

  • 爲您的特定情況下,我在以前的點所提到,所有的輸出將通過將涉及您的輸出的第一個字的鍵進行了分組你好1,字1,數據1

    機B:你好1,徐2

    減速輸入:數據{1},{你好1,1},字{1},許{2}

    查看關於MapReduce的更詳細的這article

  • +0

    謝謝。因此,所有點的輸出都被分組在一起。此輸出是保存在單個文件還是多個文件中以及這些文件的位置? –

    +0

    @shijiexu此輸出保存到「mapreduce.cluster.temp.dir」設置中定義的中間臨時位置。此位置在HDFS之外以避免複製開銷。然後reducer將拾取這些輸出並通過洗牌,分類和縮小階段處理它們 - https://hadoop.apache.org/docs/r2.6.2/api/org/apache/hadoop/mapreduce/Reducer.html – Alex

    1

    一旦Map任務是一份工作,然後輸出保存完成的,然後被轉移到Partitioner class該類負責根據減速分離數據。例如,在你的情況下,必須3噸的機器正在運行2 reducers.Then getpartition()分割器類的方法是負責將所述地圖輸出爲2減速器EX-> 你好1 //減速器1 字1//減速器2個 數據1 //減速器1

    所以現在2頁分離的文件將被創建的一個用於每個映射器節點上創建這些文件中的每個reducer.No取決於地圖輸出是否包含數據的每個減速或不和記住直到現在所有這些文件仍然在映射器節點上。

    在此之後WritableComapartor類被稱爲是負責每2個文件對數據進行排序,這是還負責對它們進行分組。完成此操作後,即可將結果文件發送到羣集中的相應節點。

    在這個混洗和排序之後,所有映射節點都會在各個reducer節點上發送結果輸出文件,然後在reducer上將從所有映射器接收到的文件合併並排序Ex - >以便有2個映射器2個reducer和1個mapper分別生成reducer 1和reducer 2的數據,其他生成的只有一個reducer 1的輸出文件,reducer 1會得到兩個文件,reducer 2會得到1個文件。

    合併和排序後Reducer將在這些文件上運行並生成最終輸出。

    Refer here for more detail about data flow from mapper to reducer

    +0

    感謝你的答案。它更清晰 –

    0

    映射器輸出本地的(在你的情況下,通過字)鍵排序,然後將其劃分成若干塊(塊的個數等於減速,或者如果這個特定的映射器輸出少的數某些減速機沒有鑰匙)。之後,每個塊進入一個相應的reducer(它也接收來自其他映射器的數據片),並將其與來自其他映射器的其他塊合併,然後它們全部作爲reducer的輸入。