事の発端は、CDH4.1のリリースがされたのでテスト環境のCDH4.0をアップグレードしてみよう、というものでした。
本来はすんなり成功するものなのですが、前回のクラスタ起動から久々のNameNode再起動ということで、その間に隣の人がよからぬファイルを作成していたことが原因で、アップグレードが困難になりました、その記録になります。
NameNodeのSafeMode ONが永久に終わらなかった件
アップグレードが無事に終わったと思いきや、NameNodeのSafeMode ONが全然終わらずイライラしていました。NameNodeのログにも管理画面にも一切変化がないので、dfsadminでガスッとOFFにしてみたらOFFにはなったのですが、気持ち悪いのでちゃんと調べてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 半日放置してもSafeMode ONのままなのでコマンドでOFFを実行したらOFFにはなった $ hdfs dfsadmin -safemode leave # fsckしたらエラー $ hadoop fsck /test ~snip~ /test/1 Fsck on path '/test' FAILED # 一応ブロックのチェックしたけど $ hadoop fsck / -files -blocks > /var/tmp/hadoop_fsck-files-blocks.txt # テスト環境なのでめんどくさくなってザクリ hadoop fsck / -delete # からのNameNode再起動とかしてみてもSafeModeは直らない # よく見たら /test/1 とか /test/2 が不審なファイルになっていて、 # 問い詰めたら隣の人が、それは実験で作ったシンボリックリンクだよ、と判明 # なんと、どうやって作成したかは忘れたという・・・ |
と、いうことで結果的にはそのシンボリックリンクを消したら、SafeMode ONの問題は解消し、いつも通り数十秒でOFFになってくれました。
で、せっかくシンボリックリンクについて調べたので記録しておきます。
シンボリックリンクの現状調査
リンクの作り方
hadoop fs
[#HDFS-245] Create symbolic links in HDFS – ASF JIRA を見てると hadoop fs コマンドでシンボリックリンクが作成できそう!
1 2 3 4 5 6 7 |
$ hadoop fs Usage: hadoop fs [generic options] [-cat [-ignoreCrc] <src> ...] [-chgrp [-R] GROUP PATH...] ~snip~ [-touchz <path> ...] [-usage [cmd ...]] |
・・・ないじゃねーか! 次!!
HDFS Fuse
1 2 |
$ ln -nfs /mnt/hadoop/test/test.log /mnt/hadoop/test/symlink ln: creating symbolic link `/mnt/hadoop/test/symlink': サポートされていない操作です |
怒られたじゃねーか! 次!!
WebHDFS
WebHDFS REST API – Create a Symbolic Link こんなものがあったのか! ということで実行してみる。
1 2 3 4 5 6 |
# Linuxコマンドでいえば ln -s /test/test.log /test/symlink $ curl -i -X PUT "http://hostname-of-namenode:50070/webhdfs/v1/test/symlink?op=CREATESYMLINK&destination=/test/test.log" HTTP/1.1 200 OK Content-Type: application/octet-stream Content-Length: 0 Server: Jetty(6.1.26.cloudera.2) |
できたくせー! WebHDFS最強伝説。
リンクの確認
hadoop fs
1 2 3 4 5 6 7 8 9 10 11 |
# リンク先が表示される $ hadoop fs -ls /test/symlink ls: /test/test.log # 中身を見ようとしてもリンク先が表示される・・・ $ hadoop fs -cat /test/symlink cat: /test/test.log # 元ファイルは正常 $ hadoop fs -cat /test/test.log I'm GedowFather!! |
リンクとして機能してねぇ・・・
HDFS Fuse
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# やはり ??? で誤魔化しにきた $ ls -l /mnt/hadoop/test/ ls: cannot access /mnt/hadoop/test/symlink: そのようなファイルやディレクトリはありません -????????? ? ? ? ? ? symlink -rw-r--r-- 1 root 99 18 2012-10-05 13:04 test.log # 直接で見えるわけなし $ ls -l /mnt/hadoop/test/symlink ls: cannot access /mnt/hadoop/test/symlink: そのようなファイルやディレクトリはありません # 元ファイルは正常 $ cat /mnt/hadoop/test/test.log I'm GedowFather!! |
WebHDFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# なぜ見つけられないのだ・・・ # - GETFILESTATUS でも同じ $ curl -i -L "http://hostname-of-namenode:50070/webhdfs/v1/test/symlink?op=OPEN" HTTP/1.1 403 Forbidden Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26.cloudera.2) {"RemoteException":{"exception":"UnresolvedPathException","javaClassName":"org.apache.hadoop.hdfs.protocol.UnresolvedPathException","message":"/test/test.log"}} # 元ファイルは見える $ curl -i -L "http://hostname-of-namenode:50070/webhdfs/v1/test/test.log?op=OPEN" HTTP/1.1 307 TEMPORARY_REDIRECT Content-Type: application/octet-stream Location: http://slave-of-hostname:50075/webhdfs/v1/test/test.log?op=OPEN&namenoderpcaddress=10.1.20.199:8020&offset=0 Content-Length: 0 Server: Jetty(6.1.26.cloudera.2) HTTP/1.1 200 OK Content-Type: application/octet-stream Content-Length: 18 Server: Jetty(6.1.26.cloudera.2) I'm GedowFather!! |
同じ方法で作ったものが見れないってどういう了見や。
リンクの削除
hadoop fs & HDFS Fuse
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# それっぽい表示だけどなんも消えてない(リンク先を表示してるだけ) $ hadoop fs -rm /test/symlink rm: /test/test.log # 見えないから消せない $ rm /mnt/hadoop/test/symlink rm: cannot remove `/mnt/hadoop/test/symlink': そのようなファイルやディレクトリはありません # 消えてない $ ls -l /mnt/hadoop/test/ ls: cannot access /mnt/hadoop/test/symlink: そのようなファイルやディレクトリはありません -????????? ? ? ? ? ? symlink -rw-r--r-- 1 root 99 18 2012-10-05 13:04 test.log |
当然の結果なので最後の手段へ・・・
WebHDFS
1 2 3 4 5 6 7 8 9 10 11 12 |
# 手応えアリ $ curl -i -X DELETE "http://hostname-of-namenode:50070/webhdfs/v1/test/symlink?op=DELETE" HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26.cloudera.2) {"boolean":true} # き、消えたー! $ ls -l /mnt/hadoop/test/ -rw-r--r-- 1 root 99 18 2012-10-05 13:04 test.log |
シンボリックリンクまとめ
操作\手段 | hadoop fs | Fuse | WebHDFS |
create | × | × | ◯ |
open | △ | × | × |
delete | × | × | ◯ |
ちゃんとした手段はあるのかもしれないけど、私の思いつく一般的な方法では、シンボリックリンクとして機能しないどころか、リンクが存在するだけでNameNodeを再起動した時に SafeMode ON が終わらなくなる、ということで・・・
また1つHadoopの闇を見通せて気分は悪くないですな。