当前位置: 首页 > 知识库问答 >
问题:

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

杭镜
2023-03-14

尝试使用Streaming在Hadoop上运行mapduce作业。我有两个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和减少器脚本以供所有节点使用,并相信这是-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个答案

翟聪
2023-03-14

抱歉,我找到了答案。

这些脚本已作为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

 类似资料:
  • 我正在处理symfony2,并发现此错误: 未找到名为“Acme”的映射文件。博客包。实体帖子。类“Acme\BlogBundle\Entity\Posts”的php。500内部服务器错误-映射异常 我生成实体php应用程序/控制台原则:生成:实体 实体名称:AcmeBlogBundle:Post 格式:php 我将所有内容放在Acme:BlogBundle:Entity目录中。 这是我使用get

  • 我正在构建一个REST API, 和ActiveBid类 和我的泽西请求映射器,它具有获取数据的逻辑 有人能帮我吗?我不知道和卡桑德拉共事会这么难。

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 我是使用Spring SOAP W的新手。我学习了许多教程,并试图适应这个示例的需要,但从未成功,我得到了这样的消息:找不到[SaajSoapMessage { http://ws . veritran . net/vtAuthServer/types } validatePOTCRequest]的endpoint映射 这是梅的代码: 这是我的终点: 这是我的服务级别: 这是我的WSDL定义 最后

  • 问题内容: 我尝试按照Go Docs进行操作,以调用仅从GO输出“ Hello”的python脚本,但到目前为止一直失败。 或者我也尝试过调用仅调用python脚本的shell脚本,但是也失败了: 有什么想法我将如何实现? 编辑 我按照注释中的建议解决了问题,并将完整路径添加到exec.Command()。 问题答案: 您是否尝试添加或,例如: 您可以在“ 如何在Golang中执行简单的Windo