我正在使用Hadoop流媒体来完成工作。
我的映射器是用bash编写的。它使用了job_id。
mapred_job_id=`echo "$mapred_job_id" | awk -F "_" '{print $NF}'`
它工作正常(为了调试目的而推出一个愚蠢的wordcound映射器操作),直到我有以下行导致作业崩溃:
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:这一行是因为稍后应该在mapper中的另一个工作需要获取一个id,并且无法使用先前作业的ID进行混淆。我正在尝试使用与allreduce一起工作的vowpal wabbit群集实现。
答案 0 :(得分:1)
我发现了问题所在。 bash脚本无法使用以下命令获取Hadoop流环境变量:
mapper=`printenv mapred_task_id'
或直接通过调用实例
$mapreduce_output_fileoutputformat_outputdir
就像在github上找到的Vowpal Wabbit集群目录的脚本中所做的那样。
我通过编写一个可以使用os.environ
获取这些变量的python脚本解决了这个问题。 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
从用bash编写的映射器调用此脚本,然后我可以使用命令:
mapred_job_id=`expr $mapred_job_id \* 2`
根据John Langford实现的vowpal wabbit的并行化需要更改作业ID(参见https://github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/)。