2015-05-27 7 views
0

Я использую потоки Hadoop для работы.Ошибка при потоке hadoop при использовании expr в скрипте bash

Мой картограф написан в bash. Он использует job_id.

mapred_job_id=`echo "$mapred_job_id" | awk -F "_" '{print $NF}'` 

Он отлично работает (lauching глупая операция wordcound картографа для целей debuggin), пока я не имел следующую строку, которые делают сбой задания:

mapred_job_id=`expr $mapred_job_id \* 2` 

Ошибка является:

INFO mapreduce.Job: Task Id : attempt_1432766867252_0019_m_000007_0, Status : FAILED 
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2 
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:330) 
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:543) 
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130) 
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:81) 
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:432) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:415) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548) 
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:170) 

и т.д.

Любая идея, почему это не работает? Непосредственно в командной строке это делается. Я также пытался использовать другую переменную с именем dummy. Такая же ошибка.

Nb: Эта строка объясняется тем, что позднее должно быть выполнено другое задание в картографе, которое должно получить идентификатор и не может конфликтовать с идентификаторами предыдущих заданий. Я пытаюсь реализовать vowpal wabbit cluster, который работает с allreduce.

+0

Зачем вам удваивать идентификатор задания? Я не следую тому, чего вы надеетесь достичь с этим. – ShellFish

+0

Я думаю, что это связано с реализацией vrepalwabbit allreduce. Существует демон (spanning tree), который слушает все узлы и идентифицирует их с идентификаторами. Но так как две работы с двумя разными результатами производятся картографом, я понимаю, поэтому вам нужно это сделать. Их реализация осуществляется на github: https://github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/runvw-yarn.sh – bosonfute

+0

На самом деле это странно. Я неправильно читал раньше. Они фактически подсчитывают количество полей в mapred_job_id ... Я не понимаю, это противоречит моему пониманию. – bosonfute

ответ

1

Я выяснил, в чем проблема. Сценарий Баша был не в состоянии получить Hadoop переменных потоковой среды с помощью команды:

mapper=`printenv mapred_task_id' 

или непосредственно по телефону, например

$mapreduce_output_fileoutputformat_outputdir 

, как это было сделано в сценарии для каталога кластера Vowpal Wabbit находится на GitHub. Я столкнулся с проблемой, написав скрипт python, который может получить эти переменные, используя os.environ. os.environ возвращает словарь, содержащий все переменные среды потоковой передачи Hadoop. Это было очень полезно, так как имя переменных изменилось между различными версиями mapreduce. Словарь, предоставленный Cloudera, был несовместим с моей собственной версией. Вот сценарий, который получил переменный мне нужно:

#!/usr/bin/env python 

import sys 
import os 
import subprocess 

nmappers=os.environ["mapreduce_job_maps"] 
submit_host=os.environ["mapreduce_job_submithostname"] 
output_dir=os.environ["mapreduce_output_fileoutputformat_outputdir"] 
mapred_job_id=os.environ["mapreduce_job_id"].split("_")[-1] 
mapper=os.environ["mapreduce_task_id"].split("_")[4] 

print nmappers, submit_host, output_dir, mapred_job_id, mapper 

Вызывать этот скрипт из картографа, написанного в Баше, я могу затем использовать команду:

mapred_job_id=`expr $mapred_job_id \* 2` 

, которая изменяет идентификатор задания, сколько необходимо для распараллеливание вольфрамовой куклы, реализованной Джоном Лэнгфордом (см. https://github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/).