外部Map器脚本-找不到文件

8hhllhi2  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(254)

尝试使用流在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

但这会产生同样的错误。
有人能告诉我问题出在哪里吗?
或者在哪里寻找更好的诊断问题?
非常感谢
保罗

d4so4syb

d4so4syb1#

抱歉找到答案了。
这些脚本是作为packt“hadoop初学者指南”的一部分下载的
他们最初将shebang设置为:


# !/usr/bin/env ruby

但这为ruby本身生成了一个filenotfound错误。检查env的详细信息表明它使用path变量来确定ruby的位置。ruby exe在/usr/bin中,这在路径中。但是,我将其修改为:


# !/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

相关问题