Hadoop MapReduce作业mapper未完成时reducer已运行的原因咨询
Hadoop MapReduce reducer预启动现象底层原理
你观察到的现象是Hadoop MapReduce的正常设计,入门教程里“mapper全部执行完成后reducer才能启动”是简化后的科普表述,和实际生产实现存在差异,核心逻辑如下:
- MapReduce作业的执行流程实际被拆分为Map阶段、Shuffle阶段、Reduce计算阶段三个部分,作业日志里统计的reduce进度,并不是你代码中reduce函数的执行进度,而是Shuffle阶段数据拉取动作的进度。
- 每个独立的mapper任务执行完成后,会将输出的键值对按分区排序、写入本地磁盘,不需要等待所有mapper全部跑完,只要有任意一个mapper执行完成,ApplicationMaster就会通知reducer任务启动后台拉取线程,到已完成的mapper所在节点拉取自己负责分区的对应数据,这部分拉取动作的进度会被计入reduce进度统计,所以会出现map还没跑完,reduce就已经有进度的情况。
- 真正的reduce计算逻辑,确实需要等所有mapper全部执行完成、且当前reducer已经拉取到所有mapper节点中自己负责分区的全部数据之后才会启动,这点和入门教程的表述本质一致,只是教程没有区分Shuffle预拉取和reduce计算两个阶段,才会造成认知偏差。
- 该设计的核心目的是最大化利用集群资源,将Shuffle阶段的IO等待时间和mapper的计算时间重叠,避免所有mapper跑完后reducer才开始拉取数据带来的不必要作业延迟和资源浪费。
你可以自行验证该逻辑:观察作业后续日志,当map进度达到100%后,reduce进度会先从现有百分比逐步涨到100%(完成剩余mapper的数据拉取),之后才会真正开始执行reduce函数的计算逻辑。
内容的提问来源于stack exchange,提问作者Ef Ge
相关产品推荐
相关产品推荐

