【问题标题】:Duplicated tasks get killed重复的任务被杀死
【发布时间】:2013-05-27 14:50:04
【问题描述】:
在我将作业提交到 Hadoop 集群后,作业输入在节点之间进行拆分,我可以看到一些任务得到了两次并行运行的尝试。
例如在节点 39 开始任务尝试 attempt_201305230321_0019_m_000073_0,并在 3 分钟后在节点 25 启动 attempt_201305230321_0019_m_000073_1。在另外 4 分钟内,第一次尝试 (attempt_201305230321_0019_m_000073_0) 被杀死(没有任何通知,日志不包含任何信息),第二次尝试是半小时后顺利完成。
发生了什么?如何防止创建重复尝试?这些重复的尝试是否有可能导致神秘的杀戮?
【问题讨论】:
标签:
hadoop
mapreduce
hadoop-streaming
【解决方案1】:
您是否打开了投机执行?您可以使用以下代码来防止它:
job.getConfiguration().setBoolean(
"mapred.map.tasks.speculative.execution", false);
job.getConfiguration().setBoolean(
"mapred.reduce.tasks.speculative.execution", false);
以下是来自Hadoop document 的关于推测执行的定义:
推测性执行:Hadoop 系统的一个问题是,通过将任务划分到多个节点上,一些速度较慢的节点可能会限制程序其余部分的速率。例如,如果一个节点有一个慢速磁盘控制器,那么它读取其输入的速度可能仅为所有其他节点的 10%。所以当 99 个 map 任务已经完成时,系统还在等待最后一个 map 任务的签入,这比其他所有节点都需要更长的时间。
通过强制任务彼此隔离运行,单个任务不知道它们的输入来自哪里。任务信任 Hadoop 平台来提供适当的输入。因此,相同的输入可以并行处理多次,以利用机器能力的差异。由于作业中的大多数任务即将结束,Hadoop 平台将在几个没有其他工作要执行的节点上安排剩余任务的冗余副本。这个过程被称为推测执行。当任务完成时,他们会向 JobTracker 宣布这一事实。无论哪个任务副本首先完成,都将成为最终副本。如果其他副本是推测性地执行,Hadoop 会告诉 TaskTracker 放弃任务并丢弃它们的输出。然后,Reducers 首先从成功完成的 Mapper 接收输入。
默认情况下启用推测执行。您可以通过将 mapred.map.tasks.speculative.execution 和 mapred.reduce.tasks.speculative.execution JobConf 选项分别设置为 false 来禁用映射器和化简器的推测执行。