尝试使用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
但这会产生同样的错误。
谁能告诉我这是什么问题?
或者在哪里寻找更好的诊断问题?
非常感谢
保
答案 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