Hadoop Streaming命令在Python中出错
我刚开始接触Ubuntu、Hadoop和DFS,但我已经按照Michael-Noll.com上的说明,在我的本地Ubuntu机器上成功安装了一个单节点的Hadoop实例,具体步骤可以在这里找到:
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 个回答
请查看以下路径中的日志(根据上面的信息):
$HADOOP_HOME$/logs/userlogs/job_201303081155_0032/task_201303081155_0032_m_000003
这应该能给你提供一些关于那个特定任务的信息。
Hadoop提供的日志相当不错,只是需要花点时间去找出你需要的信息 :)
我遇到过类似的错误 --
首先,在命令中: -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' 消息..(来自实际的核心逻辑)
我相信还有其他更简洁的方法来做到这些,但这对我当时的需求来说既清晰又足够用了。
祝好运..