HDFS和Hbase誤刪數據恢復

1.hdfs的回收站機制

    客戶有時會誤刪一些數據,在生產環境下,誤刪數據會造成非常嚴重的後果。

    在hdfs上有一個回收站的設置,可以將刪除的數據存在目錄”/user/$<username>/.Trash/”中,設置回收站的參數如下:

fs.trash.interval=0

    以分鐘爲單位的垃圾回收時間,垃圾站中數據超過此時間,會被刪除。如果是0,垃圾回收機制關閉。可以配置在服務器端和客戶端。如果在服務器端配置trash無效,會檢查客戶端配置。如果服務器端配置有效,客戶端配置會忽略。也就是說,Server端的值優先於Client。

    如有同名文件被刪除,會給文件順序編號,例如:a.txt,a.txt(1)

 

fs.trash.checkpoint.interval=0

    以分鐘爲單位的垃圾回收檢查間隔(這個應該是檢查回收站過期的數據定期的刪除。)。應該小於或等於fs.trash.interval。如果是0,值等同於fs.trash.interval。該值只在服務器端設置。

 

    如果disable+drop誤刪了hbase表數據,數據不會放到回收站中,hbase有自己的一套刪除策略。


2. 誤刪HBase表的恢復

    HBase的數據主要存儲在分佈式文件系統HFile和HLog兩類文件中。Compaction操作會將合併完的不用的小Hfile移動到<.archive>文件夾,並設置ttl過期時間。HLog文件在數據完全flush到hfile中時便會過期,被移動到.oldlog文件夾中。

    HMaster上的定時線程HFileCleaner/LogCleaner週期性掃描.archive目錄和.oldlog目錄, 判斷目錄下的HFile或者HLog是否可以被刪除,如果可以,就直接刪除文件。

    關於hfile文件和hlog文件的過期時間,其中涉及到兩個參數,如下:

(1)hbase.master.logcleaner.ttl

    HLog在.oldlogdir目錄中生存的最長時間,過期則被Master的線程清理,默認是600000(ms);

(2)hbase.master.hfilecleaner.plugins

    HFile的清理插件列表,逗號分隔,被HFileService調用,可以自定義,默認org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner。

    反編譯hbase的代碼,在類org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner中,可以看到如下的設置:


    默認hfile的失效時間是5分鐘。由於一般的hadoop平臺默認都沒有對該參數的設置,可以在配置選項中添加對hbase.master.hfilecleaner.ttl的設置。

    實際在測試的過程中,刪除一個hbase表,在hbase的hdfs目錄下的archive文件夾中,會立即發現刪除表的所有region數據(不包含regioninfo、tabledesc等元數據文件),等待不到6分鐘所有數據消失,說明所有數據生命週期結束,被刪除。在hfile聲明週期結束到被發現刪除中間間隔不到一分鐘。

    下面以星環的TDH(transwarp data hub)爲例講一下hbase(星環版本中爲hyperbase)表數據恢復的具體過程。

    TDH的hbase在hdfs上數據目錄如下:

    表的存儲位置爲/hyperbase1/data/default/<表名>

    Hbase表在hdfs的文件結構:


    包括表的描述的文件夾.tabledesc,一個臨時的文件夾.tmp(從後臺日誌中看到,刪除的時候數據會進行archiving歸檔,歸檔過程中數據會暫時存儲到這個文件夾中),和region數據。打開任何一個region的文件夾,裏面包含該regioninfo文件和列族命令的文件夾,一個列族命令的文件夾應該就是一個store,裏面有若干的storefile(對應hfile),如下圖所示。


    

Disable+drop刪除表test1,下面介紹下恢復過程。

第一步:搶救數據

    保證在刪除表之後的5分鐘之內將hdfs目錄/hyperbase1/archive/文件夾下的數據拷貝到/tmp下。

第二步:新建同名和同列族的表

第三步:將搶救下來的region數據拷貝到hbase表對應的目錄下


第四步:元數據修復

查詢執行修復的幫助命令,

sudo -u hbase hbase hbck –help


    由於缺少regioninfo信息,不能直接用hbck –fixMeta修復。

    嘗試先用fixHdfsOrphans,fixTableOrphans,fixMeta的順序進行修復,失敗。只能用-repair修復,但是內部的執行順序可能不對,執行一遍失敗,多執行幾遍,成功。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章