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?

覺得文章還不錯的話,客官賞個小錢買支雪糕吃吧。(好吧,就是想試試被打賞是種什麼感覺,盒盒盒~)

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