2013-06-27 18 views
2

我讀過下面的wiki,但仍然無法澄清一件事。MapReduce:當兩個塊分佈在不同節點上時,輸入分割如何完成?

https://wiki.apache.org/hadoop/HadoopMapReduce

說,我有一個大的文件,該文件分爲兩個HDFS塊和塊物理保存到兩臺不同的機器。考慮在本地承載這兩個塊的羣集中沒有這樣的節點。正如我理解的情況下TextInputFormat HDFS塊的大小通常與分割大小相同。現在,由於有2個分割,2個地圖實例將在2個獨立的機器中產生,這些機器在本地保存這些塊。現在假定HDFS文本文件已在一行的中間被破壞以形成塊。現在hadoop會將第二臺機器上的第二臺機器複製到第一臺機器中,這樣它可以提供第二臺機器的第一行(斷開的一半)以完成第一臺機器的最後一個虛線?

+0

看一看本http://stackoverflow.com/questions/ 14291170/how-do-hadoop-process-records-records-split-across-block-boundaries –

+0

感謝Magham,這真的很有幫助。所以幾乎每個映射器都必須從另一個datanode複製下一個塊。所以這只是本地任務的一半。 –

+0

請參閱關於同一主題的另一個討論。 http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-records-split-across-block-boundaries – Saket

回答

3

現在假設HDFS文本文件在一行的中間被打破以形成塊。現在hadoop會將第二臺機器上的第二臺機器複製到第一臺機器中,這樣它可以提供第二臺機器的第一行(斷開的一半)以完成第一臺機器的最後一個虛線?

的Hadoop不將塊複製到運行映射任務的節點,所述塊從數據節點到任務節點(有一些合理的傳送塊大小,例如4KB)流式傳輸。因此,在您給出的示例中,處理第一個塊的地圖任務將讀取整個第一個塊,然後流讀取第二個塊直到找到行尾字符。所以它可能「大部分」是本地的。

讀取第二個塊的數量取決於該行的長度 - 完全有可能分割3個塊的文件將由3個地圖任務處理,而第二個地圖任務基本上不處理任何記錄(但讀取所有從方框2和一些3)如果一個線在塊1開始,並且在塊結束數據3.

希望這是有意義

+0

是的,流式傳輸是有道理的。很好的解釋。 –

+0

現在在你的例子中,一個巨大的單行分佈在3個塊中,並在塊3的某個地方結束 - 我理解第二個映射器將讀取它自己的輸入分割,即第二個塊(但只是跳過它)。但爲什麼第二個映射器會去第3塊? –

+0

除非它正在處理來自塊2的一行並正在尋找該記錄的EOL字符,否則它將不會進入塊3。地圖任務2將流過塊2,永遠不會找到EOL字符,並在到達塊2末尾時終止。 –

相關問題