问题
MapReduce模型将一个作业分解为多个任务并行执行,以缩短执行时间。这种模型的特点是,整个作业的运行时间由最后完成的一个任务决定。如果少数任务运行缓慢,则会影响作业的整体进度。
推测执行
任务运行缓慢的原因有很多,很难检测到具体原因。Hadoop提供了一种优化措施,当检测到某个任务运行缓慢时,Hadoop会启动另一个与该任务完全相同的任务,并最终选用最先成功运行完成任务的计算结果作为最终结果。
适用场景
集群机器处理能力存在明显差异时,比如某台机器硬件老化、负载过高,或者Docker机所在的宿主机超卖严重等等。实际上,集群规模越大,这些情况出现的概率会越大。
不适用场景
- 任务之间存在固有的不均衡特点,比如数据倾斜等;
- Map/Reduce任务处理逻辑非幂等;
配置参数
推测执行可以配置为集群维度的,也可以配置为作业或者Map/Reduce维度的。实际生产中,建议集群维度开启推测执行。需要注意的是,当推测执行的任务过多时会影响整个集群的吞吐量。个人建议,有自研能力的功能不妨可以尝试针对作业的优先级设置是否开启推测执行,而不是整个集群。
检测策略
某个任务的运行时间超过整个作业的平均运行时间某个阈值,并且该任务自身运行时间超过某个阈值。
参考: