【问题标题】:How do I get the YARN ContainerId from inside the container?如何从容器内获取 YARN ContainerId?
【发布时间】:2018-05-31 00:07:35
【问题描述】:

我正在 YARN 上运行 Spark 作业,并希望获取 YARN 容器 ID(作为跨一组 Spark 作业生成唯一 ID 的要求的一部分)。我可以看到 Container.getId() 方法来获取 ContainerId 但不知道如何从 YARN 获取对当前正在运行的容器的引用。这甚至可能吗? YARN 容器如何获取自己的信息?

【问题讨论】:

    标签: hadoop apache-spark hadoop-yarn


    【解决方案1】:

    我能得到一些东西的唯一方法是使用日志目录。以下在 spark shell 中工作。

    import org.apache.hadoop.yarn.api.records.ContainerId
    
    def f(): String = {
      val localLogDir: String = System.getProperty("spark.yarn.app.container.log.dir")
      val containerIdString: String = localLogDir.split("/").last
      val containerIdLong: Long = ContainerId.fromString(containerIdString).getContainerId
      containerIdLong.toHexString
    }
    
    val rdd1 = sc.parallelize((1 to 10)).map{ _ => f() }
    rdd1.distinct.collect().foreach(println)
    

    【讨论】:

    • 其中一些是我想要的。我使用了sc.parallelize((1 to 10)).map{ _ => System.getProperty("spark.yarn.app.container.log.dir") }.distinct.collect().foreach(println),并给出了类似(1行粘贴)/var/log/hadoop-yarn/container/application_1504924099862_7571/container_e16_1504924099862_7571_01_000005
    • +1 为答案。在 Java 中,我尝试关注 spark 1.6、CDH 5.9,它显示了 CONTAINER_ID Map envVarMap = System.getenv(); Set> envVarSet = envVarMap.entrySet(); for(Entry entry : envVarSet) { logger.info("KEY={} VALUE={}",entry.getKey(),entry.getValue()); }
    【解决方案2】:

    下面描述 spark 如何存储 Container ID

    Spark 隐藏容器 ID 并公开每个应用程序/作业的执行程序 ID 因此,如果您打算维护每个 spark 作业的唯一 id,我建议使用 spark 为您提供的应用程序 id,然后您可以添加一些字符串以使您独一无二

    以下来自“YarnAllocator.scala”的火花代码

    private[yarn] val executorIdToContainer = new HashMap[String, Container]

    【讨论】:

      【解决方案3】:

      YARN 将导出此处列出的所有环境变量:https://github.com/apache/hadoop/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java#L117

      所以你应该可以像这样访问它:

      sys.env.get(ApplicationConstants.Environment.CONTAINER_ID.toString)
      // or, equivalently
      sys.env.get("CONTAINER_ID")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2016-06-21
        相关资源
        最近更新 更多