Hadoop Streaming永远不会完成

时间:2013-12-22 15:30:41

标签: python-2.7 hadoop hadoop-streaming

我正在尝试学习如何使用hadoop流媒体。我正在尝试运行一个非常简单的映射器,而不是减速器。当我运行该程序时,它完成100%的地图任务,然后在十分钟内完成任务,然后报告它已完成所有地图任务的0%。我认为这意味着节点管理员必须终止工作,不确定。我过去等了半个小时才结束了。

我正在使用hadoop 1.2.1。它的文档说它带有hadoop流媒体jar,但我找不到它,所以我从中央maven资源库下载了hadoop-streaming-1.2.1。这是命令行:

[msknapp@localhost data]$ hadoop jar /hadoop/hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks=0 -input /stock -output /company_index -mapper /home/msknapp/workspace/stock/stock.mr/scripts/firstLetterMapper.py -reducer org.apache.hadoop.mapred.lib.IdentityReducer
packageJobJar: [] [/opt/hadoop-1.2.1/hadoop-streaming-1.2.1.jar] /tmp/streamjob7222367580107633928.jar tmpDir=null
13/12/22 07:04:14 WARN snappy.LoadSnappy: Snappy native library is available
13/12/22 07:04:14 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/12/22 07:04:14 INFO snappy.LoadSnappy: Snappy native library loaded
13/12/22 07:04:14 INFO mapred.FileInputFormat: Total input paths to process : 1
13/12/22 07:04:17 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop-msknapp/mapred/local]
13/12/22 07:04:17 INFO streaming.StreamJob: Running job: job_201312201826_0009
13/12/22 07:04:17 INFO streaming.StreamJob: To kill this job, run:
13/12/22 07:04:17 INFO streaming.StreamJob: UNDEF/bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201312201826_0009
13/12/22 07:04:17 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201312201826_0009
13/12/22 07:04:18 INFO streaming.StreamJob:  map 0%  reduce 0%
13/12/22 07:04:44 INFO streaming.StreamJob:  map 100%  reduce 0%
13/12/22 07:14:44 INFO streaming.StreamJob:  map 0%  reduce 0%
13/12/22 07:15:09 INFO streaming.StreamJob:  map 100%  reduce 0%

我调用的python脚本非常简单。我安装了python 2.6.6。该脚本在我测试时起作用:

#!/usr/bin/env
import sys
import string
#import os

def map(instream=sys.stdin,outstream=sys.stdout):
    line = instream.readline()
    output=map_line(line)
    outstream.write(output)

def map_line(line):
    parts=string.split(line,"\t")
    key=parts[0]
    newkey=key[0]
    newvalue=key
    output=newkey+"\t"+newvalue
    return output

map()

输入文件相当简短,它有像“GE \ tGeneral Electric”这样的制表符分隔线,我相信它们是标签。

BTW我在CentOS 1.6上运行hadoop 1.2.1,在VMWare虚拟机上运行伪分布式模式。

请有人向我解释为什么这不起作用以及我能做些什么来解决它?

2 个答案:

答案 0 :(得分:1)

我在类似(简单)问题上遇到此错误。对我来说,错误是由于python脚本在执行期间死亡。与您的问题类似,我的脚本似乎对问题的一小部分工作得很好,但是对于整个数据集而言,它不会在Hadoop上工作,这是由于输入有缺陷。所以,虽然它可能不是你的脚本死亡的原因,但你应该添加一些健全性检查。


检查部件的长度是否符合预期。

检查部件是否为空。

此外,您可以转到作业跟踪器并查看导致Hadoop停止执行的确切错误。这不会给你你可能期望的python stacktrace,但仍然有用。工作跟踪器通常可在以下找到 http:// localhost : 50030/jobtracker.jsp

另外,更改

#!/usr/bin/env




#!/usr/bin/python

这是因为运行脚本的机器不知道如何处理它。 如果您使用./firstLetterMapper.py代替python firstLetterMapper.py

运行它,可能只会导致您的计算机冻结

答案 1 :(得分:0)

hadoop-streaming-x.y.z.jar应该在$HADOOP_HOME中,但我没有为我定义但应该在/usr/lib/hadoop

我认为Hadoop Streaming doc对你的python示例问题很有帮助。

首先,您的映射器节点需要您编写的python文件的副本,因此在命令行中使用file选项列出它。
其次,如果您没有使用减速器,则无需定义它。

$ hadoop jar /hadoop/hadoop-streaming-1.2.1.jar \
  -D mapred.reduce.tasks=0 \
  -input /stock -output /company_index \
  -mapper firstLetterMapper.py \
  -file /home/msknapp/workspace/stock/stock.mr/scripts/firstLetterMapper.py

您的shabang只会在文件上运行env,您应该将其更改为#!/usr/bin/python#!/usr/bin/env python

这可能是导致env给出非零退出值的原因,因此运行时间约为30秒的映射器会在尝试2后重试,大约10分钟后。