Hadoopのnamenode兼datanodeが電源瞬断のせいで壊れてしもうた。
勉強用のHadoopなのでダメージはないのだが、せっかくなのでfsckなどを試した結果を記す。
hadoop-1.0.0。
OS側でもfsckはしておいた。
サマリ
- HDFSにもfsckがある。
- hadoop fsckでチェック、修正できる。
- hadoop fsckと叩けば使い方の簡単な説明が表示される。
- namenodeがsafemodeのためにHDFSが読み取り専用になっていることがある。
- 読み取り専用ではfsckで修正できないので、safemodeから出る必要がある。
HDFSでのfsck
hadoop fsck <path>と指定すればよい。
CORRUPT!とのことで、壊れておりますなあ。
$ hadoop fsck /
FSCK started by hadoop from /172.29.17.159 for path / at Wed Dec 25 18:51:37 JST 2013
(略)
/var/hadoop/mapred/system/jobtracker.info: MISSING 1 blocks of total size 4 B.Status: CORRUPT
Total size: 45638364128 B
Total dirs: 5321
Total files: 13059
Total blocks (validated): 9819 (avg. block size 4647964 B)
********************************
CORRUPT FILES: 2470
MISSING BLOCKS: 2498
MISSING SIZE: 15590981155 B
CORRUPT BLOCKS: 2498
********************************
Minimally replicated blocks: 7321 (74.559525 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 7321 (74.559525 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 0.7455953
Corrupt blocks: 2498
Missing replicas: 7321 (100.0 %)
Number of data-nodes: 1
Number of racks: 1
FSCK ended at Wed Dec 25 18:51:38 JST 2013 in 1185 milliseconds
The filesystem under path '/' is CORRUPT
壊れている場合の対処:消去か移動
壊れている場合には対処が二つ。
壊れているブロックを消すか、lost+foundに移すか。
消す場合には-delete, 移す場合には-moveを指定する。
以下は消した場合の例….なのだが、namenodeがsafemodeにいるので変更が出来ないとのこと。
$ hadoop fsck / -delete
FSCK started by hadoop from /172.29.17.159 for path / at Wed Dec 25 18:58:29 JST 2013
.
/tmp/hadoop-hadoop/mapred/staging/hadoop/.staging/job_201308300823_0001/job.jar: CORRUPT block blk_3947350403157044322
/tmp/hadoop-hadoop/mapred/staging/hadoop/.staging/job_201308300823_0001/job.jar: MISSING 1 blocks of total size 66249 B.FSCK ended at Wed Dec 25 08:58:29 JST 2013 in 5 milliseconds
Cannot delete /tmp/hadoop-hadoop/mapred/staging/hadoop/.staging/job_201308300823_0001/job.jar. Name node is in safe mode.
The ratio of reported blocks 0.7456 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
Fsck on path '/' FAILED
safemodeとは
そもそもnameodeは通常の動作として、起動時には状態がsafemodeである。
safenodeのまま待機をしているうちに、datanodeが起動し、保管しているブロックの報告をnamenodeに行う。
namenodeは、充分なブロックの確認ができれば自動的にsafemodeを出る。
「充分なブロック」がどれくらいか、は設定できる。
safemodeのときは読み取り専用になり、複製や消去もできないが、手動でsafemodeに入ったり出たりすることができる。
以下、公式からの引用
Safe mode is entered automatically at Namenode startup, and leaves safe mode automatically when the configured minimum percentage of blocks satisfies the minimum replication condition. Safe mode can also be entered manually, but then it can only be turned off manually as well.
Safe mode maintenance command. Safe mode is a Namenode state in which it
- does not accept changes to the name space (read-only)
- does not replicate or delete blocks.
今回、問題の発生したnamenodeはdatanodeも兼ねている。
電源瞬断でブロックが壊れているからブロックの報告はできないし、そもそもnamenodeが保管しているメタデータも壊れている。
ボロボロである。
したがって、いつまで待ってもsafemodeから出るはずがない。
そこで手動でsafemodeを解除する。
safemodeの操作
safemodeの操作はhadoop dfsadmin -safemodeに続けて行う。
getで状態を得る。
enterでsafemodeに入る。
leaveでsafemodeから出る。
面白いのは、wait。
safemodeから出たらコマンド実行する、というもの。
# 状態を得る。
$ hadoop dfsadmin -safemode get
# 終わってからコマンド実行
$ hadoop dfsadmin -safemode wait
# safemodeに入る。
$ hadoop dfsadmin -safemode enter
# safemodeから出る。
$ hadoop dfsadmin -safemode leave
以下、実際の例。
safe modeがONになっているので、OFFに。
$ hadoop dfsadmin -safemode get
Safe mode is ON
$ hadoop dfsadmin -safemode leave
Safe mode is OFF
改めてfsck / -delete
blockが2000個くらい消えた。ま、まあ勉強用だし(震え声)
$ hadoop fsck / -delete
FSCK started by hadoop from /172.29.17.159 for path / at Wed Dec 25 19:05:54 JST 2013
(略)
.......Status: HEALTHY
Total size: 29928657533 B
Total dirs: 5321
Total files: 10589
Total blocks (validated): 7319 (avg. block size 4089173 B)
Minimally replicated blocks: 7319 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 7319 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 1.0
Corrupt blocks: 0
Missing replicas: 7319 (100.0 %)
Number of data-nodes: 1
Number of racks: 1
FSCK ended at Wed Dec 25 19:05:55 JST 2013 in 1696 milliseconds
The filesystem under path '/' is HEALTHY
HEALTYになったので、これでhadoopが使える状態に戻った。
以上。