Jrubyで Java用の Spreadsheets Data API を使ってみるHadoop Streaming の Mapper と Reducer を初めて書いて感じたこと

2010年01月24日

Hadoop Streaming メモ

ClouderaのVMで Hadoop-Streaming をいじったときの調べ物&備忘メモ。

■処理対象の指定
処理対象ファイルが特定のフォルダの下にある場合は、-input で親フォルダ名を指定するだけで中身のファイルを全て拾ってくれる。

input が2個以上ある場合は -input (対象) -input (対象) というようにして複数回指定すればよい。

inputとして渡されたファイルの拡張子が .gz か .deflate だと、mapperに読み込む前にHadoopが自動的に解凍してくれる(ZIP、JARも可能)
・output も圧縮することも可能( mapred.output.compress=true)
・ファイルのパスを指定する際に使えるワイルドカードは、「?」」と「*」と {a,b} (←コンマで区切られた名前の列挙。 A or Bの意)。

input、outputではディレクトリを指定できるが、その中にディレクトリが含まれていた場合、ファイルとしてそのディレクトリを処理しようとするのでエラーになる可能性がある(ディレクトリの中にファイルが含まれていたとしても、再帰的にそれらのファイルを処理してくれたりはしないので、そういうケースではファイル単位のパスで指定するか、Glob+フィルターの組み合わせを使う)

■ mapper と reducer の指定
mapperだけのジョブで reducerが不要な場合は mapred.reduce.tasks=0 を指定すると、mapper実行後に結果が書き出される。

rubyコマンドの場所指定
mapper でrubyのスクリプトを指定する場合はrubyの場所を要指定。
1) -mapper に /usr/bin/ruby など フルパスで書いたruby コマンドも含める
2) mapper.rb の中の shebang に#!/usr/bin/ruby のようにrubyコマンドのフルパスを書いた上で普通に -mapper xxxx.rb のように指定する。
* RUBY_HOME/bin に path が通っていても、 上記のいずれかをやらないとエラーになるので注意)。

実行時エラーで「(main): java.io.IOException: Broken pipe at java.io.FileOutputStream.writeBytes(Native Method)」がでたときは、Rubyの実行エラーを疑うべし。mapperとreducerに"cat"を指定するとファイル名やパスが原因か切り分けしやすい。
・Rubyコマンドにパスが通っていない
・スクリプトのファイル名うち間違い
・require 対象が実行環境にインストールされていない
・単なるスクリプトで error が発生
・mapper はエラーなしでも、reducerで上記のどれかが起きた

-fileオプションを使わない場合、mapper とreducer にlinuxコマンドを指定する場合以外はOS上での絶対パス指定が基本。カレントディレクトリにPathが通ってればファイル名だけでもOK。(hadoop fs -ls の HDFS上でのROOTからの絶対パスではないので注意)

-fileオプションを使うと、事前にそのファイルを put しておかなくてもノードに実行時に転送される。転送されたスクリプトファイルは実行後にHDFS側には残らない。

-fileでスクリプトを渡した場合は mapper, reducer のスクリプトはカレントディレクトリに展開されるので、フルパスで指定する必要はない。
(指定例)
hadoop jar ./hadoop-0.20.1+152-streaming.jar -input in -output out -mapper "mapper.rb" -reducer "reducer.rb" -file "/home/training/mapper.rb" -file "/home/training/reducer.rb"

-cacheFile、-cacheArchive を使うと、ファイルやフォルダをMapperやReducerから見たカレントディレクトリに置ける。展開先は mapred.local.dir で指定

-cacheFile hdfs://my_dir/stop-word-list.txt#stop-word-list.txt のように書くと#から先がプログラムから参照する際のSymlink名になり、プログラム中で open("stop-word-list.txt","r") のようにパス記述なしで参照できる。

■ログの場所
 
steps/1/ (stepsとは複数の処理をチェーンする場合の処理の番号)
 syslog
  コンソールと同じ表示 ← Job not Successful!など
controller
  hadoopコマンド の実行時の起動オプションが表示される

task-attempts
 strerr
  Rubyスクリプトの実行エラーはココに出る
 syslog
  Broken Pipeや Bad file descriptorが出る


maru_tak at 22:44│Comments(0)TrackBack(0)

トラックバックURL

コメントする

名前
 
  絵文字
 
 
Jrubyで Java用の Spreadsheets Data API を使ってみるHadoop Streaming の Mapper と Reducer を初めて書いて感じたこと