7

参数“mapred.min.split.size”改变了之前写入文件的块的大小?假设我在启动 JOB 时传递了值为 134217728 (128MB) 的参数“mapred.min.split.size”。关于发生的事情说什么是正确的?

1 - 每个 MAP 进程相当于 2 个 HDFS 块(假设每个块 64MB);

2 - 我的输入文件(以前包括HDFS)将有一个新的划分来占用HDFS 128M中的块;

4

3 回答 3

32

分割大小由以下公式计算:-

max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size))

在您的情况下,它将是:-

split size=max(128,min(Long.MAX_VALUE(default),64))

所以上面的推论: -

  1. 每个地图将处理 2 个 hdfs 块(假设每个块 64MB):True

  2. 我的输入文件(以前包括 HDFS)会有一个新的分区来占用 HDFS 128M 中的块:False

但是使最小拆分大小大于块大小会增加拆分大小,但会以局部性为代价。

于 2013-10-05T09:12:47.757 回答
1

假设最小分割大小定义为 128mb,最小块大小定义为 64mb。

注意:默认情况下,HDFS 会将每个块复制到 3 个不同的数据节点。此外,每个地图任务都在单个块上执行其操作。

因此,128mb 的拆分大小会将 2 个块视为一个块,并为其创建一个将在单个数据节点上运行的映射任务。这是以数据局部性为代价的。通过“数据局部性成本”,我指的是驻留在未运行地图任务的数据节点上的块。必须从该数据节点获取并在运行地图任务的数据节点上进行处理,从而导致性能降低。

但是,如果我们考虑一个大小为 128mb 的文件,默认块大小为 64mb,默认最小分割大小为 64mb,那么在这种情况下,通常会为每个 64mb 块创建两个映射任务。

于 2015-08-06T06:50:07.233 回答
0

我已经尝试使用提供的公式,其中我的块大小为 128 MB,但结果没有按预期出现。我想出了下面的公式,但它没有任何意义,但它每次都给我正确的结果。

min(mapred.min.split.size, max(mapred.max.split.size, dfs.block.size))
于 2021-09-16T07:45:43.897 回答