【发布时间】:2015-08-10 06:37:28
【问题描述】:
我正在使用 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:这一行是因为映射器中稍后应该有另一个作业需要获取 id 并且不能与先前作业的 id 冲突。我正在尝试获得适用于 allreduce 的 vowpal wabbit 集群实现。
【问题讨论】:
-
为什么要加倍工作 ID?我没有遵循您希望通过它实现的目标..
-
我认为这与 allreduce 的 vowpalwabbit 实现有关。有一个守护进程(生成树)正在监听所有节点并用 id 标识它们。但是由于映射器产生了两个具有两个不同结果的作业,我理解这就是你需要这样做的原因。他们的实现在 github 上:github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/…
-
其实很奇怪。我之前看错了。他们实际上计算了 mapred_job_id 中的字段数......我不明白,这与我的理解相矛盾。
-
稍微解释一下会有所帮助。为什么要加倍工作 ID?
标签: bash hadoop hadoop-streaming vowpalwabbit