Hadoop流式处理命令失败,出现Python错误

Hadoop流式处理命令失败,出现Python错误,python,hadoop,hadoop-streaming,Python,Hadoop,Hadoop Streaming,我是Ubuntu、Hadoop和DFS的新手,但我已经按照Michael-Noll.com上发布的说明在本地Ubuntu机器上安装了一个单节点Hadoop实例: 我目前正在Hadoop上运行基本的单词计数示例。我不确定我在下载目录外运行Hadoop是否会造成太大的差异,但我尝试将mapper.py和reducer.py函数放在Hadoop工作目录中,在我的文件位置来回走动,但没有成功。我已经完成了所有的研究,但仍然无法解决这个问题(即使用-文件参数等)。我非常感谢您事先提供的任何帮助,我希望

我是Ubuntu、Hadoop和DFS的新手,但我已经按照Michael-Noll.com上发布的说明在本地Ubuntu机器上安装了一个单节点Hadoop实例:

我目前正在Hadoop上运行基本的单词计数示例。我不确定我在下载目录外运行Hadoop是否会造成太大的差异,但我尝试将mapper.py和reducer.py函数放在Hadoop工作目录中,在我的文件位置来回走动,但没有成功。我已经完成了所有的研究,但仍然无法解决这个问题(即使用-文件参数等)。我非常感谢您事先提供的任何帮助,我希望我以一种能够帮助其他刚刚开始使用Python+Hadoop的人的方式提出这个问题

我独立地测试了mapper.py和reduce.py,当bashshell提示使用玩具文本数据时,两者都可以正常工作

我的Bash Shell的输出:

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创建。请查看以下路径中的日志(基于上面提供的信息):

这将为您提供有关该特定任务的一些信息


Hadoop提供的日志非常好,只需进行一些挖掘就可以找到信息:)

与我得到的错误相似--


首先,在: -文件mapper.py-文件reducer.py-映射器mapper.py-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 web作业日志(错误消息中的http://链接),并导航到“stderr”消息。。(来自实际核心逻辑)


我相信还有其他更简洁的方法可以做到这一切,但这在语义上是明确的,并且足以满足我的迫切需要


祝你好运

很抱歉反应太晚

您应该确保hadoop用户可以执行您的文件(mapper和reducer),并在第一行中包含

那会解决你的问题

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