2012-06-25 2 views
1

Все задания Hadoop имеют уникальную работу. Вы можете использовать jobid для получения статуса работы или счетчика заданий. Вопрос в том, как я могу получить jobid задания, которое я только что запускал из своего сценария? И, конечно, я хочу сделать это надежным и легким (если возможно) способом.Получить информацию о текущем потоке с помощью hadoop

Пример:

1) из моего сценария я бегу:

hadoop jar  ${HADOOP_STREAMING} \ 
       -D mapred.job.name="$NAME" \ 
       -D mapred.reduce.tasks=$NREDUCERS\ 
       -mapper  "cat" \ 
       -file  ./reducer.py \ 
       -reducer "python ./reducer.py" \ 
       -input  hdfs:/logs/2012-06-25/*.bz2 \ 
       -output  hdfs:/tmp/test 

2) Теперь я хочу, чтобы каким-то образом получить JobId запускаемого задания.

3) Когда у меня есть jobid, я могу выполнить jobo-job и hasoop job -counter.

UPDATE:

Синхронный случай (ждать до завершения, получить JobID, а затем попросить статус/счетчиков), как представляется, необходимый минимум, но иногда это не удобно пользоваться. Иногда я хочу запускать несколько операций потоковой передачи данных в режиме onoop (в качестве фоновых задач), и я хочу запомнить все значения, которые я могу использовать позже, например. для анализа рабочего процесса.

На самом деле я выяснил какое-то решение, но считаю это хаком, что меня очень беспокоит. Буду признателен, если кто-нибудь покажет мне более элегантное решение. Вот решение:

1) когда я запускаю операцию потоковой передачи hadoop, я должен указать каталог hdfs вывода .

2) с помощью этого каталога можно получить доступ к файлу конфигурации задания в HDFS:

CONF_FILE_PATH=`hadoop fs -stat hdfs:<output_dir_path>/_logs/history/*.xml | awk '{print $NF}'` 

3) И, наконец, я могу извлечь JobId от имени файла конфигурации

+0

В вашем примере случае , не выполняется ли выполнение до тех пор, пока задание не завершится до завершения оболочки? (в этом случае не так много точек опроса статус). Или вас интересует, удалось ли выполнить задание/не удалось и какие-либо окончательные значения счетчика заданий? –

+0

Синхронный корпус (ждать до завершения, получать задание, а затем запрашивать статус/счетчики), по-видимому, является минимальным, но иногда это не удобно использовать.Иногда я хочу запускать несколько операций потоковой передачи данных в режиме onoop (в качестве фоновых задач), и я хочу запомнить все значения, которые я могу использовать позже, например. для анализа рабочего процесса. На самом деле я понял какое-то решение, но считаю его хаком, что меня очень беспокоит (см. Обновленный пост). Буду признателен, если кто-нибудь покажет мне более элегантное решение. –

ответ

0

У вас есть два варианта за пределами тока «взломать» (один из которых является просто еще один «взломать»!)

  1. Захват стандартной ошибки запущенного процесса, работа ID будет выводиться в первых (несколько) линиях, и имеет тыс e формат похож на: Running job: <jobid>.

  2. Измените исходный код StreamJob.java (строка 917) в папке с потоковой передачей для вывода идентификатора задания в файл tmp (возможно, pre/suffixed с идентификатором процесса для быстрого обнаружения из оболочки).

+0

Я думаю, что первый подход очень ненадежный, потому что вывод stderr может измениться, например, в более новых версиях. На данный момент я не могу попробовать второй подход, но, похоже, все в порядке, и я попробую его позже. Спасибо за Ваш ответ! –

1

У вас есть возможность назначить определенный пользователь имя задания:

|-D mapred.job.name="unique_name_within_the_user" \ 

и после этого определить ваше job_id от ответа Hadoop пряжи REST API в:

curl -H "Accept: application/json" -X GET "http://host.domain.com:8088/ws/v1/cluster/apps"