Hadoop输入拆分大小与块大小

roh*_*ith 19 hadoop mapreduce

我正在通过hadoop权威指南,它清楚地解释了输入分裂.它就像

输入拆分不包含实际数据,而是具有HDFS数据的存储位置

通常,输入分割的大小与块大小相同

1)假设一个64MB的块在节点A上并在其他2个节点(B,C)之间复制,map-reduce程序的输入分割大小是64MB,这个分割只有节点A的位置吗?或者它是否具有所有三个节点A,b,C的位置?

2)由于数据是所有三个节点的本地数据,框架如何决定(选择)在特定节点上运行的maptask?

3)如果输入分割大小大于或小于块大小,如何处理?

tha*_*_DG 26

  • @ user1668782的答案是对这个问题的一个很好的解释,我将尝试给出一个图形描述.

  • 假设我们有一个400MB的文件,包含4个记录(例如:400MB的csv文件,它有4行,每行100MB)

在此输入图像描述

  • 如果HDFS 块大小配置为128MB,则4个记录将不会均匀地分布在块中.它看起来像这样.

在此输入图像描述

  • 块1包含整个第一条记录和第二条记录的28MB块.
  • 如果要在块1上运行映射器,则映射器无法处理,因为它不会具有整个第二条记录.
  • 这是输入拆分解决的确切问题.输入拆分遵循逻辑记录边界.

  • 让我们假设输入分割大小为200MB

在此输入图像描述

  • 因此,输入分割1应该同时具有记录1和记录2.并且输入分割2不会以记录2开始,因为记录2已被分配给输入分割1.输入分割2将以记录3开始.

  • 这就是输入拆分仅是逻辑数据的原因.它指向以块为单位的起始位置和结束位置.

希望这可以帮助.

  • 为什么输入分割2和3的大小为100 MB,第一个是200 MB? (9认同)

小智 20

块是数据的物理表示.Split是Block中数据的逻辑表示.

可以在属性中更改块和拆分大小.

Map通过拆分从Block读取数据,即split作为Block和Mapper之间的代理.

考虑两个块:

第1座

aa bb cc dd ee ff gg hh ii jj

第2块

ww ee yy uu oo ii oo pp kk ll nn

现在map将块1读取到aa到JJ,并且不知道如何读取块2,即块不知道如何处理不同的信息块.这里有一个Split它将形成一个Block 1和Block 2的Logical分组作为单个Block,然后它使用inputformat和record reader形成offset(key)和line(value)并发送map来处理进一步的处理.

如果您的资源有限并且您想限制地图数量,则可以增加分割大小.例如:如果我们有640 MB的10个块,即每个64 MB的块和资源有限,那么你可以提到拆分大小为128 MB,然后形成128 MB的逻辑分组,只有5个地图将被执行,大小为128 MB.

如果我们指定分割大小为false,则整个文件将形成一个输入分割并由一个映射处理,当文件很大时需要更多时间来处理.

  • 如果块 1 在机器 1 上,块 2 在机器 2 上。假设地图在机器 1 上运行,如果分割大小是块大小的两倍。machine1 上的 map 函数是否从 machine2 获取 block2 进行处理? (2认同)
  • 是的map1从block2获取block2进行处理 (2认同)