【问题标题】:mrjob returned non-zero exit status 256mrjob 返回非零退出状态 256
【发布时间】:2019-02-06 01:36:53
【问题描述】:

我是 map reduce 的新手,我正在尝试使用 python 的 mrjob 包运行 map reduce 作业。但是,我遇到了这个错误:

ERROR:mrjob.launch:Step 1 of 1 failed: Command '['/usr/bin/hadoop', 'jar', '/usr/lib/hadoop-mapreduce/hadoop-streaming.jar', '-files', 
'hdfs:///user/hadoop/tmp/mrjob/word_count.hadoop.20180831.035452.437014/files/mrjob.zip#mrjob.zip,
hdfs:///user/hadoop/tmp/mrjob/word_count.hadoop.20180831.035452.437014/files/setup-wrapper.sh#setup-wrapper.sh,
hdfs:///user/hadoop/tmp/mrjob/word_count.hadoop.20180831.035452.437014/files/word_count.py#word_count.py', '-archives', 
'hdfs:///user/hadoop/tmp/mrjob/word_count.hadoop.20180831.035452.437014/files/word_count_ccmr.tar.gz#word_count_ccmr.tar.gz', '-D', 
'mapreduce.job.maps=4', '-D', 'mapreduce.job.reduces=4', '-D', 'mapreduce.map.java.opts=-Xmx1024m', '-D', 'mapreduce.map.memory.mb=1200', '-D', 
'mapreduce.output.fileoutputformat.compress=true', '-D', 'mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec', '-D', 
'mapreduce.reduce.java.opts=-Xmx1024m', '-D', 'mapreduce.reduce.memory.mb=1200', '-input', 'hdfs:///user/hadoop/test-1.warc', '-output', 
'hdfs:///user/hadoop/gg', '-mapper', 'sh -ex setup-wrapper.sh python word_count.py --step-num=0 --mapper', '-combiner', 
'sh -ex setup-wrapper.sh python word_count.py --step-num=0 --combiner', '-reducer', 'sh -ex setup-wrapper.sh python word_count.py --step-num=0 --reducer']' 
returned non-zero exit status 256

我尝试在本地使用python ./word_count.py input/test-1.warc > output 运行它,并且成功了。

我正在使用

  1. python 2.7.14
  2. Hadoop 2.8.3-amzn-1
  3. pip 18.0
  4. mrjob 0.6.4

有什么想法吗?谢谢!

这是我运行 mapreduce 作业的命令。我从cc-mrjob 存储库中得到它。该文件名为run_hadoop.sh,我使用chmod +x run_hadoop.sh

#!/bin/sh

JOB="$1"
INPUT="$2"
OUTPUT="$3"

sudo chmod +x $JOB.py

if [ -z "$JOB" ] || [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then
    echo "Usage: $0 <job> <input> <outputdir>"
    echo "  Run a CommonCrawl mrjob on Hadoop"
    echo
    echo "Arguments:"
    echo "  <job>     CCJob implementation"
    echo "  <input>   input path"
    echo "  <output>  output path (must not exist)"
    echo
    echo "Example:"
    echo "  $0 word_count input/test-1.warc  hdfs:///.../output/"
    echo
    echo "Note: don't forget to adapt the number of maps/reduces and the memory requirements"
    exit 1
fi

# strip .py from job name
JOB=${JOB%.py}

# wrap Python files for deployment, cf. below option --setup,
# see for details
# http://pythonhosted.org/mrjob/guides/setup-cookbook.html#putting-your-source-tree-in-pythonpath
tar cvfz ${JOB}_ccmr.tar.gz *.py

# number of maps resp. reduces 
NUM_MAPS=4
NUM_REDUCES=4

if [ -n "$S3_LOCAL_TEMP_DIR" ]; then
    S3_LOCAL_TEMP_DIR="--s3_local_temp_dir=$S3_LOCAL_TEMP_DIR"
else
    S3_LOCAL_TEMP_DIR=""
fi
python $JOB.py \
       -r hadoop \
       --jobconf "mapreduce.map.memory.mb=1200" \
       --jobconf "mapreduce.map.java.opts=-Xmx1024m" \
       --jobconf "mapreduce.reduce.memory.mb=1200" \
       --jobconf "mapreduce.reduce.java.opts=-Xmx1024m" \
       --jobconf "mapreduce.output.fileoutputformat.compress=true" \
       --jobconf "mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec" \
       --jobconf "mapreduce.job.reduces=$NUM_REDUCES" \
       --jobconf "mapreduce.job.maps=$NUM_MAPS" \
       --setup 'export PYTHONPATH=$PYTHONPATH:'${JOB}'_ccmr.tar.gz#/' \
       --no-output \
       --cleanup NONE \
       $S3_LOCAL_TEMP_DIR \
       --output-dir "$OUTPUT" \
       "hdfs:///user/hadoop/$INPUT"

我使用./run_hadoop.sh word_count test-1.warc output 运行它

在哪里

  • word_count 是工作(文件名为 word_count.py)
  • test-1.warc 是输入(位于hdfs:///user/hadoop/test-1.warc)
  • 和output 是输出目录(位于hdfs:///user/hadoop/output)而且我还确保我总是为不同的工作使用不同的输出以防止重复文件夹)

* 更新 *

我查看了 HUE 界面中的 syslog。还有这个错误

org.apache.hadoop.mapreduce.v2.app.rm.RMContainerAllocator: Could not deallocate container for task attemptId attempt_1536113332062_0001_r_000003_0

这与我遇到的错误有关吗?

我也在地图尝试的标准错误之一中得到了这个

/bin/sh: run_prestart: line 1: syntax error: unexpected end of file

和

No module named boto3

但是,我在 emr 中使用 pip install boto3 安装了 boto3。模块在hadoop中不可用吗?

【问题讨论】:

  • 查看 YARN UI 找出脚本错误的原因
  • 假设在本地模式/运行器下测试成功,唯一的方法是检查任务日志,参见。 cc-mrjob#22如何在 EMR 上找到日志。另请注意,在 Hadoop/EMR 上运行时,会从 S3 读取 WARC/WAT/WET 文件,请参阅mrcc.py。顺便说一句,word_count.py 需要 WET 文件作为输入。
  • 您好,对不起,我昨天才可以访问 emr。我更新了从 HUE 界面中的作业状态获取的日志

标签: python hadoop mrjob common-crawl


【解决方案1】:

我通过关注这个博客得到了它的工作

http://benjamincongdon.me/blog/2018/02/02/MapReduce-on-Python-is-better-with-MRJob-and-EMR/

基本上,

您必须在 hadoop 中包含一个 .conf 文件以供 runner 使用。例如mrjob.conf

在那个文件中,使用这个

runners:
  hadoop:
    setup:
      - 'set -e'
      - VENV=/tmp/$mapreduce_job_id
      - if [ ! -e $VENV ]; then virtualenv $VENV; fi
      - . $VENV/bin/activate
      - 'pip install boto3'
      - 'pip install warc'
      - 'pip install https://github.com/commoncrawl/gzipstream/archive/master.zip'
    sh_bin: '/bin/bash -x'

并通过引用run_hadoop.sh来使用conf文件

python $JOB.py \
        --conf-path mrjob.conf \ <---- OUR CONFIG FILE
        -r hadoop \
        --jobconf "mapreduce.map.memory.mb=1200" \
        --jobconf "mapreduce.map.java.opts=-Xmx1024m" \
        --jobconf "mapreduce.reduce.memory.mb=1200" \
        --jobconf "mapreduce.reduce.java.opts=-Xmx1024m" \
        --jobconf "mapreduce.output.fileoutputformat.compress=true" \
        --jobconf "mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec" \
        --jobconf "mapreduce.job.reduces=$NUM_REDUCES" \
        --jobconf "mapreduce.job.maps=$NUM_MAPS" \
        --setup 'export PYTHONPATH=$PYTHONPATH:'${JOB}'_ccmr.tar.gz#/' \
        --cleanup NONE \
        $S3_LOCAL_TEMP_DIR \
        --output-dir "hdfs:///user/hadoop/$OUTPUT" \
        "hdfs:///user/hadoop/$INPUT"

现在如果你打电话给./run_hadoop.sh word_count input/test-1.warc output,它应该可以工作了!

【讨论】:

  • manifest-setup.sh: line 13: virtualenv: command not found 当我尝试像您的回答一样添加mrjob.conf 时出现此错误。你知道如何解决这个问题吗?谢谢。
  • 我的mrjob.conf 文件和你的一模一样,但我只有一行pip install -r requirements.txt
  • @huy 我认为这是一个不同的问题——stackoverflow.com/questions/31133050/… 有一个很好的线程。它归结为你如何安装virtualenv(使用root?)以及你如何运行使用virtualenv的命令(使用普通用户?)
猜你喜欢
  • 2017-05-18
  • 2013-12-23
  • 2022-11-01
  • 2014-01-13
  • 2016-08-09
  • 2019-10-02
  • 2014-07-26
  • 1970-01-01
  • 2017-05-20
相关资源
最近更新 更多