如何使hadoop任务在太多的数据获取失败后尝试失败?

7bsow1i6  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(368)

我有一个hadoop reduce任务尝试,它永远不会失败或完成,除非我手动失败/终止它。
当task tracker节点(由于我仍在调查的网络问题)失去与其他task tracker/data节点的连接,而不是与job tracker的连接时,问题就会浮出水面。
基本上,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

是否有任何方法或设置来指定在n次重试或秒之后,任务应该失败并在另一个task tracker主机中自行重新启动?
以下是我在集群中设置的一些相关reduce/timeout 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)。
提前谢谢。

csbfibhn

csbfibhn1#

一旦您超过hadoop0.20(您已经做到了),实际上“太多的获取失败”是很常见的。这个问题似乎与jetty6版本中的一个问题有关,该版本与hadoop的更高版本捆绑在一起。见mapreduce-2386、mapreduce-2529、mapreduce-3851、marreduce-3184。
有两件事似乎帮助我不再看到这种失败模式:
寻找来自cloudera的toddlipcon的jetty6补丁版本,并使用引导操作将aws的默认版本替换为补丁的二进制文件
使用引导操作将somaxconns从默认值128增加到类似16384的值,并使用configure hadoop引导操作将ipc.server.listen.queue.size设置为相同的值。
我相信2.3.x版本的amis使用的是jetty7,因此如果您想升级到hadoop的更高版本(1.0.3),这也会有所帮助。

p4tfgftt

p4tfgftt2#

虽然我不确定,但您感兴趣的理解是在 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)。
抱歉,这不是决定性的,但至少是一个开始。

相关问题