2

我有一个 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

是否有任何方法或设置来指定在n次重试或几秒钟后任务应该失败并在另一个任务跟踪器主机中自行重新启动?

这些是我在集群中设置的一些相关的减少/超时 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)上运行。

提前致谢。

4

2 回答 2

1

一旦超过 Hadoop 0.20(您已经完成),“太多的获取失败”实际上很常见。该问题似乎与 Jetty 6 版本中的问题有关,该版本与 Hadoop 的更高版本捆绑在一起。参见MAPREDUCE-2386MAPREDUCE-2529MAPREDUCE-3851MARREDUCE-3184

有两件事似乎帮助我不再看到这种失败模式:

  1. 查找来自 Cloudera 的 Todd Lipcon的 Jetty 6 修补版本,并使用引导操作将 AWS 中的默认版本替换为修补后的二进制文件
  2. 使用引导操作将 somaxconns 从其默认值 128 增加到类似 16384 的值,并使用配置 Hadoop 引导操作将 ipc.server.listen.queue.size 设置为相同的值。

我相信 2.3.x 范围内的 AMI 使用 Jetty 7,因此如果您倾向于升级到更高版本的 Hadoop (1.0.3),那也应该有所帮助。

于 2013-09-19T02:48:27.937 回答
1

虽然我不确定,但您有兴趣了解的是在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 代替)。

抱歉,这不是确定的,但至少是一个开始的地方。

于 2013-09-19T01:07:38.043 回答