如何从容器中获取Yarn容器ID?

2nbm6dog  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(620)

我正在对yarn运行spark作业,并希望获得yarn容器id(作为跨一组spark作业生成唯一id的要求的一部分)。我可以看到container.getid()方法来获取containerid,但不知道如何从中获取对当前正在运行的容器的引用。这有可能吗?Yarn容器如何获得自己的信息?

zte4gxcn

zte4gxcn1#

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

scyqe7ek2#

下面介绍spark如何存储容器id
spark隐藏容器id并公开每个应用程序/作业的执行器id,因此如果您计划维护每个spark作业的唯一id,我建议使用spark提供给您的应用程序id,然后您可以添加一些字符串以使其为您唯一
下面是“yarnallocator.scala”的Spark代码
private[yarn]val executoridtocontainer=new hashmap[string,container]

7gcisfzg

7gcisfzg3#

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

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)

相关问题