Hadoop Streaming永远不会完成

问题描述 投票:2回答:2

我正在尝试学习如何使用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虚拟机上运行伪分布式模式。

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

python-2.7 hadoop hadoop-streaming
2个回答
1
投票

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

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

这是因为运行脚本的机器不知道如何处理它。如果你用./firstLetterMapper.py而不是python firstLetterMapper.py运行它,它可能只会导致你的计算机冻结


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秒,大约10分钟后尝试2重试。

© www.soinside.com 2019 - 2024. All rights reserved.