如何从容器内部获取YARN ContainerId?

时间:2017-01-18 16:18:23

标签: hadoop apache-spark yarn

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

3 个答案:

答案 0 :(得分:3)

我能获得某些东西的唯一方法是使用日志记录目录。以下工作在火花壳中。

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)

答案 1 :(得分:1)

下面将介绍spark如何存储Container ID

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

来自" YarnAllocator.scala"

的火花代码

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

答案 2 :(得分:0)

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")