2013-06-27 21 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末尾时终止。 –

相关问题