Hive常用命令之MSCK REPAIR TABLE命令概述

对于MSCK REPAIR TABLE命令,小编在工作中初见时,只有简单的理解——“刷新分区”。细究其原理便不得而知了。现在来将学习的内容记录一下。

首先,Hive能检测到的分区信息,存储在哪里?怎么新建分区才会存储在这个可(被Hive)检测位置上?怎么新建分区不会存储在这个可(被Hive)检测的位置上?MASK REAPRE TABLE有什么作用?

  • Hive能检测到的分区信息,存储在哪里?
    分区同database、table等一样,是Hive的元数据信息之一,存储在Derby、MySQL等数据库中。

  • Hive怎么获取元数据信息(包括分区)?
    Hive客户端连接metastore服务,metastrore再去连接MySQL获取元数据信息。(备注:有了metastore,多个客户端可以同时连接,而不需要知道MySQL的用户名和密码,只需要连接MySQL服务即可。)

  • 怎么新建分区,分区信息才会存储到MySQL中?
    插入数据之前,使用alter table xxx add partition()创建分区;或者插入数据时,使用insert into table xxx partition() value()创建分区,这些操作都会在MySQL中记录下新的分区信息。

  • 怎么新创建分区不会存储在MySQL中?
    Hive的数据实际存储在HDFS中,以多层目录的形式存储。
    若我们直接使用hdfs -put向HDFS中创建目录,上传数据,如下:

hdfs dfs -mkdir -p /user/hive/warehouse/test.db/repair_test/par=partition_2/
hdfs dfs -put -f test.txt /user/hive/warehouse/test.db/repair_test/par=partition_2/

或者通过其他形式,直接向Hive表在HDFS中的存储位置创建分区,建立数据。比如服务端DB通过kafka直接将数据落地到HDFS。这两种情况都不会在MYSQL存储的元数据信息中添加新分区信息。
新的元数据信息添加到了HDFS中,没有添加到MYSQL中,这时就需要使用MASK REPAIRE TABLE “刷新分区”了。

  • MASK REPAIR TABLE有什么作用?
    MASK(全称metastore consistency check,Hive表分区连贯性检查),运行MASK REPAIR TABLE 后,Hive回去检测这个表在HDFS上的文件,把没有写入metastore的分区信息写入到metastore。

  • 上面讲的是在HDFS中添加分区,MASK REPAIR TABLE刷新后,能将新分区信息添加到metastore中。若是直接从HDFS中删除分区呢?使用MASK REPAIR TABLE后能将metastore中过期的分区信息删除掉吗?
    答案是不行的。
    只能在Hive客户端中通过alter table drop partition(…)删除metastore中的分区信息。

备注:在一些新版本的Hive中(比如Fix Version/s: 3.0.0, 2.4.0, 3.1.0 ),MASK REPAIR TABLE 命令能删除掉metastore中的过期元数据信息。

参考文章:
[1] HIVE常用命令之MSCK REPAIR TABLE命令简述-简书
[2] Hive为什么要启用Metastore?

觉得文章还不错的话,客官赏个小钱买支雪糕吃吧。(好吧,就是想试试被打赏是种什么感觉,盒盒盒~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章