2

我阅读了以下 wiki,但仍然无法澄清一件事。

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

比如说,我有一个大文件被分成两个 HDFS 块,并且这些块被物理保存到 2 台不同的机器中。考虑在集群中没有这样的节点在本地托管这两个块。据我了解,对于 TextInputFormat HDFS 块大小通常与拆分大小相同。现在由于有 2 个拆分,2 个地图实例将在 2 个单独的机器中生成,这些机器在本地保存块。现在假设 HDFS 文本文件在一行中间被破坏以形成块。hadoop 现在会将第 2 台机器中的第 2 块复制到第 1 台机器中,以便它可以提供第 2 块的第一行(断线的一半)来完成第一个块的最后一条断线吗?

4

1 回答 1

4

现在假设 HDFS 文本文件在一行中间被破坏以形成块。hadoop 现在会将第 2 台机器中的第 2 块复制到第 1 台机器中,以便它可以提供第 2 块的第一行(断线的一半)来完成第一个块的最后一条断线吗?

Hadoop 不会将块复制到运行映射任务的节点,块从数据节点流式传输到任务节点(具有一些合理的传输块大小,例如 4kb)。因此,在您给出的示例中,处理第一个块的映射任务将读取整个第一个块,然后流式读取第二个块,直到找到行尾字符。所以它可能“主要”是本地的。

读取第二个块的多少取决于该行的长度 - 完全有可能一个文件拆分为 3 个块将由 3 个映射任务处理,而第二个映射任务基本上不处理任何记录(但从块 2 和部分 3) 如果一行从块 1 开始并在块 3 结束。

希望这是有道理的

于 2013-06-28T01:12:08.633 回答