在數據倉庫建設中,元數據管理是很是重要的環節之一。根據Kimball的數據倉庫理論,能夠將元數據分爲這三類:node
而基於這3類元數據"搭建"起來的元數據系統,一般又會實現以下核心功能:mysql
1. 血緣關係面試
如表級別/字段級別的血緣關係,這些主要體如今咱們平常的SQL和ETL任務裏。sql
2. 大數據集羣計算資源管理數據庫
針對利用不一樣的計算引擎如Spark/Flink/Mapreduce,能夠到Yarn(也多是其餘資源管理器)上採集相關任務的使用狀況。如CPU、內存、磁盤IO使用狀況。 而後能夠把這些資源使用狀況繪製成圖。經過可視化界面能夠直觀發現某些任務中的異常狀況,以及發現某些嚴重消耗資源的表或業務,及時通知相關負責人有針對性的分析處理和優化。架構
3. 數據如何同步以及權限管理等app
4. Hive庫表元數據信息統計oop
這裏對Hive庫表統計信息主要是指:行數、文件數、所佔HDFS存儲大小、最後一次操做時間等。學習
經過持續不斷的採集這些指標,造成可視化曲線圖,數據倉庫相關人員均可以從這個圖中發現數據規律或數據質量問題。對於利用數倉進行業務開發的人員,能夠經過這些曲線圖來分析業務量變化趨勢。在此基礎之上,還能夠作數據質量校驗、數值分佈探查等功能。大數據
本文主要介紹如何利用Spark進行對Hive庫、分區表/非分區表相關指標的統計。
而在咱們實際生產中,咱們不只能夠經過以下的方式及時更新和獲取Hive元數據庫中相關表記錄的指標信息,咱們也能夠參考下述相關SQL在Hive/Spark底層的執行過程,實現咱們本身的一整套業務邏輯。
注意:Spark默認不統計文件數
1)分區表
Spark對Hive分區表元數據統計,跟Hive原生對分區表的統計支持略有不一樣。
Spark既支持具體到分區的元數據信息統計,也支持整個表級別的元數據信息統計(但不會對具體分區作處理)
-- 統計tab_partition數據所佔HDFS空間總大小和總行數。
-- Hive目前不支持直接這樣解析分區表
-- 注意:執行該SQL不會處理表中具體分區統計信息
analyze table tab_partition COMPUTE STATISTICS;
-- 同Hive
analyze table tab_partition partition(partCol) COMPUTE STATISTICS;
-- 同Hive
analyze table tab_partition partition(partCol='20200722000000') COMPUTE STATISTICS;
2)非分區表
analyze table tab_no_partition COMPUTE STATISTICS;
下面看具體示例:
1)經過Spark建立Hive表
以分區表testdb.test_analyze_spark爲例,表剛建立時Hive元數據庫中表TABLE_PARAMS的信息:
+------+------------------------------------+--------------------+
|TBL_ID| PARAM_KEY| PARAM_VALUE|
+------+------------------------------------+--------------------+
| 3018| EXTERNAL| TRUE|
| 3018| spark.sql.create.version| 2.4.3|
| 3018|spark.sql.sources.schema.numPartCols| 1|
| 3018| spark.sql.sources.schema.numParts| 1|
| 3018| spark.sql.sources.schema.part.0|{"type":"struct",...|
| 3018| spark.sql.sources.schema.partCol.0| dt|
| 3018| transient_lastDdlTime| 1595409374|
+------+------------------------------------+--------------------+
2)對錶testdb.test_analyze進行數據的保存和元數據信息統計
insert overwrite table testdb.test_analyze partition(partCol=20200721000000) select id,name from testdb.test_partition1 where partCol=20190626000000;
執行上述SQL後,Hive內部會啓動一個任務進行Hive表操做的分區元數據信息統計,可是沒有numRows。以下:
+------+------------------+------+-------+----------------------+-------+--------------------+-----------+
| NAME| TBL_NAME|TBL_ID|PART_ID| PART_NAME|PART_ID| PARAM_KEY|PARAM_VALUE|
+------+------------------+------+-------+----------------------+-------+--------------------+-----------+
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| numFiles| 1|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| totalSize| 389|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977|transient_lastDdl...| 1595409909|
+------+------------------+------+-------+----------------------+-------+--------------------+-----------+
3)鏈接Hive元數據庫,查詢testdb.test_analyze_spark的元數據統計信息
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;
-- load jdbc.`db_1.TABLE_PARAMS` as TABLE_PARAMS ;
load jdbc.`db_1.TBLS` as tbls;
load jdbc.`db_1.DBS` as dbs;
load jdbc.`db_1.PARTITIONS` as partitions;
load jdbc.`db_1.PARTITION_PARAMS` as partition_params;
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_spark' and d.NAME='testdb' ;
4)結果
-- Spark在執行analyze table mlsql_test.test_analyze_spark partition(dt='20200721000000') COMPUTE STATISTICS; 時,會對分區行數進行統計:
+------+------------------+------+-------+----------------------+-------+-------------------------------+-----------+
| NAME| TBL_NAME|TBL_ID|PART_ID| PART_NAME|PART_ID| PARAM_KEY|PARAM_VALUE|
+------+------------------+------+-------+----------------------+-------+-------------------------------+-----------+
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| numFiles| 1|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| spark.sql.statistics.numRows| 1|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| spark.sql.statistics.totalSize| 389|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| totalSize| 389|
|testdb|test_analyze_spark| 3018| 52977|partCol=20200721000000| 52977| transient_lastDdlTime| 1595410238|
+------+------------------+------+-------+----------------------+-------+-------------------------------+-----------+
5)經過Spark對整個Hive分區表元數據信息的統計
-- 1. 執行:analyze table testdb.test_analyze_spark COMPUTE STATISTICS;
-- 2. Hive元數據庫中表TABLE_PARAMS的包含的testdb.test_analyze_spark信息:
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;
-- 獲取mlsql_test的DB_ID(49)
load jdbc.`db_1.DBS` as dbs;
select DB_ID from dbs where NAME='testdb' as db;
-- 獲取test_analyze_spark的TBL_ID(3018)
load jdbc.`db_1.TBLS` as tbls;
select TBL_ID from tbls where DB_ID=49 and TBL_NAME='test_analyze_spark' as t2;
-- 獲取testdb.test_analyze_spark表級別統計信息
load jdbc.`db_1.TABLE_PARAMS` as TABLE_PARAMS ;
select * from TABLE_PARAMS where TBL_ID=3018 ;
-- 結果
+------+------------------------------------+--------------------+
|TBL_ID| PARAM_KEY| PARAM_VALUE|
+------+------------------------------------+--------------------+
| 3018| EXTERNAL| TRUE|
| 3018| spark.sql.create.version| 2.4.3|
| 3018|spark.sql.sources.schema.numPartCols| 1|
| 3018| spark.sql.sources.schema.numParts| 1|
| 3018| spark.sql.sources.schema.part.0|{"type":"struct",...|
| 3018| spark.sql.sourc
es.schema.partCol.0| partCol|
| 3018| spark.sql.statistics.numRows| 1|
| 3018| spark.sql.statistics.totalSize| 389|
| 3018| transient_lastDdlTime| 1595410958|
+------+------------------------------------+--------------------+
Hive和Spark對Hive庫表元數據信息統計的區別包括但不限於以上3種區別。具體的看以前公衆號:大數據學習與分享相關文章的介紹
推薦文章:
經典的SparkSQL/Hive-SQL/MySQL面試-練習題
Hadoop支持的壓縮格式對比和應用場景以及Hadoop native庫
SparkSQL與Hive metastore Parquet轉換