2017-01-18 42 views
2

我正在YARN上運行Spark作業,並希望獲取YARN容器ID(作爲在一組Spark工作中生成唯一ID的要求的一部分)。我可以看到Container.getId()方法獲取ContainerId,但不知道如何從YARN獲取對當前正在運行的容器的引用。這甚至有可能嗎? YARN容器如何獲得它自己的信息?如何從容器內獲取YARN ContainerId?

回答

2

我可以得到的東西的唯一方法是使用日誌目錄。以下在火花外殼中工作。

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) 
+0

其中一些是我想要的。我用'sc.parallelize((1到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' – codeaperature

+0

+1這樣的答案。在Java中,我試圖跟隨火花1.6,CDH 5.9,它顯示我** CONTAINER_ID ** Map envVarMap = System.getenv(); Set > envVarSet = envVarMap.entrySet(); (Entry entry:envVarSet){ { \t \t \t logger.info(「KEY = {VALUE = {}」,entry.getKey(),entry.getValue()); \t \t} –

1

這裏下面介紹如何火花店集裝箱ID

星火隱藏容器的id和揭露每個應用程序/工作 所以執行ID,如果你打算保持每火花的工作的唯一ID,我建議使用應用程序ID這火花給你,那麼你可以添加自己的一些字符串,使獨特的你

下面火花代碼「YarnAllocator.scala」

私人[紗線] VAL executorIdToConta iner = new HashMap [String,Container]