一.錯(cuò)誤概述
因?yàn)樾枰褂胔adoop與hbase結(jié)合使用,所以需要為hadoop hdfs升級(jí)使用append寫(xiě)模式。需要對(duì)現(xiàn)有的hadoop 0.20.1 升級(jí)至0.20.205.0; 升級(jí)過(guò)程簡(jiǎn)單的使用 hadoop namenode -upgrade 從 -18 version => -32version(這個(gè)是dfs/name/current/VERSION).但我們發(fā)現(xiàn)0.20.205跟hive不兼容,所以又安裝facebook的hadoop版本(-30版本)。
整個(gè)升級(jí)流程簡(jiǎn)單來(lái)說(shuō)就是: dfs/name/current/VERSION -18 => -32 => -30. 升級(jí)再回滾的過(guò)程。
二. namenode錯(cuò)誤處理過(guò)程
1。啟動(dòng)namenode失敗(第一個(gè)錯(cuò)誤):
org.apache.hadoop.hdfs.server.common.IncorrectVersionException: Unexpected version of storage directory /data/hadoop-tmp/hadoop-hadoop/dfs/name. Reported: -32. Expecting = -30.
at org.apache.hadoop.hdfs.server.common.Storage.getFields(Storage.java:662)
at org.apache.hadoop.hdfs.server.namenode.FSImage.getFields(FSImage.java:741)
at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.read(Storage.java:238)
at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.read(Storage.java:227)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:453)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:158)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:386)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:361)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:274)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:385)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1419)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1428)
解決辦法:
在namenode節(jié)點(diǎn)運(yùn)行:
hadoop namenode -rollback
將-32版本回滾至 -18版本
2。繼續(xù)啟動(dòng)namenode(第二個(gè)錯(cuò)誤):
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /data/hadoop-tmp/hadoop-hadoop/dfs/name is in an inconsistent state: file VERSION has image MD5 digest when version is -18
解決辦法:
將dfs/name/current/VERSION中的 imageMD5Digest 注釋掉,不進(jìn)行MD5完整性檢查。
3。再將升級(jí)-18 => -30版本
hadoop namenode -upgrade
這樣namenode已經(jīng)啟動(dòng)成功。
三.datanode錯(cuò)誤處理過(guò)程
1。啟動(dòng)datanode
2011-12-12 18:06:18,544 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to start datanode org.apache.hadoop.hdfs.server.common.IncorrectVersionException: Unexpected version of storage directory /data/hadoop-tmp/hadoop-hadoop/dfs/data. Reported: -32. Expecting = -30.
解決辦法:
hadoop datanode -rollback
回滾至 -18版本,再升級(jí)至-30版本.
hadoop datanode -upgrade
2. 繼續(xù)啟動(dòng)datanode
11/12/12 19:34:26 INFO datanode.DataNode: Failed to start datanode org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /data/hadoop-tmp/hadoop-hadoop/dfs/data is in an inconsistent state: previous and previous.tmp cannot exist together.
at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:427)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:113)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:332)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:249)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1528)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1477)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1485)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1626)
解決辦法:
直接查看源碼,發(fā)現(xiàn)Storage$StorageDirectory.analyzeStorage()完全是進(jìn)行相關(guān)目錄的狀態(tài)檢查。而且跟生產(chǎn)環(huán)境的hadoop集群對(duì)比,發(fā)現(xiàn)沒(méi)有previous,previous.tmp 兩個(gè)目錄(是升級(jí)的備份文件),所以將這兩個(gè)目錄重命名。然后繼續(xù)啟動(dòng)datanode成功。
最后通過(guò) hadoop namenode -finalize 來(lái)結(jié)束此次升級(jí),以便刪除升級(jí)的備份文件
四.本次處理總結(jié):
1. 對(duì)你的hadoop namenode數(shù)據(jù)及時(shí)做好備份,不管是否是測(cè)試集群
2. 查看hadoop源碼吧,有時(shí)處理問(wèn)題還是得看源碼,因?yàn)樵趃oogle上搜索,資料還是相當(dāng)少的。