最近我正在运行一些基准来了解Giraph中的故障转移机制。
其实我很好奇;当一个工作的工人变慢,其他工人就会等待它。后来我在GiraphJob.java
中找到了类似的东西:
// Speculative execution doesn't make sense for Giraph
giraphConfiguration.setBoolean("mapred.map.tasks.speculative.execution", false);
有谁知道为什么Giraph没有启用推测执行?
由于
答案 0 :(得分:1)
首先让我们回想一下投机执行是什么。引自Yahoo's Hadoop tutorial:
推测执行: Hadoop系统的一个问题是,通过将任务划分到多个节点,可能会有一些慢节点对程序的其余部分进行速率限制。例如,如果一个节点具有慢速磁盘控制器,那么它可能仅以所有其他节点的速度的10%读取其输入。因此,当99个地图任务已经完成时,系统仍在等待最终的地图任务检入,这比所有其他节点花费的时间要长得多。 通过强制任务彼此隔离运行,各个任务不知道其输入来自何处。任务信任Hadoop平台,只提供适当的输入。因此,可以并行多次处理相同的输入,以利用机器能力的差异。由于作业中的大多数任务即将结束,Hadoop平台将在几个节点上安排剩余任务的冗余副本,这些节点没有其他工作要执行。此过程称为推测执行。任务完成后,他们会向JobTracker宣布这一事实。任务的任何副本首先完成即成为最终副本。如果其他副本以推测方式执行,Hadoop会告诉TaskTrackers放弃任务并丢弃其输出。然后,Reducers首先从成功完成的Mapper接收输入。 默认情况下启用推测执行。您可以通过将mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution JobConf选项分别设置为false来禁用映射器和缩减器的推测执行
如果我让Giraph正确,他们就不会使用推测性执行,因为他们使用自己的迭代计算范例,而这种范式并不适合。这种模式的灵感来自google&#39 ; s pregel,它为数据提供了更多的以图形为中心的视图。此外,通过检查点创建容错,这意味着每次迭代(也称为超级步骤)计算每个图节点的所有传入消息,然后在节点之间分配消息。
简单地说MapReduce并没有以原始的方式使用,因此对giraph的推测性执行毫无意义。