mapreduce:当两个块分布在不同的节点上时,如何进行输入拆分?

gz5pxeao  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(298)

我读了下面的维基,但仍然不能澄清一件事。
https://wiki.apache.org/hadoop/hadoopmapreduce
比方说,我有一个大文件,它被分成两个hdfs块,这些块被物理地保存到两台不同的机器中。假设集群中没有这样的节点在本地承载这两个块。据我所知,对于textinputformat,hdfs块大小通常与分割大小相同。现在由于有2个分割,2个Map示例将在本地保存块的2个独立机器中生成。现在假设hdfs文本文件在一行的中间被打断以形成块。hadoop现在是否会将第二个机器上的块2复制到第一个机器上,以便提供第二个块的第一行(断开的一半)来完成第一个块的最后一条断开的行?

0aydgbwb

0aydgbwb1#

现在假设hdfs文本文件在一行的中间被打断以形成块。hadoop现在是否会将第二个机器上的块2复制到第一个机器上,以便提供第二个块的第一行(断开的一半)来完成第一个块的最后一条断开的行?
hadoop不会将块复制到运行map任务的节点,这些块是从数据节点流式传输到任务节点的(具有一些合理的传输块大小,如4kb)。因此,在您给出的示例中,处理第一个块的map任务将读取整个第一个块,然后流式读取第二个块,直到找到行尾字符。所以可能主要是本地的。
读取第二个块的多少取决于行的长度—完全有可能拆分为3个块的文件将由3个Map任务处理,如果一行从块1开始到块3结束,则第二个Map任务基本上不处理任何记录(但读取块2和块3中的一些数据)。
希望这有意义

相关问题