我有一个 hadoop reduce 任务尝试,除非我手动失败/终止它,否则它永远不会失败或完成。
当任务跟踪器节点(由于我仍在调查的网络问题)与其他任务跟踪器/数据节点失去连接但与作业跟踪器失去连接时,问题就会出现。
基本上,由于超时问题,reduce 任务无法从其他数据节点获取必要的数据,并将它们列入黑名单。到目前为止,一切都很好,黑名单是预期和需要的,问题是它会在几个小时内不断重试相同的黑名单主机(尊重它似乎是指数退避算法),直到我手动杀死它。最近一次长时间运行的任务重试时间已超过 9 小时。
我在日志中看到数百条类似的消息:
2013-09-09 22:34:47,251 WARN org.apache.hadoop.mapred.ReduceTask (MapOutputCopier attempt_201309091958_0004_r_000044_0.1): attempt_201309091958_0004_r_000044_0 copy failed: attempt_201309091958_0004_m_001100_0 from X.X.X.X
2013-09-09 22:34:47,252 WARN org.apache.hadoop.mapred.ReduceTask (MapOutputCopier attempt_201309091958_0004_r_000044_0.1): java.net.SocketTimeoutException: connect timed out
是否有任何方法或设置可以指定在重试或秒后任务应失败并在另一个任务跟踪器主机中自行重新启动?
这些是我在集群中设置的一些相关的减少/超时 Hadoop 集群参数:
<property><name>mapreduce.reduce.shuffle.connect.timeout</name><value>180000</value></property>
<property><name>mapreduce.reduce.shuffle.read.timeout</name><value>180000</value></property>
<property><name>mapreduce.reduce.shuffle.maxfetchfailures</name><value>10</value></property>
<property><name>mapred.task.timeout</name><value>600000</value></property>
<property><name>mapred.jobtracker.blacklist.fault-timeout-window</name><value>180</value></property>
<property><name>mapred.healthChecker.script.timeout</name><value>600000</value></property>
顺便说一句,此作业在 AWS EMR 集群上运行(Hadoop 版本:0.20.205)。
提前致谢。
最佳答案
虽然我不确定,但您有兴趣了解的是在 org.apache.hadoop.mapred.ReduceTask.ReduceCopier
类中实现的,特别是如果您查看源代码对于该类的构造函数:
this.abortFailureLimit = Math.max(30, numMaps / 10);
this.maxFetchFailuresBeforeReporting = conf.getInt(
"mapreduce.reduce.shuffle.maxfetchfailures", REPORT_FAILURE_LIMIT);
this.maxFailedUniqueFetches = Math.min(numMaps,
this.maxFailedUniqueFetches);
您会注意到这是您已经列出的配置值之一 - mapreduce.reduce.shuffle.maxfetchfailures
。您是否尝试过将其设置为较小的值(1 或 0),这是否会产生所需的功能?
您还可以使用mapreduce.reduce.shuffle.connect.timeout
降低连接超时(同样,您的问题中也提到了这一点)。尝试降低该值以更快地引发连接超时(180000 是 3 分钟,请尝试使用 30000)。
抱歉,这不是确定的,但至少是一个起点。
关于hadoop - 如何在多次数据获取失败后使 hadoop 任务尝试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768810/