Hadoop Streamingのハマりどころ3つ

Hadoop Streamingでもつまづいては修正し,再びつまづいては修正しの繰り返しでした.
今回も,これ以上犠牲者を増やさないためのメモ3つ.

Streaming Command Failed!で落ちる

まず,Mapper,Reducerは絶対パスで指定する必要があります.

# ×:相対パスだとうまくいかない
$ hadoop jar hadoop-streaming-0.20.2+737.jar ... -mapper ./mapper.rb -reducer ./reducer.rb

# ○:絶対パスで指定すること
$ hadoop jar hadoop-streaming-0.20.2+737.jar ... -mapper /path/to/mapper.rb -reducer /path/to/reducer.rb

Streaming Command Failed!で落ちる (2)

考えてみれば当たり前なのですが,MapperとReducerが置かれているディレクトリにパーミッションがないと,落ちます.
CentOSはhomeに本人しかアクセスできないので,読み取りできるようにしてあげます.

# ×:参照権限がなかった
$ ll
drwx------ 4 user user 4096 Dec  9 23:05 user

# ○:読み取りできるように(homeを見せたくない場合は,別のディレクトリにするとよいです)
$ chmod a+rx /home/user/
$ ll
drwxr-xr-x 4 user user 4096 Dec  9 23:05 user

mapred.map.tasksを設定しても,Map数が2になってしまう

コマンドライン上で"mapred.map.tasks=10"としてもなぜかMap数が増えない,という場合には
mapred.tasktracker.map.tasks.maximumを設定します.
ああ,Streamingかどうかは関係ないかな...

vi /etc/hadoop-0.20/conf/mapred-site.xml

<property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>4</value>
</property>


書き換えた後に,反映します.

# tasktrackerだけ再起動すればいいかもしれないが,念のため.
for service in /etc/init.d/hadoop-0.20-*; do sudo $service stop; done
for service in /etc/init.d/hadoop-0.20-*; do sudo $service start; done

-jobconf option is deprecatedが出る (おまけ)

ハマりどころではありませんが,-jobconfオプションは-Dに変わっているので,気をつけましょう.

# △:-jobconfの場合,ワーニングが出る
$ hadoop jar hadoop-streaming-0.20.2+737.jar -jobconf mapred.map.tasks=10 ...
WARN streaming.StreamJob: -jobconf option is deprecated, please use -D instead.
...

# ○:-Dにすれば問題ない
$ hadoop jar hadoop-streaming-0.20.2+737.jar -D mapred.map.tasks=10 ...