仅记录过程,不深究。
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(一个跟我有仇,时常出事的多愁多难的数据,一个温柔耐心还没杀了我的同事,空间限制是它,误删的是它,加班也是它。)
参考
当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。