【问题标题】:Hadoop Streaming Job failed error in pythonpython中的Hadoop Streaming Job失败错误
【发布时间】:2021-01-06 16:58:28
【问题描述】:

来自this guide,我已成功运行示例练习。但是在运行我的 mapreduce 作业时,我收到以下错误
ERROR streaming.StreamJob: Job not Successful!
10/12/16 17:13:38 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

来自日志文件的错误

java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:311)
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545)
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:132)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
at org.apache.hadoop.mapred.Child.main(Child.java:170)

映射器.py

import sys

i=0

for line in sys.stdin:
    i+=1
    count={}
    for word in line.strip().split():
        count[word]=count.get(word,0)+1
    for word,weight in count.items():
        print '%s\t%s:%s' % (word,str(i),str(weight))

reducer.py

import sys

keymap={}
o_tweet="2323"
id_list=[]
for line in sys.stdin:
    tweet,tw=line.strip().split()
    #print tweet,o_tweet,tweet_id,id_list
    tweet_id,w=tw.split(':')
    w=int(w)
    if tweet.__eq__(o_tweet):
        for i,wt in id_list:
            print '%s:%s\t%s' % (tweet_id,i,str(w+wt))
        id_list.append((tweet_id,w))
    else:
        id_list=[(tweet_id,w)]
        o_tweet=tweet

[edit] 运行作业的命令:

hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper /home/hadoop/mapper.py -file /home/hadoop/reducer.py -reducer /home/hadoop/reducer.py -input my-input/* -output my-output

输入是任意随机序列的句子。

谢谢,

【问题讨论】:

    标签: python hadoop mapreduce


    【解决方案1】:

    您的 -mapper 和 -reducer 应该只是脚本名称。

    hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper mapper.py -file /home/hadoop/reducer.py -reducer reducer.py -input my-input/* -output my-output
    

    当您的脚本位于 hdfs 内另一个文件夹中的作业中时,该作业与执行为“。”的尝试任务相关。 (仅供参考,如果您想添加另一个文件,例如查找表,您可以在 Python 中打开它,就好像它与您的脚本在同一目录中一样,而您的脚本处于 M/R 作业中)

    还要确保你有 chmod a+x mapper.py 和 chmod a+x reducer.py

    【讨论】:

    • 尝试将#!/usr/bin/env python 添加到您的python脚本的顶部,它应该能够通过执行 cat data.file|./mapper.py 从命令行执行|sort|./reducer.py 并且文件顶部没有“#!/usr/bin/env python”
    • 这个解决方案对我不起作用,直到我在映射器和减速器输入中添加了引号(即 -mapper "mapper.py")。我从 Apache 文档中得到了这个想法。 wiki.apache.org/hadoop/HadoopStreaming
    【解决方案2】:

    尝试添加

     #!/usr/bin/env python
    

    脚本的顶部。

    或者,

    -mapper 'python m.py' -reducer 'r.py'
    

    【讨论】:

    • 太棒了!将“#!/usr/bin/env python”添加到标题时,它解决了我的问题。
    • 该死,通过 vim 复制粘贴代码删除了 #! 并为我造成了这个问题。感谢提醒添加页眉!!
    【解决方案3】:

    您需要明确指示将 mapper 和 reducer 用作 python 脚本,因为我们有多个流式传输选项。您可以使用单引号或双引号。

    -mapper "python mapper.py" -reducer "python reducer.py" 
    

    -mapper 'python mapper.py' -reducer 'python reducer.py'
    

    完整的命令如下:

    hadoop jar /path/to/hadoop-mapreduce/hadoop-streaming.jar \
    -input /path/to/input \
    -output /path/to/output \
    -mapper 'python mapper.py' \
    -reducer 'python reducer.py' \
    -file /path/to/mapper-script/mapper.py \
    -file /path/to/reducer-script/reducer.py
    

    【讨论】:

      【解决方案4】:

      我最近遇到了这个错误,结果证明我的问题与其他解决方案一样明显(事后看来):

      我只是在我的 Python 代码中有一个错误。 (在我的例子中,我使用的是 Python v2.7 字符串格式,而我拥有的 AWS EMR 集群使用的是 Python v2.6)。

      要查找实际的 Python 错误,请转到 Job Tracker Web UI(对于 AWS EMR,端口 9100 用于 AMI 2.x,端口 9026 用于 AMI 3.x);找到失败的映射器;打开它的日志;并读取标准错误输出。

      【讨论】:

        【解决方案5】:

        确保您的输入目录只包含正确的文件

        【讨论】:

        • 我遇到了这个问题..我在 hadoop 之外运行没有任何问题...但是我尝试了这里的建议并且在日志中没有看到任何内容..任何其他方式调试这个问题
        【解决方案6】:

        我也有同样的问题 我尝试了马文 W 的解决方案 我也安装了 spark ,确保你已经安装了 spark ,不仅仅是 pyspark(dependency) 还要安装框架installtion tutorial

        按照该教程进行操作

        【讨论】:

          【解决方案7】:

          如果您在 hadoop cluster 中运行此命令,请确保在 每个 NodeMnager 实例中安装了 python。 #hadoop

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-05
            • 1970-01-01
            • 2015-05-23
            • 2022-06-21
            • 1970-01-01
            • 2014-06-30
            • 1970-01-01
            • 2011-10-04
            相关资源
            最近更新 更多