3

我是 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 工作目录中没有成功。我已经用尽了我所有的研究,但仍然无法解决这个问题(即使用文件参数等)我真的很感谢提前提供的任何帮助,我希望我以一种可以帮助刚开始的其他人的方式提出这个问题使用 Python + Hadoop。

我独立测试了 mapper.py 和 reduce.py,当提示来自 bash shell 的玩具文本数据时,它们都可以正常工作。

我的 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 创建

4

3 回答 3

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 Web 作业日志(错误消息中的那些 http:// 链接),并导航到查看“stderr”消息的方式..(来自实际的核心逻辑)


我敢肯定还有其他更简洁的方法可以做到这一切,但这在语义上既清晰又足以满足我的迫切需求

祝你好运..

于 2013-07-15T21:44:34.470 回答
1

查看以下路径中的日志(基于上面提供的信息):

$HADOOP_HOME$/logs/userlogs/job_201303081155_0032/task_201303081155_0032_m_000003

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

Hadoop提供的日志非常好,只是需要一些挖掘才能找到信息:)

于 2013-03-10T13:21:31.643 回答
1

回复晚了非常抱歉。

您应该确保您的文件(映射器和化简器)可由 hadoop 用户执行,并在第一行包含Shebang

这将解决你的问题。

于 2016-11-29T16:28:29.167 回答