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
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
結論から言うと,プロパティが足りないのだった.
当たり前と言えば当たり前なんだが,設定ファイルをイチから作ると,こんなのが必要なんて気づかない.
<property> <name>dfs.permissions</name> <value>false</value> </property>
を追記する.