有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

即使发生IOException,java作业也会成功完成

在运行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)

共 (2) 个答案

  1. # 1 楼答案

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

    在任何情况下,由于您的工作正在成功完成,您不必担心,而且它成功完成的原因是,因为当尝试打开DataOutputStream到DataNode管道时,出现一些异常,它会继续尝试,直到管道设置完毕

    异常发生在^{},下面是一些重要的代码片段供您理解

     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..
    }
    

    现在,从setupPipelineForAppendOrRecovery调用createBlockOutputStream,正如这个方法的代码注释所提到的那样——“它一直在尝试,直到建立管道为止”

    /**
     * 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>
    
  2. # 2 楼答案

    忽略它

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