Знает ли владелец EMR node свой идентификатор кластера?
Я хочу иметь возможность создавать кластеры EMR и для этих кластеров отправлять сообщения обратно в некоторую центральную очередь. Чтобы это сработало, мне нужно, чтобы какой-то агент работал на каждом master node. Каждому из этих агентов придется идентифицировать себя в этом сообщении, чтобы получатель знал, в каком кластере это сообщение.
Знает ли мастер node его id (j- *****)? Если нет, то есть ли другая часть идентифицирующей информации, которая могла бы позволить получателю сообщения вывести этот идентификатор?
Я просмотрел конфигурационные файлы в /home/hadoop/conf, и я не нашел ничего полезного. Я нашел id в /mnt/var/log/instance -controller/instance-controller.log, но похоже, что будет сложно выполнить grep. Мне интересно, где экземпляр-контроллер может получить этот идентификатор в первую очередь.
Ответы
Ответ 1
Вы можете посмотреть /mnt/var/lib/info/
на Master node, чтобы найти много информации о вашей настройке кластера EMR. Более конкретно /mnt/var/lib/info/job-flow.json
содержит jobFlowId или ClusterID.
Вы можете использовать предварительно установленный json-парсер (jq
), чтобы получить идентификатор задания.
cat /mnt/var/lib/info/job-flow.json | jq -r ".jobFlowId"
(обновлено согласно @Marboni)
Ответ 2
Вы можете использовать API Amazon EC2 для определения. В приведенном ниже примере для упрощения используются команды оболочки. В реальной жизни вы должны использовать соответствующий API для выполнения этих шагов.
Сначала вы должны узнать свой идентификатор экземпляра:
INSTANCE=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
Затем вы можете использовать свой идентификатор экземпляра, чтобы узнать идентификатор кластера:
ec2-describe-instances $INSTANCE | grep TAG | grep aws:elasticmapreduce:job-flow-id
Надеюсь, это поможет.
Ответ 3
Как указано выше, информация находится в файле job-flow.json. Этот файл имеет несколько других атрибутов. Итак, зная, где он находится, вы можете сделать это очень легко:
cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | cut -f2 -d: | cut -f2 -d'"'
Изменить: эта команда также работает и в основных узлах.
Ответ 4
Другая опция - запросить сервер метаданных:
curl -s http://169.254.169.254/2016-09-02/user-data/ | sed -r 's/.*clusterId":"(j-[A-Z0-9]+)",.*/\1/g'
Ответ 5
Очевидно, что задание Hadoop MapReduce не имеет возможности узнать, в каком кластере он работает - я был удивлен, узнав об этом сам.
НО: вы можете использовать другие идентификаторы для каждой карты, чтобы однозначно идентифицировать запущенный картограф и выполняемое задание.
Они указаны в переменных среды, передаваемых каждому преобразователю. Если вы пишете задание в потоке Hadoop, используя Python, код будет выглядеть следующим образом:
import os
if 'map_input_file' in os.environ:
fileName = os.environ['map_input_file']
if 'mapred_tip_id' in os.environ:
mapper_id = os.environ['mapred_tip_id'].split("_")[-1]
if 'mapred_job_id' in os.environ:
jobID = os.environ['mapred_job_id']
Это дает вам: имя входного файла, идентификатор задачи и идентификатор задания. Используя одну или комбинацию этих трех значений, вы должны иметь возможность однозначно идентифицировать, какой графический редактор работает.
Если вы ищете конкретную работу: "mapred_job_id" может быть тем, что вы хотите.