我正在用hadoop流媒体来做一个工作。
我的Map是用bash写的。它使用作业id。
mapred_job_id=`echo "$mapred_job_id" | awk -F "_" '{print $NF}'`
它工作得很好(为了调试的目的启动了一个愚蠢的wordcoundMap器操作),直到我有下面一行代码使作业崩溃:
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的变量。同样的错误。
注意:这一行是因为Map器中的另一个作业稍后需要获取id,并且不能与以前作业的id冲突。我正在尝试使用allreduce实现vowpalwabbit集群。
1条答案
按热度按时间3lxsmp7m1#
我发现了问题所在。bash脚本无法使用以下命令获取hadoop流式处理环境变量:
或者直接打电话
正如在github上找到的vowpal wabbit集群目录脚本中所做的那样。我编写了一个python脚本,可以使用
os.environ
.os.environ
返回包含hadoop流的所有环境变量的字典。它非常有用,因为变量的名称在不同版本的mapreduce之间发生了变化。cloudera提供的词典与我自己的版本不一致。下面是获得所需变量的脚本:从用bash编写的Map器中调用此脚本,然后可以使用以下命令:
这会根据johnlangford实现的vowpal wabbit的并行化需要更改作业id(参见https://github.com/johnlangford/vowpal_wabbit/blob/master/cluster/).