1、報錯
Java.io.IOException:Premature EOF from inputStream
可以看到是重演編輯日誌時候出錯了
2、hadoop元數據目錄
Edits_ 編輯日誌
Fsimage_ 通過編輯日誌合併而來的
Edits_inprogress 正在往裏寫的編輯日誌
Seen_txid 類似於偏移量,保存了最後一條數據txid,每次重啓namenode重演編輯日誌時會從fsimage讀到保存的id處
VERSION 保存集羣id跟塊池id等信息
雙namenode
備用namenode會定時的進行edits合併,合併爲fsimage,備用namenode長時間不工作會導致edits越來越多,重演編輯日誌時會造成堆內存溢出,啓動失敗
3、查看編輯日誌方式
Hadoop客戶端提供查看編輯日誌與fsimage命令
可以導出爲xml
hdfs oiv -p XML -i fsimage_0000000000000092691 -o fsimage.xml
hdfs oev -i edits_0000000000000091059-0000000000000092691 -o edit.xml
4、排查
1)每次重啓namenode時候都會卡在同一個編輯日誌,除了fsimage會從本地進行讀取,未合併的edits會通過http協議從journalnode獲取
2)這樣來看,跟備用namenode 元數據目錄下的數據關係不大,journalnode一共存了三份,理論上應該有驗證機制,日誌不會有太大問題,除非主namenode寫日誌時就有問題。
3)查看是否edits日誌文件損壞,通過導出xml命令,如果是因爲文件損壞那麼,到處xml時候也會報錯,但是發現可以正常導出xml,xml文件也有正常的開始結束標記。
4)繼續查看報錯日誌,可以看到每次失敗時候都會進行多次GC,那可能是與jvm內存有關。調大JVM堆內存(基於CDH修改)
5)重啓namenode成功。
5、解決問題
調大jvm堆內存
6、避免此類問題出現
儘量避免長時間單namenode進行工作,這樣導致未合併的編輯日誌越來越多,下次重演日誌時內存不足。