驚心動魄的Hadoop-6小時350T數據恢復
來自專欄瑞琪的程序之路
LuckQI
在這裡你可以得到不只是技術,關注即可習得新技能
這次文章是記錄一下數據恢復。
上周五在調試Spark數據的時候發現了一個問題,就是一直顯示No lease的問題,我們的實時處理程序升級之後,處理的數據量在一個小時內暴增1T。我們的小時程序Spark,有的單個key數據重複導致value值增大,程序運行卡住,根據網上查的參數進行調整。
Hadoop
在調整前,將Hadoop進行關閉 .
stop-all.sh 進行關閉
- 我們在第一步進行關閉的時候這裡就出現問題。。。關閉hadoop.sh 出現異常,關閉失敗。只好使用linux 上的kill 強制殺死所有的關於hadoop有關的進程。
- 重新啟動出現錯誤,一直啟動不起來。這個錯誤應該是同步數據 的問題。hadoop 在線上沒有停止的時候就出現錯誤了
- 解決上面的問題 ,查閱資料 。。**重點**,`*網上給的方案是./hadoop namenode format* `,我當時都沒細看。。原諒我這個渣渣。
- 執行之後我的一個主節點的namenode 裡面存儲的數據刪除了。好吧當時心涼了。給運維打電話聯繫,說恢復不了。在這裡心更涼。
- 最終沒有棒法開始從網上找方案恢復。網上說到 namenode數據是可以恢復的。因為是集群 有兩個namenode,可以做同步進行操作。
現在開始說下怎麼弄,當然這個方案會丟失一部分數據,這也是沒有辦法的事情。幸好丟失的數據還可以通過原先的數據跑回來。萬幸。
數據恢復。
1. 在Hadoop中,我們可以看到有三個關注的地方
- 數據存儲目錄下的VERSION ,裡面的namespaceID,clusterID與其他兩個VERVION保持一致,有多少個數據目錄都要統一一致,集群上的其他節點上在修復的時候也要與其一致,這樣才能在集群關聯的時候關聯起來。關聯上之後節點會在圖示上 展示。關聯不上的,可以去datanode節點日誌查看原因,一般是namespaceID沒有一致導致關聯不上。修改數據目錄下的VERSION下的namespaceID 保持一致即可。
- Hadoop中的journalnode下的VERSION 裡面的namespaceID ,clusterID 與其他的保持一致
- 主磁碟下的name目錄下有一個VERSION 裡面也有版本號要保持一致跟上面兩個操作一致。
三步操作,把集群中這三個 namespaceID還有ClusterID 保持一致,這個一致時建立在namenode節點上的,並且 是有數據的namenode,否則設置錯誤會導致數據全部丟失。
2. 上面三個都修改完之後 ,開始進行數據的操作,我們知道在集群出問題之後可能出現兩個namenode裡面保存的不一致的情況,那麼我們需要把這部分數據進行一致操作。
- 在數據盤裡面的name版本文件裡面 存在edit 信息,這個是保存的數據節點目錄,上面修改完畢後,直接啟動hadoop會出現
org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join java.io.IOException: There appears to be a gap in the edit log. We expected txid 1, but got txid 52. at org.apache.hadoop.hdfs.server.namenode.MetaRecoveryContext.editLogLoaderPrompt(MetaRecoveryContext.java:94) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadEditRecords(FSEditLogLoader.java:184) at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadFSEdits(FSEditLogLoader.java:112) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadEdits(FSImage.java:733) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:647) at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:264) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:787) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:568) at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:443) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:491) at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:684) at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:669) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1254) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1320)
這樣的錯誤,我們根據 不需要的edit 其實就是損壞的數據刪掉即可就能恢復系統了
總結
從上面步驟就可以把誤操作的format 數據恢復過來,但是前提是兩個namenode 其中一個沒有被格式化。還保存著最新的數據留存。如果兩個都被格式化了。。。基本無解了
推薦閱讀:
※用電流刺激肌肉生長的 SmartMio 可信嗎?
※科技是不是第一生產力呢?
※像人一樣腦補世界!DeepMind歷時一年半搞出GQN,登上Science
※深剖:全流程項目管理平台最敏捷如何做到 AI 自動化?
※為何古代沒有分體弓?