我读了以下维基,但仍然无法澄清一件事。
https://wiki.apache.org/hadoop/HadoopMapReduce
说,我有一个大文件,它被分成两个HDFS块,这些块被物理保存到两台不同的机器中。请考虑群集中没有此类节点在本地托管这两个块。据我所知,在TextInputFormat的情况下,HDFS块大小通常与分割大小相同。现在,由于有2个拆分,因此将在2个独立的机器中生成2个映射实例,这些机器在本地保存块。现在假设HDFS文本文件已经在一行中间断开以形成块。 hadoop现在将块2从第二台机器复制到第一台机器中,这样它可以从第二块提供第一条线(断线的一半)来完成第一块的最后一条断线吗?
答案 0 :(得分:4)
现在假设HDFS文本文件已在一行中间断开以形成块。 hadoop现在将块2从第二台机器复制到第一台机器中,这样它可以从第二块提供第一条线(断线的一半)来完成第一块的最后一条断线吗?
Hadoop不会将块复制到运行map任务的节点,这些块将从数据节点流式传输到任务节点(具有一些合理的传输块大小,例如4kb)。因此,在您给出的示例中,处理第一个块的map任务将读取整个第一个块,然后流读取第二个块,直到找到行尾字符。所以它可能“大多数”是本地的。
读取第二个块的多少取决于行的长度 - 完全有可能分割3个块的文件将由3个映射任务处理,第二个映射任务基本上不处理任何记录(但是全部读取)如果一行在块1中开始并在块3中结束,则来自块2和3)中的一些数据。
希望这是有道理的