Hadoop Streaming - 外部映射器脚本 - 找不到文件

时间:2013-11-26 13:34:01

标签: hadoop hadoop-streaming

尝试使用Streaming在Hadoop上运行mapreduce作业。我有两个ruby脚本wcmapper.rb和wcreducer.rb。我正在尝试按如下方式运行这项工作:

hadoop jar hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar -file wcmapper.rb -mapper wcmapper.rb -file wcreducer.rb -reducer wcreducer.rb -input test.txt -output output

这导致控制台出现以下错误消息:

13/11/26 12:54:07 INFO streaming.StreamJob:  map 0%  reduce 0%
13/11/26 12:54:36 INFO streaming.StreamJob:  map 100%  reduce 100%
13/11/26 12:54:36 INFO streaming.StreamJob: To kill this job, run:
13/11/26 12:54:36 INFO streaming.StreamJob: /home/paul/bin/hadoop-1.2.1/libexec/../bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201311261104_0009
13/11/26 12:54:36 INFO streaming.StreamJob: Tracking URL: http://localhost.localdomain:50030/jobdetails.jsp?jobid=job_201311261104_0009
13/11/26 12:54:36 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201311261104_0009_m_000000
13/11/26 12:54:36 INFO streaming.StreamJob: killJob...
Streaming Command Failed!

查看任何任务的失败尝试显示:

java.io.IOException: Cannot run program "/var/lib/hadoop/mapred/local/taskTracker/paul/jobcache/job_201311261104_0010/attempt_201311261104_0010_m_000001_3/work/./wcmapper.rb": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1042)

我知道hadoop需要复制map和reducer脚本以供所有节点使用,并且相信这是-file参数的目的。但是,似乎脚本没有被复制到hadoop期望找到它们的位置。控制台表明他们正在打包我认为:

packageJobJar: [wcmapper.rb, wcreducer.rb, /var/lib/hadoop/hadoop-unjar3547645655567272034/] [] /tmp/streamjob3978604690657430710.jar tmpDir=null

我也尝试了以下内容:

hadoop jar hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar -files wcmapper.rb,wcreducer.rb -mapper wcmapper.rb -reducer wcreducer.rb -input test.txt -output output

但这会产生同样的错误。

谁能告诉我这是什么问题?

或者在哪里寻找更好的诊断问题?

非常感谢

1 个答案:

答案 0 :(得分:3)

抱歉找到了答案。

脚本已作为Packt“Hadoop初学者指南”

的一部分下载

他们最初将shebang设为:

#!/usr/bin/env ruby

但是这为ruby本身生成了一个找不到文件的错误。检查env的详细信息显示它使用PATH变量来确定ruby的位置。 ruby exe在/ usr / bin中,这是在PATH中。但是,我将其修改为:

#!/usr/bin/ruby

这解决了原始文件未找到错误但在上述问题中产生了错误。

我终于尝试在控制台上自己运行Ruby脚本,这给出了结果:

[paul@lt001 bin]$ ./wcmapper.rb 
bash: ./wcmapper.rb: /usr/bin/ruby^M: bad interpreter: No such file or directory

这看起来很奇怪,因为exe存在于所显示的目录中。

然后我重新创建了脚本文件(通过在控制台输入它们。这解决了问题(脚本在控制台和hadoop上都运行)。我的假设是文件格式本身(可能是^ M)有过错。

总而言之,解释器是“文件未找到”错误甚至与任务日志中列出的文件相关的是脚本文件本身。

希望有所帮助。

P