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

gjmwrych  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(279)

我有四个大小分别为453mb、449mb、646mb和349mb的输入文件(csv)。所有这些构成了1.85gb的总大小。hdfs块大小为128mb。由于几乎没有20个字段,所以记录的大小非常小。mapreduce任务完成后,我可以看到我提供的输入文件使用了16个Map器:

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

ryevplcw

ryevplcw1#

Map的数量通常由输入文件中hdfs块的数量驱动。Map器的数量是根据分割的数量来计算的,但是如果文件小于分割的大小,那么每个文件将对应一个Map器。
对于每个输入文件,使用文件长度和块大小,hadoop将分割大小计算为max(minsize,min(maxsize,blocksize)),其中maxsize对应mapred.max.split.size,minsize对应mapred.min.split.size。
Map器数量=每个文件大小/inputsplitsize
这里是关于ApacheWiki上Map器和还原器数量的参考http://wiki.apache.org/hadoop/howmanymapsandreduces

ix0qys7i

ix0qys7i2#

除非您使用 CombileFileInputFormat .
假设 mapreduce.input.fileinputformat.split.minsize 以及 mapreduce.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次。一个Map器分裂,总共会产生16个Map器。也可参考此答案,了解分体式尺寸计算公式。
更新:虽然文件3有6个块,但是第6个块仍然是第5个分割的一部分。这是由政府决定的 SPLIT_SLOP 因子,默认为1.1(最后一个溢出10%的块)。

相关问题