僅記錄過程,不深究。
1 回收站
在hive上如果你打開了回收站功能,刪除的表會臨時存放在回收站里面。由於服務器和集群是其他同事在負責維護,所以我只知道服務器上是打開了回收站的功能的。我曾經痛恨這個功能,后面我開始感激這個功能,果然有些大家公認必須存在的功能的確是有其存在的意義的,不要在事情沒發生前吐槽這些安全備份機制,即使它給你日常造成了一些麻煩。
首先需要明確的是,使用truncate刪除的數據不會出現在回收站,使用drop刪除的數據在回收站,保存在你刪除它的那個時間里面,保存時長看之前設置的時長。
而且,剛剛刪除的表仍保存在回收站里也是會占用賬號下的空間的,如果你賬號下的空間達到了限制,僅僅使用drop table清除數據表是沒有用的(包括刪除分區)。需要刪除的時候限制不放入回收站,或者自己跑到回收站去刪掉數據,清空回收站(如果你確定你這個行為是安全的)。
你可以使用以下方法查看賬號下已用空間大小,這個大小並不包括仍在回收站的數據的發小,但是回收站的數據卻實實在在占着空間(所以知道我被坑以及吐槽的地方在哪里了嗎)。
hadoop fs -du -s -h hdfs://beh/user/用戶名/數據庫名
回收站的路徑一般是
/user/用戶名/.Trash
如果不清楚用戶名是什么,在hive命令行中找到一張你想要找的回收站對應的數據庫中的表,如 myudb.mytable
;
hive> show create table mydb.mytable; OK CREATE TABLE `myuser.mytable`( ........ ) PARTITIONED BY (....) ROW FORMAT SERDE '....' STORED AS INPUTFORMAT '....' OUTPUTFORMAT '......' LOCATION 'hdfs://beh/user/myuser/mydb/mytable' TBLPROPERTIES (....)
如果之前有設置,那么回收站的位置在:
--查看回收站中保存了幾天的刪除記錄 hdfs dfs -ls /user/myuser/.Trash
而如果你把上面的表刪除了,它的位置應該在
hdfs dfs -ls /user/myuser/.Trash/刪除日期(或者Current)/user/myuser/mydb/mytable
需要刪除的話跟你在自己電腦刪除回收站數據一樣,一旦刪除,釋放空間且無法恢復。
--清空整個回收站 hadoop fs -rm -r /user/myuser/.Trash --清空回收站某一天數據 hadoop fs -rm -r /user/myuser/.Trash/刪除日期(或者Current) --刪除回收站某個表數據 hadoop fs -rm -r /user/myuser/.Trash/刪除日期(或者Current)/user/myuser/mydb/mytable
2、從回收站恢復分區表
既然前面能在回收站找到被刪掉的HDFS
文件,那么就可以嘗試恢復。過程應該跟從別的地方導入HDFS
文件在這邊集群上建表差不多。
2.1 將回收站數據復制原始目錄下
hadoop fs -cp /user/myuser/.Trash/刪除日期(或者Current)/user/myuser/mydb/mytable /user/myuser/mydb/mytable
這個時候,查看/user/myuser/.Trash/刪除日期(或者Current)/user/myuser/mydb/mytable
目錄下是有數據的。不過在hive上查表顯示的是不存在。需要手動建表。
非分區表建完表,文件也復制過來了,應該能看到數據了,不過這一步我沒有驗證。
2.2 修復分區
msck repair table mydb.mytable hive> msck repair table mydb.mytable; OK Partitions not in metastore: mytable:month_part=202107 mytable:month_part=202108 mytable:month_part=202109 Repair: Added partition to metastore mydb.mytable:month_part=202107 Repair: Added partition to metastore mydb.mytable:month_part=202108 Repair: Added partition to metastore mydb.mytable:month_part=202109 Time taken: 0.171 seconds, Fetched: 4 row(s)
新的表就是全新的表,之前的設置的權限之類的會清空,需要重新設置。
如果前面沒有手動建表,這一步並不能完成。報錯 “Tables not in metastore:”
如果沒有手動添加分區,修復的時候會報:"Partitions not in metastore:",不過好像不影響結果,反正數據是恢復了,我沒必要再花一天為我一秒鍾的手賤買單,下一個流程使用這個數據的同事也不必配合我手動跑數據了OTZ(一個跟我有仇,時常出事的多愁多難的數據,一個溫柔耐心還沒殺了我的同事,空間限制是它,誤刪的是它,加班也是它。)
參考