擬似分散モードのデバッグ方法

IPv6に今のところ非対応のように見えるので、まずはv4アドレスのみ使うように徹底しておくと良いと思う。
私が何かとハマったその間に利用した幾つかのデバッグ方法について、メモ。
つーかね、Hadoop、おかしくなった時の確認がまだまだ難しいわ。v6アドレスを予期してないってのもアレだけど、ちょっと想定から外れた動作をするだけでJavaのExceptionで落ちるのが、ほんと分かりにくくて参る。まだまだver0.20.2だから文句言えたものではないのだけど、現時点ではとても危ういものだという理解は共通のものにしておかなければならないと思う。

ともあれ、動かなかったときのためのデバッグ方法を幾つか。

jps

とりあえず、bin/start-all.shした直後はjpsでノードが立ってるか確認すると良い。

> jps
76779 DataNode
76900 JobTracker
76970 TaskTracker
76850 SecondaryNameNode
76708 NameNode
80946 Jps

これ見れば、DataNodeが立ってない場合には一目瞭然。

Web画面

Namenode/Datanode

http://localhost:50070/ にて、namenodeの動作状況が確認できる。ここのCluster SummaryのLive Nodesが1であれば正常にDataNodeが認識されている。このLive Nodesという文字部分のリンクを辿れば自ホストのDataNodeへアクセスできる。
DataNodeは、デフォルトでは50075ポートにて公開される。http://localhost:50075/からそのDatanodeの中身が確認出来ればOK。アクセス不能だったらDatanodeが多分立ってない。

Jobtracker/Tasktracker

http://localhost:50030/ にて、Jobtrackerの動作状況が確認できる。ここのCluster SummaryのNodesが1であれば正常にTaskTrackerが認識されている。この数字のところのリンクを辿れば自ホストのTaskTrackerへアクセスできる。
TaskTrackerは、デフォルトでは50060ポートにて公開される。http://localhost:50060/にてTaskTrackerのStatusが見られればOK。アクセス不能だったらTaskTrackerがうまく動いていない。

namespaceID問題

DataNodeとNameNodeではnamespaceIDが一致していなければならないものの、何故かPrimary NameNodeの値が一致しなくなることがある。
${hadoop.tmp.dir}/dfs/data/current/VERSION及び${hadoop.tmp.dir}/dfs/name/current/VERSIONの中の値を一致するよう変更すればよい。
まずは確認。

> cat /usr/local/hadoop/datanode/suu-g/dfs/*/current/VERSION
#Sat May 08 09:50:29 GMT 2010
namespaceID=782236599
storageID=DS-861144246-XXX.XXX.XXX.XXX-50010-1273312229312
cTime=0
storageType=DATA_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18

これで全て一致していればよし、一致していなければ一致するよう編集する。
VERSIONの中身を一致させても再起動後に変わってしまう場合は、${hadoop.tmp.dir}以下を消してしまい、hadoop namenode -formatし直すのがもっとも簡単。${hadoop.tmp.dir}/dfs/namesecondary/previous.checkpoint/VERSIONが関係している可能性はあるけれど、未確認。

dfsadmin

> bin/hadoop dfsadmin -report
Configured Capacity: 233995026432 (217.92 GB)
Present Capacity: 190549327872 (177.46 GB)
DFS Remaining: 190549145600 (177.46 GB)
DFS Used: 182272 (178 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Name: XXX.XXX.XXX.XXX:50010
Decommission Status : Normal
Configured Capacity: 233995026432 (217.92 GB)
DFS Used: 182272 (178 KB)
Non DFS Used: 43445698560 (40.46 GB)
DFS Remaining: 190549145600(177.46 GB)
DFS Used%: 0%
DFS Remaining%: 81.43%
Last contact: Sat May 08 12:02:14 GMT 2010


>

ちゃんと動いていればこの通りにdatanodeの状態を表示してくれる。

> bin/hadoop dfsadmin -safemode get
Safe mode is OFF
> bin/hadoop dfsadmin -safemode enter
Safe mode is ON
> bin/hadoop dfsadmin -safemode leave
Safe mode is OFF

長門セーフモードはオフの方がいい。書き込みがうまくいかないエラーの原因になるとかどっかで読んだ気がする。

netstat

まあ、普通、ポートが開いてるかくらいは見るよね。

> netstat -an | grep LISTEN
(chomp)
tcp4       0      0 *.50060                *.*                    LISTEN
tcp4       0      0 *.50030                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9001   *.*                    LISTEN
tcp4       0      0 *.50090                *.*                    LISTEN
tcp4       0      0 *.50020                *.*                    LISTEN
tcp4       0      0 *.50075                *.*                    LISTEN
tcp4       0      0 *.50010                *.*                    LISTEN
tcp4       0      0 *.50070                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000   *.*                    LISTEN
(chomp)

このあたりが立ってればたぶんいい。きっといい。すごくいい。*1

> netstat -an | grep 900
tcp4       0      0 XXX.XXX.XXX.XXX.9001    XXX.XXX.XXX.XXX.17095   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.17095   XXX.XXX.XXX.XXX.9001    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9001    *.*                     LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000    XXX.XXX.XXX.XXX.24635   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.24635   XXX.XXX.XXX.XXX.9000    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9000    *.*                     LISTEN

9000が自分のアドレス同士でESTABLISHEDなら、datanodeが認識されてるということ。
9001が自分のアドレス同士でESTABLISHEDなら、tasktrackerがjobtrackerに認識されてるということ。

logs

ログ嫁
logs/hadoop-hishidama-namenode-*.log
初期状態ではinfo状態なので、動作がひどくおかしい場合には設定変えると良いかも知れない。

dfs見てみる

腹減って息切れしてきた

> bin/hadoop fs -ls /

とかやると、namenode/datanodeが動いていればdfs上のディレクトリ構成が見える。

*1:9000及び9001は設定ファイルで設定したポートなので、人によって異なる