【问题标题】:Jobs finishing successfully even though IOException occurs即使发生 IOException,作业也成功完成
【发布时间】:2016-03-18 16:45:43
【问题描述】:

在运行 GridMix 时,我在主节点上收到各种 IOException,我想知道这是我应该真正关心的问题,还是我的工作成功完成时的暂时性问题:

IOException: Bad connect ack with firstBadLink: \
java.io.IOException: Bad response ERROR for block BP-49483579-10.0.1.190-1449960324681:blk_1073746606_5783 from datanode 10.0.1.192:50010
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer$ResponseProcessor.run(DFSOutputStream.java:819)

【问题讨论】:

  • 如果它有效,我会忽略它。但请注意不要忽略以后可能会导致问题的类似异常。
  • 这些是由于网络或数据节点中的暂时性错误还是永久性错误,我应该尝试修复它们吗?

标签: java hadoop hdfs hadoop-yarn ioexception


【解决方案1】:

在了解您的完整设置之前,我无法确定,但很有可能这些异常是在附加到管道设置时发生的,就代码而言,您可以说stage == BlockConstructionStage.PIPELINE_SETUP_APPEND

在任何情况下,由于您的工作已成功完成,您不必担心,为什么它会成功完成是因为尝试打开 DataOutputStream 到 DataNode 管道时会发生一些异常它一直在尝试,直到建立管道。

异常发生在org.apache.hadoop.hdfs.DFSOutputStream,下面是重要的代码sn-ps,供大家理解。

 private boolean createBlockOutputStream(DatanodeInfo[] nodes, long newGS, boolean recoveryFlag) {
    //Code..
    if (pipelineStatus != SUCCESS) {
      if (pipelineStatus == Status.ERROR_ACCESS_TOKEN) {
        throw new InvalidBlockTokenException(
            "Got access token error for connect ack with firstBadLink as "
                + firstBadLink);
      } else {
        throw new IOException("Bad connect ack with firstBadLink as "
            + firstBadLink);
      }
    }
    //Code..
}

现在,createBlockOutputStream 是从 setupPipelineForAppendOrRecovery 调用的,正如此方法的代码注释所提到的 - “它会一直尝试直到设置管道”。

/**
 * Open a DataOutputStream to a DataNode pipeline so that 
 * it can be written to.
 * This happens when a file is appended or data streaming fails
 * It keeps on trying until a pipeline is setup
 */
private boolean setupPipelineForAppendOrRecovery() throws IOException {
    //Code..
    while (!success && !streamerClosed && dfsClient.clientRunning) {
        //Code..
        success = createBlockOutputStream(nodes, newGS, isRecovery);
    }
    //Code..
}

如果您仔细阅读完整的 org.apache.hadoop.hdfs.DFSOutputStream 代码,您将了解管道设置试验将继续进行,直到创建管道以供追加或重新使用。

如果你想处理它,那么你可以尝试从hdfs-site.xml 调整dfs.datanode.max.xcievers 属性,最多人报告相同的解决方案。请注意,设置属性后,您需要重新启动 hadoop 服务。

<property>
        <name>dfs.datanode.max.xcievers</name>
        <value>8192</value>
</property>

【讨论】:

  • 这些是由于网络或数据节点中的暂时性错误还是永久性错误,我应该尝试修复它们吗?
  • 所以我使用的开源代码在hdfs-site.xml 中没有dfs.datanode.max.xcievers 属性,我应该添加它吗?
  • 这可能是因为网络或可能是因为最大数量的节点可用性。尝试添加和属性并设置本文中提到的dfs.datanode.max.transfer.threads - groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/… .. 这篇文章说他们在这些方面得到了帮助,但问题又回来了,所以我想说很有可能是网络问题.. 在任何情况下案例我认为你不会因为hadoop重试机制而对功能产生影响,所以你应该很好..
【解决方案2】:

忽略它?

try {
  ...
} catch (IOException iox) {
  //***NOP***
}

【讨论】:

  • OP 已经表示她的工作即将完成,但她想知道她是否应该对此感到担忧。
  • 我认为她应该。
猜你喜欢
  • 1970-01-01
  • 2014-11-21
  • 2020-11-28
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多