按照书上95的内容~~写了一堆ruby。。。。(真是对这个语言无感。。。)
结果hadoop运行不出来。。。。cry 啊。。。。
错误是:# of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201407231146_0005_m_000000
上网查到了这个:
http://f.dataguru.cn/thread-266297-1-1.html
发现我的虚拟机上根本没有装什么ruby。。。
用 $ sudo apt-get install ruby 装了个旧的ruby。。。将就着用吧。。我觉得。。。
用 whereis ruby找到安装的文件夹,是usr/bin,所以把ruby的script都改了~~之后呢,又是同样的错误。。。
顺便学到了stop-all.sh可以停止所有hadoop进程~~之前都是一个个删的。。囧。。。
把ruby scripts的头改成#!/usr/bin/env ruby之后,mapper没问题,reducer又有这个exceeded allowed limit的问题。。好坑!!!
找到了 http://www.linuxidc.com/Linux/2012-09/70972.htm
设置之后,可以运行了。。。但是结果什么都没有。。。感觉是掩耳盗铃的方法。。。。
找了半天结果未果。。。只能找其他ruby的例子,找到了网页
http://www.bigfastblog.com/map-reduce-with-ruby-using-hadoop#coding-your-map-and-reduce-scripts-in-ruby
里面说可以先用
cat /usr/share/dict/words | ruby map.rb | sort | ruby reduce.rb来先验证一下ruby代码对不对~~~验证的结果把我自己蠢哭了。。。。把变量拼错了!!!!难怪没有结果!!!!!!
综上所述,
如果碰到问题:
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:362) at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:576) at org.apache.hadoop.streaming.PipeReducer.close(PipeReducer.java:137) at org.apache.hadoop.io.IOUtils.cleanup(IOUtils.java:232) at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:539) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:421) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) at org.apache.hadoop.mapred.Child.main(Child.java:249)就用一下网址解决
http://www.linuxidc.com/Linux/2012-09/70972.htm
运行之前要先检查ruby scripts是不是对!!!!蠢哭了我!!!!
不过最终运行出来,耶耶耶耶!!!!