重复的任务被杀死

时间:2013-05-27 14:50:05

标签: hadoop mapreduce hadoop-streaming

在我向Hadoop集群提交作业并在节点之间分配作业输入后,我可以看到某些任务会并行运行两次尝试。

E.g。在节点39处启动任务尝试attempt_201305230321_0019_m_000073_0并在3分钟内在节点25处启动attempt_201305230321_0019_m_000073_1。在另外4分钟内,第一次尝试(attempt_201305230321_0019_m_000073_0)被杀死(没有任何通知,日志包含否信息)和第二次尝试在半小时内成功完成。

发生了什么事?如何防止创建重复尝试?这些重复的尝试是否可能导致神秘的杀戮?

1 个答案:

答案 0 :(得分:3)

您是否打开了投机执行?您可以使用以下代码来阻止它:

job.getConfiguration().setBoolean(                                                                                                                 
                "mapred.map.tasks.speculative.execution", false);                                                                                          
job.getConfiguration().setBoolean(                                                                                                                 
                "mapred.reduce.tasks.speculative.execution", false);  

以下是Hadoop document推测执行的定义:

推测执行:Hadoop系统的一个问题是,通过将任务划分到多个节点,一些慢节点可能对程序的其余部分进行速率限制。例如,如果一个节点具有慢速磁盘控制器,那么它可能仅以所有其他节点的速度的10%读取其输入。因此,当99个地图任务已经完成时,系统仍在等待最终的地图任务检入,这比其他所有节点都要长得多。

通过强制任务彼此隔离运行,各个任务不知道其输入来自何处。任务信任Hadoop平台,只提供适当的输入。因此,可以并行多次处理相同的输入,以利用机器能力的差异。由于作业中的大多数任务即将结束,Hadoop平台将在几个节点上安排剩余任务的冗余副本,这些节点没有其他工作要执行。此过程称为推测执行。任务完成后,他们会向JobTracker宣布这一事实。任务的任何副本首先完成即成为最终副本。如果其他副本以推测方式执行,Hadoop会告诉TaskTrackers放弃任务并丢弃其输出。然后,Reducers首先从成功完成的Mapper接收输入。

默认情况下启用推测执行。您可以通过将mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution JobConf选项分别设置为false来禁用映射器和缩减器的推测执行。

相关问题