让我们考虑一下当我更改映射器中的计数器值并希望在reducer中使用该信息时的情况。
看起来我们保证在所有映射器完成之前不会调用reduce函数。这是否考虑了正在进行推测性执行的映射器?由于投机执行,reducer可以看到无关的值吗?
答案 0 :(得分:2)
Reducers的执行时间由配置参数确定:mapreduce.job.reduce.slowstart.completedmaps
(在mapred-site.xml中)。默认设置为“0.05”。这意味着,当大约5%的Mapper完成时,Reducers计划执行。
您可以调整此参数以获得不同的结果。对于例如将其设置为“1.0”将确保只有在100%的Mappers完成后才会启动Reducers。
Redcuer任务将开始从已完成执行的映射器复制数据。但是,只有当所有映射器的数据都被reducer复制时,才会调用reduce()
方法。
此链接:When do reduce tasks start in Hadoop?,清楚地解释了此过程。
至于推测性执行,它仅在Mappers / Reducers的情况下被触发,与其他Mappers / Reducers相比,它们落后。 如果同一个Mapper实例重复执行,则并不意味着计数器也是重复的。为每个任务尝试维护任务计数器。如果任务尝试失败或被杀死(由于推测性执行),则会丢弃该尝试的计数器。因此,投机执行不会对整体计数器价值产生影响。
您必须记住的一件事是,只有在作业成功完成后,计数器值才是最终的。