Знает ли владелец 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" может быть тем, что вы хотите.