当对多个输入文件完成 mapreduce 任务时,hadoop 如何确定映射器或输入拆分的数量?

How does the hadoop fix the number of mappers or Input splits when mapreduce task is done over multiple input files?

我有四个输入文件 (CSV),大小分别为 453MB、449MB、646MB 和 349MB。所有这些构成了 1.85GB 的总大小。 HDFS 块大小为 128MB。 记录大小非常小,因为几乎没有 20 个字段。 完成 mapreduce 任务后,我可以观察到 16 个映射器已用于我提供的输入文件:

我想知道 hadoop 如何确定多个输入文件的映射器或输入拆分的数量?

地图的数量通常由输入文件中的 HDFS 块数量决定。 Mappers 的数量是根据拆分的数量计算的,但是如果文件小于拆分大小,则每个文件将对应一个 mapper。

对于每个输入文件,根据文件长度和块大小,hadoop 将分割大小计算为 max(minSize, min(maxSize, blockSize)) 其中 maxSize 对应于 mapred.max.split.size,minSize 为 mapred.min.split.size.

没有。映射器=每个文件大小/inputSplitSize

这里是关于 apache wiki 上映射器和缩减器数量的参考 http://wiki.apache.org/hadoop/HowManyMapsAndReduces

除非您使用 CombileFileInputFormat.

,否则每个文件都会单独进行拆分(基于拆分大小)

假设 mapreduce.input.fileinputformat.split.minsizemapreduce.input.fileinputformat.split.maxsize 属性处于默认状态。那么拆分大小将大约等于 dfs.blocksize.

所以,在这种情况下

File 1: 453MB = 4 splits 
File 2: 449MB = 4 splits
File 3: 646MB = 5 splits (boundary being very close ~640MB)
File 4: 349MB = 3 splits

总共16个拆分。每次拆分一个映射器,总共会生成 16 个映射器。另请参阅此 以获取拆分大小计算公式。

更新:虽然文件 3 有 6 个块,但第 6 个块将保留为第 5 个分割的一部分。这由 SPLIT_SLOP 因素决定,默认情况下为 1.1(最后一个溢出 10% 的块)。