【雜】HIVE使用記錄:回收站及從回收站恢復分區表


  

僅記錄過程,不深究。

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(一個跟我有仇,時常出事的多愁多難的數據,一個溫柔耐心還沒殺了我的同事,空間限制是它,誤刪的是它,加班也是它。)

參考

誤刪hive表如何恢復

直接將文件put到Hdfs后建Hive表查詢數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM