Hadoop MapReduce:Map与Reduce任务数量的判定规则及阈值问题咨询
这个问题我之前帮不少同行排查过,咱们把Map和Reduce任务的数量规则拆开来说,就一目了然了:
Map任务数量的判定逻辑
Map任务的数量完全由输入数据的分片(InputSplit)数量决定,而分片的大小由三个核心配置参数共同计算:
dfs.blocksize:HDFS的默认块大小,Hadoop 2.x版本默认128MB,3.x版本默认256MBmapreduce.input.fileinputformat.split.minsize:分片的最小阈值,默认值为1字节mapreduce.input.fileinputformat.split.maxsize:分片的最大阈值,默认等于dfs.blocksize
分片大小的计算公式是:
分片大小 = max(最小分片大小, min(最大分片大小, HDFS块大小))
每个分片会对应启动一个Map任务,这就是你看到差异的原因:
- 如果文件大小 ≤ 分片大小,哪怕只有几KB,也会生成1个Map任务(因为单个文件至少对应一个分片)
- 如果文件大小是分片大小的N倍(比如分片128MB,文件512MB),就会被拆成4个分片,对应4个Map任务
补充个小细节:如果使用了CombineTextInputFormat这类特殊输入格式,它会把多个小文件合并成一个分片,减少Map任务数,但默认的TextInputFormat是严格按上面的规则分片的。
Reduce任务数量的判定逻辑
Reduce任务的数量和输入数据大小没有直接关联,主要由两种方式决定:
- 手动指定:通过配置参数
mapreduce.job.reduces设置,默认值是1——这就是你所有任务都只有1个Reduce的原因 - 自动调整:部分Hadoop版本支持根据集群资源、输出数据量自动计算Reduce数量,但默认是关闭的,所以绝大多数场景下都是使用手动指定的数值
关于任务阈值的问题
- 对于Map任务:确实存在阈值,也就是我们上面说的分片大小。当文件大小超过分片大小的整数倍时,就会自动拆分出更多分片,进而触发更多Map任务。比如分片大小128MB,一个130MB的文件会被拆成2个分片(128MB + 2MB),对应2个Map任务。
- 对于Reduce任务:默认没有自动触发的阈值,除非你开启了自动调整的相关配置,否则Reduce任务数始终是你指定的数值(默认1)。
如果需要调整任务数量,可以参考这些小技巧:
- 想增加Map任务数:调小
mapreduce.input.fileinputformat.split.maxsize参数 - 想减少Map任务数:调大
mapreduce.input.fileinputformat.split.minsize,或者使用CombineTextInputFormat合并小文件 - 想调整Reduce任务数:直接修改
mapreduce.job.reduces参数即可
内容的提问来源于stack exchange,提问作者Sea Star
相关产品推荐
相关产品推荐

