Я запускаю работу Spark в YARN и хотел бы получить идентификатор контейнера YARN (как часть требования о создании уникальных идентификаторов по множеству заданий Spark). Я могу увидеть метод Container.getId() для получения ContainerId, но не знаю, как получить ссылку на текущий запущенный контейнер из YARN. Возможно ли это? Как контейнер YARN получает свою собственную информацию?Как получить контейнер YARN ContainerId из контейнера?
2
A
ответ
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)
1
здесь ниже описания, как искра магазин Контейнер ID
Спарка скрыть идентификатор контейнера и выставить Исполнитель идентификатор для каждого приложения/задания так что если вы планируете поддерживать уникальный идентификатор каждой свечу работы, мой предложение использовать идентификатор приложения, которое искра дает вам, то вы можете добавить некоторую строку, чтобы сделать уникальный для вас
ниже искровой кода от «YarnAllocator.scala»
частная [пряжи] вал executorIdToConta iner = new HashMap [String, Container]
Некоторые из них - это то, что я хотел. Я использовал '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
+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} –