如何从容器内部获取 YARN ContainerId?
How do I get the YARN ContainerId from inside the container?
我是 运行 YARN 上的 Spark 作业,想要获取 YARN 容器 ID(作为跨一组 Spark 作业生成唯一 ID 的要求的一部分)。我可以看到获取 ContainerId 的 Container.getId() 方法,但不知道如何从 YARN 获取对当前 运行 容器的引用。这可能吗? YARN 容器如何获取自己的信息?
我能得到一些东西的唯一方法是使用日志目录。以下工作在火花 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)
下面描述spark如何存储Container ID
Spark 隐藏容器 ID 并根据 application/job 公开执行程序 ID
因此,如果您打算为每个 spark 作业维护唯一 ID,我建议使用 spark 为您提供的应用程序 ID,然后您可以添加一些字符串以使您独一无二
以下来自 "YarnAllocator.scala"
的火花代码
private[yarn] val executorIdToContainer = new HashMap[String, Container]
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")
我是 运行 YARN 上的 Spark 作业,想要获取 YARN 容器 ID(作为跨一组 Spark 作业生成唯一 ID 的要求的一部分)。我可以看到获取 ContainerId 的 Container.getId() 方法,但不知道如何从 YARN 获取对当前 运行 容器的引用。这可能吗? YARN 容器如何获取自己的信息?
我能得到一些东西的唯一方法是使用日志目录。以下工作在火花 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)
下面描述spark如何存储Container ID
Spark 隐藏容器 ID 并根据 application/job 公开执行程序 ID 因此,如果您打算为每个 spark 作业维护唯一 ID,我建议使用 spark 为您提供的应用程序 ID,然后您可以添加一些字符串以使您独一无二
以下来自 "YarnAllocator.scala"
的火花代码private[yarn] val executorIdToContainer = new HashMap[String, Container]
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")