我有四个大小分别为453MB,449MB,646MB和349MB的输入文件(CSV)。所有这些构成总大小为1.85GB。 HDFS块大小为128MB。 记录大小非常少,因为几乎没有20个字段。 完成mapreduce任务后,我可以观察到16个映射器已用于我提供的输入文件:
我想知道hadoop如何确定多个输入文件的映射器数量或输入拆分数?
答案 0 :(得分:2)
除非您使用CombileFileInputFormat
,否则每个文件都会单独进行拆分(基于拆分大小)。
假设docker-compose build --no-cache && docker-compose restart
和mapreduce.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数量的参考