0

原始问题(下面的长版本)。短版:使用 ruby​​ 脚本作为映射器运行 ​​hadoop 流,并在所有集群节点上安装 rvm 不起作用。因为hadoop启动的shell不知道ruby(并且没有正确加载rvm)。为什么?


我想wukong用作一个 gem 来为 hadoop 创建 map/reduce 作业。问题是wukonghadoop无法加载gem(即找不到)。Hadoop 作业向我显示以下错误:

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- wukong (LoadError)
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /tmp/mapr-hadoop/mapred/local/taskTracker/admin/jobcache/job_201207061102_0068/attempt_201207061102_0068_m_000000_0/work/./test.rb:6:in `<main>'
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:572)
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:136)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:394)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:327)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1109)
at org.apache.hadoop.mapred.Child.main(Child.java:264)

但是,cat somefile | ./test.rb --map按预期在所有集群机器上运行。我还在我的测试文件中包含了一些调试打印,我可以在 hadoop 日志中检索它们。跑步时

$stderr.puts `gem list`

它产生所有的宝石wukong,包括

$stderr.puts $LOAD_PATH.inspect

$LOAD_PATH产生与打印运行本地(不是由 hadoop 启动)ruby 脚本时相同的路径。

为什么 hadoop 启动的 ruby​​ 脚本找不到明确安装并正常工作的 gem?


hadoop 启动为:

hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar \
-libjars /opt/hypertable/current/lib/java/hypertable-0.9.5.6.jar,/opt/hypertable/current/lib/java/libthrift-0.8.0.jar \
-Dmapred.child.env="PATH=$PATH:/usr/local/rvm/bin/rvm" \
-mapper '/home/admin/wukong/test.rb --map' \
-file /home/admin/wukong/test.rb \
-reducer /bin/cat \
-input /test/test.rb \
-output /test/something2
4

3 回答 3

0

你在用红宝石吗?

确保您运行:

rvm use 1.9.3

并且echo $GEM_PATH应该返回如下内容:

/usr/local/rvm/gems/ruby-1.9.3-p194:/usr/local/rvm/gems/ruby-1.9.3-p194@global

如果不是,则表示使用命令不起作用。

于 2012-08-08T15:44:21.790 回答
0

不知何故,我设法通过重新启动集群中的所有机器来使其工作。我认为rvm来源不正确。尽管需要重新启动,但斯坦奇。

于 2012-08-15T10:17:15.180 回答
0

看看这里:http: //zachmoshe.com/2015/02/23/use-ruby-gems-with-hadoop-streaming.html

它展示了如何使用 Hadoop Streaming 运行带有 gem 的 ruby​​ 映射器。

我知道你问了三年后,但也许它会帮助别人..

于 2015-02-24T21:45:44.217 回答