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

Hadoop MapReduce:当两个块分布在不同的节点上时,如何进行输入拆分?,hadoop,mapreduce,hdfs,input-split,Hadoop,Mapreduce,Hdfs,Input Split,我读了下面的维基,但仍然不能澄清一件事 比如说,我有一个大文件,它被分成两个HDFS块,这些块被物理地保存到两台不同的机器中。考虑集群中没有这样的节点本地承载两个块。据我所知,在TextInputFormat的情况下,HDFS块大小通常与拆分大小相同。现在,由于有2个分割,2个映射实例将在本地保存块的2台独立计算机中生成。现在假设HDFS文本文件已在一行中间断开以形成块。hadoop现在会将块2从第二台机器复制到第一台机器中,这样它就可以提供第二个块的第一条断线来完成第一个块的最后一条断线吗 现

我读了下面的维基,但仍然不能澄清一件事

比如说,我有一个大文件,它被分成两个HDFS块,这些块被物理地保存到两台不同的机器中。考虑集群中没有这样的节点本地承载两个块。据我所知,在TextInputFormat的情况下,HDFS块大小通常与拆分大小相同。现在,由于有2个分割,2个映射实例将在本地保存块的2台独立计算机中生成。现在假设HDFS文本文件已在一行中间断开以形成块。hadoop现在会将块2从第二台机器复制到第一台机器中,这样它就可以提供第二个块的第一条断线来完成第一个块的最后一条断线吗

现在假设HDFS文本文件已在一行中间断开以形成块。hadoop现在会将块2从第二台机器复制到第一台机器中,这样它就可以提供第二个块的第一条断线来完成第一个块的最后一条断线吗

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

第二个块的读取量取决于行的长度-完全有可能拆分为3个块的文件将由3个映射任务处理,第二个映射任务基本上不处理任何记录,但读取块2中的所有数据,如果行从块1开始并在块3结束,则读取块2和块3中的部分数据

希望这有意义

现在假设HDFS文本文件已在一行中间断开以形成块。hadoop现在会将块2从第二台机器复制到第一台机器中,这样它就可以提供第二个块的第一条断线来完成第一个块的最后一条断线吗

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

第二个块的读取量取决于行的长度-完全有可能拆分为3个块的文件将由3个映射任务处理,第二个映射任务基本上不处理任何记录,但读取块2中的所有数据,如果行从块1开始并在块3结束,则读取块2和块3中的部分数据


希望这有意义

看看这个谢谢Magham,这真的很有帮助。因此,实际上每个映射程序都必须从另一个datanode复制下一个块。因此,这只是本地任务的一半。请参阅关于同一主题的其他讨论。看看这个谢谢Magham,这真的很有帮助。因此,实际上每个映射程序都必须从另一个datanode复制下一个块。因此,这只是本地任务的一半。请参阅关于同一主题的其他讨论。是的,流式传输是有意义的。很好的解释。现在在你的例子中,一条巨大的单行线分布在3个块上,并在块3的某个地方结束-我知道第二个映射器将读取它自己的输入分割,即第二个块,但只是跳过它。但是为什么第二个映射器会进入块3?它不会进入块3,除非它当前正在处理块2的一行,并且正在寻找该记录的EOL字符。映射任务2将在块2上流式传输,永远找不到下线字符,并在到达块2末尾时终止。是的,流式传输是有意义的。很好的解释。现在在你的例子中,一条巨大的单行线分布在3个块上,并在块3的某个地方结束-我知道第二个映射器将读取它自己的输入分割,即第二个块,但只是跳过它。但是为什么第二个映射器会进入块3?它不会进入块3,除非它当前正在处理块2的一行,并且正在寻找该记录的EOL字符。映射任务2将在块2上流动,永远找不到下线字符,并在到达块2末尾时终止。