MapReduce推测执行(Speculative Execution)
请解释MapReduce的推测执行机制,它的优缺点是什么?什么场景下应该关闭推测执行?
回答
小字辈
推测执行定义: 当集群中某个Task运行明显慢于同一Job的其他Task(拖后腿任务/Straggler)时,Master会在另一个节点启动一个相同Task的副本,哪个先完成就 kill 另一个。
工作原理:
- 所有Task启动后,Master持续跟踪各Task的进度比例
- 当某个Task进度明显落后于平均水平(如差20%以上),且集群有空闲资源
- Master在该Task的数据本地的其他节点启动一个备份任务(Speculative Task)
- 原始任务和推测任务谁先完成,结果即被采用,另一个被终止
优缺点: | 优点 | 缺点 | |------|------| | 减少长尾任务的影响 | 浪费计算资源(两份计算)| | 提升Job整体完成时间 | 对集群负载有冲击 | | 对硬件差异大的集群效果好 | 可能导致数据写入冲突(写DB场景)|
应关闭推测执行的场景:
- 数据倾斜严重: 某些Task本身就处理更多数据,推测执行无意义
- 写入外部系统: 如写入HBase/MySQL,两个task同时写入同一行会导致数据错乱
- 资源紧张: 集群资源不足时,推测执行会抢占其他Job的资源
- 使用Spark: Spark没有推测执行机制(有自己的容错机制bloodline)
配置:
mapreduce.map.speculative(默认true)mapreduce.reduce.speculative(默认true)