zoukankan      html  css  js  c++  java
  • 【杂】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表查询数据

    当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/liwxmyself/p/15256693.html
Copyright © 2011-2022 走看看