如果您覺得“大數據開發運維架構”對你有幫助,歡迎轉發朋友圈
作為Hadoop集群維護人員,經常誤操作直接將HBase表數據誤刪除,生產數據肯定是不能直接刪除的,下面我詳細給大家演示下,如何快速恢復誤刪除的表:
為方便大家理解,我先講一下HBase在hdfs上的目錄結構,先看下面這張圖:
一共9個目錄和2個文件:
目錄:
1.hbase-snapshot
如果hbase開啟了快照,用戶對一個數據表建立快照table_snapshot1,則hbase會在這個目錄下新建一個文件夾table_snapshot1。
2. .hbck
這個hbase hbck 相關的集群修復命令的一個臨時緩存目錄。
3. .tmp
臨時目錄,用戶創建、刪除表的時候的,會用到這個臨時目錄4.MasterProcWALs
目錄下有一個狀態文件,記錄管理操作日誌記錄文件,比如解決衝突的服務器,表創建和其它DDLs等操作到它的WAL文件中,這個WALs存儲在MasterProcWALs目錄下,它不像RegionServer的WALs,HMaster的WAL也支持彈性操作,就是如果Master服務器掛了,其它的Master接管的時候繼續操作這個文件。
5.WALs
HLog預寫日誌文件
6.archive
存儲表的歸檔和快照,HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。
7.corrupt
損壞的日誌文件
8.data
HBase表數據
9.oldWALs
當WALs中的日誌文件不再需要時,會先放到這個目錄下,等待清理。
文件:
- hbase.id它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。
- hbase.versionhbase.version記錄了hbase的版本,是一個二進制文件。
1.直接刪除HBase表數據在HDFS上的目錄
如果你直接從hdfs上刪除了數據,由於hdfs每個用戶都有個回收站目錄:/user/$/.Trash/,刪除後可從回收站直接恢復即可,這個比較簡單。
hadoop的回收站是在我們刪除數據後能恢復的目錄,但是我們並不希望在回收站保存太久的數據,我們可以使用如下參數進行配置。
參數介紹:
1).fs.trash.interval=0
以分鐘為單位的垃圾回收時間,垃圾站中數據超過此時間,會被刪除。如果是0,垃圾回收機制關閉。
可以配置在服務器端和客戶端。
如果在服務器端配置trash無效,會檢查客戶端配置。如果服務器端配置有效,客戶端配置會忽略。
建議開啟,建議4320(3天)
垃圾回收站,如有同名文件被刪除,會給文件順序編號,例如:a.txt,a.txt(1)
2).fs.trash.checkpoint.interval=0
以分鐘為單位的垃圾回收檢查間隔。應該小於或等於fs.trash.interval。如果是0,值等同於fs.trash.interval。每次檢查器運行,會創建新的檢查點。
建議設置為60(1小時)
2.通過disable+drop刪除了HBase的數據表
這裡用表testTable1演示數據恢復過程:
a).登錄hbase shell中查看錶中有兩條數據:
<code>hbase(main):004:0> scan 'testTable1'ROW COLUMN+CELL row001 column=info1:col1, timestamp=1581149494656, value=value1 row001 column=info1:col2, timestamp=1581149504948, value=value2 1 row(s) in 0.0330 seconds/<code>
原來表的存儲目錄是:/apps/hbase/data/data/default/testTable1
b).用disable+drop刪除表
<code>hbase(main):005:0* disable 'testTable1'0 row(s) in 2.3000 secondshbase(main):006:0> drop 'testTable1'0 row(s) in 1.2510 seconds/<code>
c).在hbase的歸檔目錄archive下可查看已刪除的數據
<code>[hbase@master98 ~]$ hadoop fs -ls /apps/hbase/data/archive/data/defaultFound 2 itemsdrwxr-xr-x - hbase hdfs 0 2019-11-10 15:34 /apps/hbase/data/archive/data/default/test12drwxr-xr-x - hbase hdfs 0 2020-02-08 15:47 /apps/hbase/data/archive/data/default/testTable1/<code>
d).由於這個數據是有保存時間的(這個保存時間恢復完數據後下面我專門講解),先將已刪除額testTable1的數據拷貝到/tmp下備份,以防hbase自身定時任務清理掉。
<code>[hbase@master98 ~]$ hadoop fs -ls /tmp/defaultFound 2 itemsdrwxr-xr-x - hbase hdfs 0 2020-02-08 15:51 /tmp/default/test12drwxr-xr-x - hbase hdfs 0 2020-02-08 15:51 /tmp/default/testTable1/<code>
e).新建同名、同列族的表testTable1,這時testTable1會在hdfs上重新有一個目錄,下面共3個子目錄:
<code>hbase(main):002:0> ^C[hbase@master98 ~]$ hadoop fs -ls /apps/hbase/data/data/default/testTable1Found 3 itemsdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tabledescdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tmpdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/7688ca7556d73db2d8ba69128da544f8/<code>
f).將備份的數據拷貝到新的testTable1表在hbase的存儲目錄下,不要拷貝整個目錄,只拷貝/tmp/testTable1/*下的region數據目錄,這時新testTable1表下面就會多了一個region數目目錄,這時共4個子目錄,如下:
<code>#拷貝命令一定不要出錯[hbase@master98 ~]$ hadoop fs -cp /tmp/testTable1/dd4adf04aea66bd5912275e577f2ef6a /apps/hbase/data/data/default/testTable1/[hbase@master98 ~]$ hadoop fs -ls /apps/hbase/data/data/default/testTable1Found 4 itemsdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tabledescdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/.tmpdrwxr-xr-x - hbase hdfs 0 2020-02-08 16:19 /apps/hbase/data/data/default/testTable1/7688ca7556d73db2d8ba69128da544f8drwxr-xr-x - hbase hdfs 0 2020-02-08 16:20 /apps/hbase/data/data/default/testTable1/dd4adf04aea66bd5912275e577f2ef6a/<code>
h).這時候你去查詢hbase數據的時候是看不到數據的,因為在hbase的元數據表.meta中並沒有原來那個region的元數據信息,需要進行修復:
<code>hbase(main):001:0> scan 'testTable1'ROW COLUMN+CELL 0 row(s) in 0.2490 seconds/<code>
i).表修復,切換到hbase管理員用戶:su - hbase,執行hbase hbck相關命令進行修復,具體該執行哪個命令要根據hbase hbck的報錯信息進行修復,hbse hbck修復命令:
<code>1. 檢查輸出所以ERROR信息,每個ERROR都會說明錯誤信息。hbase hbck2. 先修復tableinfo缺失問題,根據內存cache或者hdfs table 目錄結構,重新生成tableinfo文件。hbase hbck -fixTableOrphans3. 修復regioninfo缺失問題,根據region目錄下的hfile重新生成regioninfo文件hbase hbck -fixHdfsOrphans4. 修復region重疊問題,merge重疊的region為一個region目錄,並從新生成一個regioninfohbase hbck -fixHdfsOverlaps5. 修復region缺失,利用缺失的rowkey範圍邊界,生成新的region目錄以及regioninfo填補這個空洞。hbase hbck -fixHdfsHoles6.修復meta表信息,利用regioninfo信息,重新生成對應meta row填寫到meta表中,併為其填寫默認的分配regionserverhbase hbck -fixMeta7. 把這些offline的region觸發上線,當region開始重新open 上線的時候,會被重新分配到真實的RegionServer上 , 並更新meta表上對應的行信息。hbase hbck -fixAssignments/<code>
我首先執行了hbase hbck檢查了集群整體狀態,報錯表testTable1缺少元數據信息,需要執行hbase hbck -fixMeta 進行修復,如果修復失敗,可依次嘗試fixHdfsOrphans,fixTableOrphans,fixMeta,fixAssignments參數進行修復:
修復多執行幾次,直到再次執行hbase hbck顯示下圖時,說明修復成功,表數據可查詢:
<code>0 inconsistencies detected.Status: OK/<code>
去hbase shell中驗證一把,數據可查詢,至此修復成功:
<code>hbase(main):001:0> scan 'testTable1'ROW COLUMN+CELL row001 column=info1:col1, timestamp=1581149494656, value=value1 row001 column=info1:col2, timestamp=1581149504948, value=value2 1 row(s) in 0.3030 seconds/<code>
上面涉及到了幾個知識點,我再給大家詳細說一下:
HBase的數據主要存儲在分佈式文件系統HFile和HLog兩類文件中。Compaction操作會將合併完的不用的小Hfile移動到<.archive>文件夾,並設置ttl過期時間。HLog文件在數據完全flush到hfile中時便會過期,被移動到.oldlog文件夾中。/<.archive>
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。
(3) hbase.master.logcleaner.ttl:
默認hfile的失效時間是5分鐘,在主region發生compaction之後,被compact掉的文件會放入Archieve文件夾內,超過hbase.master.hfilecleaner.ttl時間後,文件就會被從HDFS刪除掉。而此時,可能replica region正在讀取這個文件,這會造成用戶的讀取拋錯返回。如果不想要這種情況發生,就可以把這個參數設為一個很大的值,比如說3600000(一小時),總沒有讀操作需要讀一個小時了吧?
實際在測試的過程中,刪除一個hbase表,在hbase的hdfs目錄下的archive文件夾中,會立即發現刪除表的所有region數據(不包含regioninfo、tabledesc等元數據文件),等待不到6分鐘所有數據消失,說明所有數據生命週期結束,被刪除。在hfile聲明週期結束到被發現刪除中間間隔不到一分鐘。
閱讀更多 JasonLu1986 的文章