在数据仓库建设中,元数据管理是很是重要的环节之一。根据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转换