Hadoop完全分散モードが動かなくてハマったところ4選

前エントリの完全分散モードでの動作ですが,実はすんなりとは行かず,何日も苦しみました.
ググっては試し,ググっては試し,の繰り返し...
やっとまともに動くようになり,振り返ってみるとショボいミスもありましたが,
これ以上犠牲者が増えないように自分がハマったところを書いておきたいと思います.

Reduceが途中で止まる or ものすごく時間が掛かる

一番悩んだのが,これ.
datanodeを複数にすると発症することが多かった.
なんと原因は/etc/hostsにあり,ホスト名とドメイン名を書いておかなければなかった.


hadoop0をMaster,hadoop1以降をWorkerとすると,

# ×:localhostに記述があると,うまくいかない
127.0.0.1	hadoop1 localhost.localdomain localhost

# ×:問題なさそうだが,ホスト名しか書かれていないので,うまくいかない
127.0.0.1	localhost.localdomain localhost
192.168.0.x	hadoop0
192.168.0.y	hadoop1
192.168.0.z	hadoop2

# ○:これならちゃんと動く
127.0.0.1	localhost.localdomain localhost
192.168.0.x	hadoop0 hadoop0.localdomain
192.168.0.y	hadoop1 hadoop1.localdomain
192.168.0.z	hadoop2 hadoop2.localdomain

この事象が起こる時には,/usr/lib/hadoop-0.20/logs配下のログにWARNINGが出ているはずなので,
おかしいと思ったらまずはログを見よう.

Reduceが途中で止まる or ものすごく時間が掛かる (2)

こちらも上記と同じ事象.
hostsを直したのにどうして...となった時にはHadoopのコンフィグを見直す.


IPアドレスが直接書かれてあると,正常に動作しなかったりした.

# ×:問題なさそうだが,うまくいかない
/etc/hadoop-0.20/conf.my_cluster/master
192.168.0.x
/etc/hadoop-0.20/conf.my_cluster/slaves
192.168.0.y
192.168.0.z

# ○:これならちゃんと動く
/etc/hadoop-0.20/conf.my_cluster/master
hadoop0
/etc/hadoop-0.20/conf.my_cluster/slaves
hadoop1
hadoop2

datanodeが起動直後に落ちる

これはしょうもないミスだが,hadoop.tmp.dirを指定しているにも関わらず,
指定先のディレクトリが存在しないと,datanodeが停止するというもの.


core-site.xmlにこのような記述をした場合,

<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/lib/hadoop-0.20/cache/${user.name}</value>
</property>

ディレクトリをあらかじめ作っておく必要がある.

mkdir -p /var/lib/hadoop-0.20/cache
chmod 1777 /var/lib/hadoop-0.20/cache

Hadoopは親ディレクトリの作成まではしてくれないようだ.

rootしかHDFSにアクセスできない

12/26追記:
ご指摘をいただきました.
コメントのとおり,ユーザごとにディレクトリ切ってパーミッション与えればOKでした.
shun0102さん,ありがとうございます!

# うー,でもhdfsじゃないとダメっぽい...??
# hadoop fs -mkdir /foo
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hdfs:supergroup:rwxr-xr-x
# まあ,ここはhdfsユーザでいこう
# su hdfs
$ hadoop fs -mkdir /foo
$ hadoop fs -ls /
Found 4 items
drwxr-xr-x   - hdfs   supergroup          0 2010-12-26 16:44 /foo
drwxr-xr-x   - user   supergroup          0 2010-12-18 23:54 /input
drwxr-xr-x   - user   supergroup          0 2010-12-26 10:42 /user
drwxr-xr-x   - mapred supergroup          0 2010-12-26 10:24 /var
$ hadoop fs -chown user /foo

# ここからは一般ユーザでやってみる
$ hadoop fs -mkdir /foo/bar
$ hadoop fs -ls /foo
Found 1 items
drwxr-xr-x   - user supergroup          0 2010-12-26 16:45 /foo/bar


結論から言うと,プロパティが足りないのだった.
当たり前と言えば当たり前なんだが,設定ファイルをイチから作ると,こんなのが必要なんて気づかない.


hdfs-site.xml

<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>

を追記する.