【问题标题】:Reducer stuck due to dead host由于主机死机,减速机卡住
【发布时间】:2012-08-13 19:39:54
【问题描述】:

我注意到我的减速器由于主机死机而卡住了。在日志上,它显示了很多重试消息。是否可以告诉作业跟踪器放弃死节点并恢复工作?有 323 个映射器,只有 1 个减速器。我在 hadoop-1.0.3 上。

2012-08-08 11:52:19,903 INFO org.apache.hadoop.mapred.ReduceTask: 192.168.1.23 Will be considered after: 65 seconds.
2012-08-08 11:53:19,905 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 Need another 63 map output(s) where 0 is already in progress
2012-08-08 11:53:19,905 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 Scheduled 0 outputs (1 slow hosts and0 dup hosts)
2012-08-08 11:53:19,905 INFO org.apache.hadoop.mapred.ReduceTask: Penalized(slow) Hosts: 
2012-08-08 11:53:19,905 INFO org.apache.hadoop.mapred.ReduceTask: 192.168.1.23 Will be considered after: 5 seconds.
2012-08-08 11:53:29,906 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 Scheduled 1 outputs (0 slow hosts and0 dup hosts)
2012-08-08 11:53:47,907 WARN org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 copy failed: attempt_201207191440_0203_m_000001_0 from 192.168.1.23
2012-08-08 11:53:47,907 WARN org.apache.hadoop.mapred.ReduceTask: java.net.NoRouteToHostException: No route to host
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
    at java.net.Socket.connect(Socket.java:546)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:173)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:409)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:240)
    at sun.net.www.http.HttpClient.New(HttpClient.java:321)
    at sun.net.www.http.HttpClient.New(HttpClient.java:338)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:935)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:876)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:801)
    at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getInputStream(ReduceTask.java:1618)
    at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.setupSecureConnection(ReduceTask.java:1575)
    at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1483)
    at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1394)
    at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1326)

2012-08-08 11:53:47,907 INFO org.apache.hadoop.mapred.ReduceTask: Task attempt_201207191440_0203_r_000000_0: Failed fetch #18 from attempt_201207191440_0203_m_000001_0
2012-08-08 11:53:47,907 WARN org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 adding host 192.168.1.23 to penalty box, next contact in 1124 seconds
2012-08-08 11:53:47,907 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0: Got 1 map-outputs from previous failures
2012-08-08 11:54:22,909 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 Need another 63 map output(s) where 0 is already in progress
2012-08-08 11:54:22,909 INFO org.apache.hadoop.mapred.ReduceTask: attempt_201207191440_0203_r_000000_0 Scheduled 0 outputs (1 slow hosts and0 dup hosts)
2012-08-08 11:54:22,909 INFO org.apache.hadoop.mapred.ReduceTask: Penalized(slow) Hosts: 
2012-08-08 11:54:22,909 INFO org.apache.hadoop.mapred.ReduceTask: 192.168.1.23 Will be considered after: 1089 seconds.

我不理会它,它重试了一段时间,然后放弃了死主机并重新运行映射器并成功。这是由主机上寻址的两个 ip 引起的,我故意关闭了一个 ip,这是一个 hadoop 使用。

我的问题是有没有办法告诉hadoop放弃死主机而不重试。

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    从您的日志中,您可以看到其中一个运行地图任务的 tasktracker 无法连接。运行 reducer 的 tasktracker 试图通过 HTTP 协议检索 map 中间结果,它失败了,因为有结果的 tasktracker 已经死了。

    tasktracker 失败的默认行为是这样的:

    jobtracker 安排在失败的 tasktracker 上运行并成功完成的 map 任务如果属于未完成的作业,则重新运行,因为它们的中间输出驻留在失败的 tasktracker 的本地文件系统上,reduce 任务可能无法访问它们。任何正在进行的任务也会重新安排。

    问题是,如果一个任务(无论是 map 还是 reduce)失败太多次(我认为是 4 次),它将不再被重新安排,并且作业将会失败。 在您的情况下,映射似乎已成功完成,但减速器无法连接到映射器并检索中间结果。它尝试了 4 次,然后作业失败。

    不能完全忽略失败的任务,因为它是作业的一部分,除非作业包含的所有任务都成功,否则作业本身不会成功。

    尝试找到reducer试图访问的链接并将其复制到浏览器中以查看您得到的错误。

    您还可以将某个节点列入黑名单并将其从 Hadoop 使用的节点列表中完全排除:

      In conf/mapred-site.xml
    
      <property>
         <name>mapred.hosts.exclude</name>
         <value>/full/path/of/host/exclude/file</value>
      </property>
    
      To reconfigure nodes.
    
      /bin/hadoop mradmin -refreshNodes
    

    【讨论】:

    • 谢谢!就我而言,我不理会它,它重试了一段时间,然后放弃了死主机并重新运行映射器并成功。这是由主机上的两个 ip 地址引起的,我故意关闭了一个 ip,这是 hadoop 使用的一个。我的问题是有没有办法告诉hadoop放弃死主机而不重试。
    • 如果这确实是 Hadoop 的预期行为,这令人非常不满意。硬件总是出问题。 Hadoop 旨在抵御硬件故障。当作业因有限的硬件故障而失败时,这表明 Hadoop 存在设计缺陷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2019-10-07
    • 2018-03-22
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多