2017-01-18 11 views
2

Я запускаю работу Spark в YARN и хотел бы получить идентификатор контейнера YARN (как часть требования о создании уникальных идентификаторов по множеству заданий Spark). Я могу увидеть метод 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 ** Карта envVarMap = System.getenv(); Set > envVarSet = envVarMap.entrySet(); for (Entry entry: envVarSet) { \t \t logger.info ("KEY = {} VALUE = {}", entry.getKey(), entry.getValue()); \t \t} –

1

здесь ниже описания, как искра магазин Контейнер ID

Спарка скрыть идентификатор контейнера и выставить Исполнитель идентификатор для каждого приложения/задания так что если вы планируете поддерживать уникальный идентификатор каждой свечу работы, мой предложение использовать идентификатор приложения, которое искра дает вам, то вы можете добавить некоторую строку, чтобы сделать уникальный для вас

ниже искровой кода от «YarnAllocator.scala»

частная [пряжи] вал executorIdToConta iner = new HashMap [String, Container]