当mapreduce任务在多个输入文件上完成时,hadoop如何修复映射器数量或输入拆分?

时间:2017-03-01 09:30:54

标签: hadoop mapreduce hdfs hadoop2

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

除非您使用CombileFileInputFormat,否则每个文件都会单独进行拆分(基于拆分大小)。

假设docker-compose build --no-cache && docker-compose restartmapreduce.input.fileinputformat.split.minsize属性处于默认状态。然后,分割大小将近似等于mapreduce.input.fileinputformat.split.maxsize

所以,在这种情况下

dfs.blocksize

共有16个分裂。每次拆分一个映射器,将产生总共16个映射器。另请参阅此answer以了解拆分大小计算公式。

UPDATE:虽然文件3有6个块,但第6个块仍然是第5个分割的一部分。这由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 因子决定,默认为1.1(最后一个块溢出10%)。

答案 1 :(得分:0)

映射数通常由输入文件中的HDFS块数驱动。 Mapper数量是根据拆分数计算的,但是如果文件小于拆分大小,那么每个文件将对应一个映射器。

对于每个输入文件,使用文件长度,块大小,hadoop计算拆分大小为max(minSize,min(maxSize,blockSize))其中maxSize对应于mapred.max.split.size并且minSize是mapred。 min.split.size。

没有。 of mappers =每个文件大小/ inputSplitSize

以下是关于apache wiki http://wiki.apache.org/hadoop/HowManyMapsAndReduces

上的Mapper和reducers数量的参考