2013-11-26 2 views
10

Я хочу иметь возможность создавать кластеры EMR и для этих кластеров отправлять сообщения обратно в некоторую центральную очередь. Для того, чтобы это работало, мне нужно, чтобы какой-то агент работал на каждом ведущем узле. Каждому из этих агентов придется идентифицировать себя в этом сообщении, чтобы получатель знал, в каком кластере это сообщение.Знает ли главный узел EMR свой идентификатор кластера?

знает главный узел это идентификатор (j- * ** * *)? Если нет, то есть ли другая часть идентифицирующей информации, которая могла бы позволить получателю сообщения вывести этот идентификатор?

Я просмотрел конфигурационные файлы в/home/hadoop/conf, и я не нашел ничего полезного. Я нашел id в /mnt/var/log/instance-controller/instance-controller.log, но похоже, что будет сложно выполнить grep. Мне интересно, где экземпляр-контроллер может получить этот идентификатор в первую очередь.

ответ

19

Вы можете посмотреть /mnt/var/lib/info/ на главном узле, чтобы найти много информации о настройке кластера EMR. Более конкретно, /mnt/var/lib/info/job-flow.json содержит jobFlowId или ClusterID.

Вы можете использовать предварительно установленный json-парсер (jq), чтобы получить идентификатор задания.

cat /mnt/var/lib/info/job-flow.json | jq -r ".jobFlowId" 

(обновляется в соответствии с @Marboni)

+0

Удивительно, я проверю это! – bstempi

+3

См. Http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/Config_JSON.html – ChristopherB

+0

@jcmannem В этой папке содержится все, что мне нужно. Даже, это позволяет избежать использования API дросселирования AWS. Имя файла для моего использования - /mnt/var/lib/info/job-flow-state.txt Теперь проблема в том, как я могу разобрать этот файл? Знаете ли вы? Если есть, я могу использовать библиотеку Джексона. – devsda

0

Очевидно, что работа 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» может быть тем, что вы хотите.

4

Вы можете использовать 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 

Надеется, что это помогает.

+0

Первый запрос выполнимо без каких-либо специальных разрешений. Я предполагаю, что вторая требует возможности выполнять операции EC2, да? – bstempi

+1

Не работает для меня, получите ошибку во второй команде «Client.InvalidInstanceID.NotFound: Идентификатор экземпляра« xxxx »не существует (Service: AmazonEC2; Код состояния: 400; Код ошибки: InvalidInstanceID.NotFound; Идентификатор запроса: xxxx -xxxx) " – spats

+0

Странно. Прекрасно работает для меня. Вы уверены, что используете правильные ключи доступа AWS? – Vlad

3

Как было выше предписанных в технических заданиях, информация находится в файле задания-flow.json. Этот файл имеет several other attributes.Так, зная, где он находится, вы можете сделать это в очень простой способ:

cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | cut -f2 -d: | cut -f2 -d'"' 

Edit: Эта команда работает в основных узлах также.

+0

Эта папка содержит все, что мне нужно. Даже, это позволяет избежать использования API дросселирования AWS. Имя файла для моего использования - /mnt/var/lib/info/job-flow-state.txt Теперь проблема в том, как я могу разобрать этот файл? Знаете ли вы? Если есть, я могу использовать библиотеку Джексона. – devsda

+0

Я не знаю содержание этого файла, поэтому я не знаю, как его разобрать, может быть, вы должны задать еще один вопрос:) – chomp

1

Другой вариант - запрос на сервер метаданных:

curl -s http://169.254.169.254/2016-09-02/user-data/ | sed -r 's/.*clusterId":"(j-[A-Z0-9]+)",.*/\1/g' 
Смежные вопросы