bash - 在 bash 脚本中使用 expr 时 hadoop 流式传输出错

标签 bash hadoop hadoop-streaming vowpalwabbit

我正在使用 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 集群实现。

最佳答案

我发现了问题所在。 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`

根据需要更改作业 ID,以实现由 John Langford 实现的 vowpal wabbit 并行化(参见 https://github.com/JohnLangford/vowpal_wabbit/blob/master/cluster/ )。

关于bash - 在 bash 脚本中使用 expr 时 hadoop 流式传输出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494949/

相关文章:

python - 如何使Mapper以有序的方式从文件中获取数据

bash - Conda 环境激活 : Weird "must be sourced" error

regex - Bash,grep在两行之间指定字符串

python - 如何在 Spark 中控制输出拼花文件的大小

hadoop - 编译语句时出错:失败:ParseException第4:22行不匹配,输入 ','期望<靠近 'array'在列表类型中

hadoop - reducer 不会在hadoop流中启动

hadoop - 如何在 hadoop 流中跳过失败的 map task

C++ 程序,输入无限循环

bash - 如何在 Bash 中生成随机数?

hadoop - Hadoop中的 Rack 拓扑