• 【杂】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表查询数据

    当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
  • 相关阅读:
    Django 数据库常用字段类型、选项参数、外键约束
    Django 项目基础配置
    MySQL连接列值
    SQL 限制查询结果
    python+appium+真机测试
    P3089 [USACO13NOV]POGO的牛Pogo-Cow
    P2889 [USACO07NOV]挤奶的时间Milking Time
    P2679 子串
    P3932 浮游大陆的68号岛
    P1514 引水入城
  • 原文地址:https://www.cnblogs.com/liwxmyself/p/15256693.html
Copyright © 2020-2023  润新知