Hadoop Streaming命令在Python中出错

3 投票
3 回答
11825 浏览
提问于 2025-04-17 18:27

我刚开始接触Ubuntu、Hadoop和DFS,但我已经按照Michael-Noll.com上的说明,在我的本地Ubuntu机器上成功安装了一个单节点的Hadoop实例,具体步骤可以在这里找到:

http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/#copy-local-example-data-to-hdfs

http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

现在我在运行Hadoop的基本单词计数示例时遇到了困难。我不确定在我的下载目录下运行Hadoop是否会有太大影响,但我尝试过把mapper.py和reducer.py这两个文件放到Hadoop的工作目录里,结果还是没有成功。我已经查阅了很多资料,但还是无法解决这个问题(比如使用-file参数等等)。非常感谢大家的帮助,希望我这个问题的描述能对刚开始学习Python和Hadoop的人有所帮助。

我独立测试了mapper.py和reducer.py,两个文件在bash命令行中用一些简单的文本数据时都能正常工作。

这是我在Bash命令行中的输出:

hduser@chris-linux:/home/chris/Downloads/hadoop$ bin/hadoop jar /home/chris/Downloads/hadoop/contrib/streaming/hadoop-streaming-1.0.4.jar -file mapper.py -file reducer.py -mapper mapper.py -reducer reducer.py -input /user/hduser/gutenberg/* -output /user/hduser/gutenberg-output3
Warning: $HADOOP_HOME is deprecated.

packageJobJar: [mapper.py, reducer.py, /app/hadoop/tmp/hadoop-unjar4681300115516015516/] [] /tmp/streamjob2215860242221125845.jar tmpDir=null
13/03/08 14:43:46 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/03/08 14:43:46 WARN snappy.LoadSnappy: Snappy native library not loaded
13/03/08 14:43:46 INFO mapred.FileInputFormat: Total input paths to process : 3
13/03/08 14:43:47 INFO streaming.StreamJob: getLocalDirs(): [/app/hadoop/tmp/mapred/local]
13/03/08 14:43:47 INFO streaming.StreamJob: Running job: job_201303081155_0032
13/03/08 14:43:47 INFO streaming.StreamJob: To kill this job, run:
13/03/08 14:43:47 INFO streaming.StreamJob: /home/chris/Downloads/hadoop/libexec/../bin/hadoop job  -Dmapred.job.tracker=localhost:54311 -kill job_201303081155_0032
13/03/08 14:43:47 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201303081155_0032
13/03/08 14:43:48 INFO streaming.StreamJob:  map 0%  reduce 0%
13/03/08 14:44:12 INFO streaming.StreamJob:  map 100%  reduce 100%
13/03/08 14:44:12 INFO streaming.StreamJob: To kill this job, run:
13/03/08 14:44:12 INFO streaming.StreamJob: /home/chris/Downloads/hadoop/libexec/../bin/hadoop job  -Dmapred.job.tracker=localhost:54311 -kill job_201303081155_0032
13/03/08 14:44:12 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201303081155_0032
13/03/08 14:44:12 ERROR streaming.StreamJob: Job not successful. Error: JobCleanup Task Failure, Task: task_201303081155_0032_m_000003
13/03/08 14:44:12 INFO streaming.StreamJob: killJob...
Streaming Command Failed!

我的HDFS位于/app/hadoop/tmp,我相信这也是我Hadoop实例中的/user/hduser目录。

输入数据位于/user/hduser/gutenberg/*(3个UTF编码的纯文本文件),输出将被创建在/user/hduser/gutenberg-output。

3 个回答

1

抱歉回复得晚了。

你需要确保你的文件(mapper和reducer)可以被hadoop用户执行,并且在第一行要包含一个叫做Shebang的东西。

这样就能解决你的问题了。

1

请查看以下路径中的日志(根据上面的信息):

$HADOOP_HOME$/logs/userlogs/job_201303081155_0032/task_201303081155_0032_m_000003

这应该能给你提供一些关于那个特定任务的信息。

Hadoop提供的日志相当不错,只是需要花点时间去找出你需要的信息 :)

2

我遇到过类似的错误 --


首先,在命令中: -file mapper.py -file reducer.py -mapper mapper.py -reducer reducer.py

你可以在 '-file' 后面使用完整的本地路径,然后在 '-mapper' 后面使用相对路径,比如: -file /aFully/qualified/localSystemPathTo/yourMapper.py -mapper yourMapper.py


然后,记得在 'reducer.py' 和 'mapper.py' 文件的顶部加上 "#!/usr/bin/python"


最后,

在我的 mapper.py 和 reducer.py 中,我把所有的导入语句放在一个叫 'setup_call()' 的函数里(而不是放在文件的全局范围内),然后用以下代码包裹起来:

if __name__== '__main__':

    try:
        setup_call_andCloseOut()
    except: 
        import sys, traceback, StringIO

        fakeeWriteable = StringIO.StringIO()

        traceback.print_exc(None,  file=fakeeWriteable)
        msg = ""
        msg +="------------------------------------------------------\n"
        msg +="----theTraceback: -----------\n"
        msg += fakeeWriteable.getvalue() +  "\n"
        msg +="------------------------------------------------------\n"

        sys.stderr.write(msg)  

    #end

到这一步,我能够使用 Hadoop 的网页作业日志(就是你错误信息里的那些 http:// 链接),找到并查看 'stderr' 消息..(来自实际的核心逻辑)


我相信还有其他更简洁的方法来做到这些,但这对我当时的需求来说既清晰又足够用了。

祝好运..

撰写回答