仅记录过程,不深究。

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表查询数据

当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。