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