在數據倉庫建設中,元數據管理是很是重要的環節之一。根據Kimball的數據倉庫理論,能夠將元數據分爲這三類:mysql
而基於這3類元數據"搭建"起來的元數據系統,一般又會實現以下核心功能:sql
1. 血緣關係shell
如表級別/字段級別的血緣關係,這些主要體如今咱們平常的SQL和ETL任務裏。數據庫
2. 大數據集羣計算資源管理微信
針對利用不一樣的計算引擎如Spark/Flink/Mapreduce,能夠到Yarn(也多是其餘資源管理器)上採集相關任務的使用狀況。如CPU、內存、磁盤IO使用狀況。
而後能夠把這些資源使用狀況繪製成圖。經過可視化界面能夠直觀發現某些任務中的異常狀況,以及發現某些嚴重消耗資源的表或業務,及時通知相關負責人有針對性的分析處理和優化。函數
3. 數據如何同步以及權限管理等工具
4. Hive庫表元數據信息統計oop
這裏對Hive庫表統計信息主要是指:行數、文件數、所佔HDFS存儲大小、最後一次操做時間等。學習
經過持續不斷的採集這些指標,造成可視化曲線圖,數據倉庫相關人員均可以從這個圖中發現數據規律或數據質量問題。對於利用數倉進行業務開發的人員,能夠經過這些曲線圖來分析業務量變化趨勢。在此基礎之上,還能夠作數據質量校驗、數值分佈探查等功能。測試
本文主要介紹如何利用Hive進行對Hive庫、分區表/非分區表相關指標的統計。
而在咱們實際生產中,咱們不只能夠經過以下的方式及時更新和獲取Hive元數據庫中相關表記錄的指標信息,咱們也能夠參考下述相關SQL在Hive/Spark底層的執行過程,實現咱們本身的一整套業務邏輯。
1. Hive元數據庫中主要涉及的元數據表
DBS:存儲Hive中全部數據庫的基本信息,如庫ID、表ID、建立時間、用戶、表名、表的類型等。
TBS:存儲Hive表、視圖等的基本信息,如表ID、表名、建立時間、用戶、表類型等。
TABLE_PARAMS:存儲表等的屬性信息,表ID、PARAM_KEY(如EXTERNAL)、PARAM_VALUE(與PARAM_KEY對應的值)。
PARTITIONS:存儲Hive分區統計信息相關的元數據,如分區ID、表ID、建立時間、分區名(partCol=partVal)等信息。
PARTITION_PARAMS:存儲Hive分區統計信息相關的元數據,如分區ID、PARAM_KEY(如文件數)、PARAM_VALUE(與
PARAM_KEY對應的值)。
默認狀況下,在對Hive表進行數據insert時,會自動更新元數據庫表中的統計信息,但主要是文件數、佔用HDFS空間大小等,不包括行數。
1)分區表
Hive分區表元數據統計信息SQL語法須要指定到具體分區,如分區字段或者分區名=分區值
-- 1. 統計更新tab_partition的分區字段爲dt的全部元數據信息
analyze table tab_partition partition(dt) COMPUTE STATISTICS;
-- 2. 統計更新單個分區元數據統計信息
analyze table tab_partition partition(dt='20200722000000') COMPUTE STATISTICS;
在Hive shell中執行analyze時,若是進行了元數據信息統計會打印相似以下信息:
Partition default.test_partition2{dt=20200718000000} stats: [numFiles=1, numRows=2, totalSize=418, rawDataSize=6]
2)非分區表
-- 非分區表粒度到表
analyze table tab_no_partition COMPUTE STATISTICS;
1)Hive分區表
-- 表級別:TABLE_PARAMS
-- Hive分區級別:PARTITION_PARAMS
numFiles:文件數
numRows:行數
totalSize:佔用HDFS空間大小
rawDataSize:原生數據大小
transient_lastDdlTime:最近一次操做時間
2)Hive非分區表
對於Hive分區表,由於最小粒度是表級別。所以,元數據統計信息也是表級別的。
-- TABLE_PARAMS
numFiles、numRows、totalSize、rawDataSize、transient_lastDdlTime:含義同上
默認狀況下,在對Hive表進行數據insert時,Hive會自動更新元數據統計信息,可是不統計行數。如需獲取numRow,能夠再次執行analyze SQL
1)直接經過Hive進行表的建立
以分區表testdb.test_analyze爲例,表剛建立時Hive元數據庫中表TABLE_PARAMS的信息:
+------+---------------------+-----------+
|TBL_ID| PARAM_KEY |PARAM_VALUE|
+------+---------------------+-----------+
| 3016| EXTERNAL | TRUE|
| 3016|transient_lastDdlTime| 1595405772|
+------+---------------------+-----------+
2)對錶testdb.test_analyze進行數據的保存和元數據信息統計:
insert overwrite table testdb.test_analyze partition(partCol=20200721000000) select id,name from testdb.test_partition1 where partCol=20190626000000;
analyze table testdb.test_analyze partition(partCol='20200721000000') COMPUTE STATISTICS;
3)鏈接Hive元數據庫,查詢testdb.test_analyze的元數據統計信息
-- 1. 鏈接Hive元數據庫
connect jdbc where
url="jdbc:mysql://localhost:3306/hive?useUnicode=true&characterEncoding=UTF-8"
and driver="com.mysql.jdbc.Driver"
and user="root"
and password="root"
as db_1;
-- 2. 將TABLE_PARAMS、DBS、TBLS、PARTITIONS、PARTITION_PARAMS註冊爲臨時表
-- load jdbc.`db_1.TABLE_PARAMS` as TABLE_PARAMS ;
load jdbc.`db_1.DBS` as dbs;
load jdbc.`db_1.TBLS` as tbls;
load jdbc.`db_1.PARTITIONS` as partitions;
load jdbc.`db_1.PARTITION_PARAMS` as partition_params;
-- 3. 獲取testdb.test_analyze的元數據統計信息
select d.NAME,t.TBL_NAME,t.TBL_ID,p.PART_ID,p.PART_NAME,a.*
from tbls t
left join dbs d
on t.DB_ID = d.DB_ID
left join partitions p
on t.TBL_ID = p.TBL_ID
left join partition_params a
on p.PART_ID=a.PART_ID
where t.TBL_NAME='test_analyze' and d.NAME='testdb';
4)結果
-- 測試時,testdb.test_analyze只有partCol=20200721000000的分區。所以,統計信息也只有partCol=20200721000000的
+------+------------+------+-------+----------------------+-------+--------------------+--------------------+
| NAME| TBL_NAME|TBL_ID|PART_ID| PART_NAME|PART_ID| PARAM_KEY| PARAM_VALUE|
+------+------------+------+-------+----------------------+-------+--------------------+--------------------+
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976|COLUMN_STATS_ACCU...|{"BASIC_STATS":"t...|
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976| numFiles| 1|
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976| numRows| 1|
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976| rawDataSize| 3|
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976| totalSize| 383|
|testdb|test_analyze| 3016| 52976|partCol=20200721000000| 52976|transient_lastDdl...| 1595407507|
+------+------------+------+-------+----------------------+-------+--------------------+--------------------+
下篇文章將介紹如何利用Spark進行Hive庫表元數據信息統計,以及兩者的區別。關注微信公衆號:大數據學習與分享,搶先看技術乾貨
推薦文章:
監聽MySQL的binlog日誌工具分析:Canal、Maxwell
SparkSQL與Hive metastore Parquet轉換