0

元の質問 (以下の長いバージョン)。短いバージョン: マッパーとして ruby​​ スクリプトを使用して Hadoop ストリーミングを実行し、すべてのクラスター ノードに rvm をインストールしても機能しません。ruby が Hadoop 起動シェルによって認識されていない (および rvm が正しくロードされていない) ためです。なんで?


wukongHadoop の map/reduce ジョブを作成するための gem として使用したいと考えていました。問題は、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正しく供給されていないと思います。ただし、再起動が必要でした。

于 2012-08-15T10:17:15.180 に答える
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

そうでない場合は、use コマンドが機能しなかったことを意味します。

于 2012-08-08T15:44:21.790 に答える
0

こちらをご覧ください: http://zachmoshe.com/2015/02/23/use-ruby-gems-with-hadoop-streaming.html

Hadoop ストリーミングを使用して gem で ruby​​ マッパーを実行する方法を示します。

あなたが尋ねてから3年経っていることは知っていますが、他の誰かを助けるかもしれません..

于 2015-02-24T21:45:44.217 に答える