在数据仓库建设中,元数据管理是非常重要的环节之一。根据Kimball的数据仓库理论,可以将元数据分为这三类:

  1. 技术元数据,如表的存储结构结构、文件的路径
  2. 业务元数据,如血缘关系、业务的归属
  3. 过程元数据,如表每天的行数、占用HDFS空间、更新时间

而基于这3类元数据"搭建"起来的元数据系统,通常又会实现如下核心功能:

1. 血缘关系

如表级别/字段级别的血缘关系,这些主要体现在我们日常的SQL和ETL任务里。

2. 大数据集群计算资源管理

针对利用不同的计算引擎如Spark/Flink/Mapreduce,可以到Yarn(也可能是其他资源管理器)上采集相关任务的使用情况。如CPU、内存、磁盘IO使用情况。
然后可以把这些资源使用情况绘制成图。通过可视化界面可以直观发现某些任务中的异常情况,以及发现某些严重消耗资源的表或业务,及时通知相关负责人有针对性的分析处理和优化。

3. 数据如何同步以及权限管理等

4. Hive库表元数据信息统计

这里对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对应的值)。

2. Hive和Spark支持的Hive库表元数据信息统计

2.1 Hive

2.1.1 语法支持

默认情况下,在对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;

2.1.2 Hive元数据库中涉及的元数据统计信息字段

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:含义同上

3. Hive

默认情况下,在对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

Hive Query生命周期 —— 钩子(Hook)函数篇

Hive实现自增序列及元数据问题

SparkSQL与Hive metastore Parquet转换

Hive数据导入HBase引起数据膨胀引发的思考

Hive Join优化

如何有效恢复误删的HDFS文件

Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理

Hadoop支持的压缩格式对比和应用场景以及Hadoop native库

基于Hive进行数仓建设的资源元数据信息统计:Hive篇的更多相关文章

  1. 基于Hive进行数仓建设的资源元数据信息统计:Spark篇

    在数据仓库建设中,元数据管理是非常重要的环节之一.根据Kimball的数据仓库理论,可以将元数据分为这三类: 技术元数据,如表的存储结构结构.文件的路径 业务元数据,如血缘关系.业务的归属 过程元数据 ...

  2. 基于MaxCompute的数仓数据质量管理

    声明 本文中介绍的非功能性规范均为建议性规范,产品功能无强制,仅供指导. 参考文献 <大数据之路——阿里巴巴大数据实践>——阿里巴巴数据技术及产品部 著. 背景及目的 数据对一个企业来说已 ...

  3. 数仓建设 | ODS、DWD、DWM等理论实战(好文收藏)

    本文目录: 一.数据流向 二.应用示例 三.何为数仓DW 四.为何要分层 五.数据分层 六.数据集市 七.问题总结 导读 数仓在建设过程中,对数据的组织管理上,不仅要根据业务进行纵向的主题域划分,还需 ...

  4. 数仓建设中最常用模型--Kimball维度建模详解

    数仓建模首推书籍<数据仓库工具箱:维度建模权威指南>,本篇文章参考此书而作.文章首发公众号:五分钟学大数据,公众号中发送"维度建模"即可获取此书籍第三版电子书 先来介绍 ...

  5. 看SparkSql如何支撑企业数仓

    企业级数仓架构设计与选型的时候需要从开发的便利性.生态.解耦程度.性能. 安全这几个纬度思考.本文作者:惊帆 来自于数据平台 EMR 团队 前言 Apache Hive 经过多年的发展,目前基本已经成 ...

  6. 美团点评基于 Flink 的实时数仓建设实践

    https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...

  7. 技术专家说 | 如何基于 Spark 和 Z-Order 实现企业级离线数仓降本提效?

    [点击了解更多大数据知识] 市场的变幻,政策的完善,技术的革新--种种因素让我们面对太多的挑战,这仍需我们不断探索.克服. 今年,网易数帆将持续推出新栏目「金融专家说」「技术专家说」「产品专家说」等, ...

  8. 数仓Hive和分布式计算引擎Spark多整合方式实战和调优方向

    @ 目录 概述 Spark on Hive Hive on Spark 概述 编译Spark源码 配置 调优思路 编程方向 分组聚合优化 join优化 数据倾斜 任务并行度 小文件合并 CBO 谓词下 ...

  9. 在HUE中将文本格式的数据导入hive数仓中

    今天有一个需求需要将一份文档形式的hft与fdd的城市关系关系的数据导入到hive数仓中,之前没有在hue中进行这项操作(上家都是通过xshell登录堡垒机直接连服务器进行操作的),特此记录一下. - ...

随机推荐

  1. Google IO & 2019

    Google IO & 2019 Google IO Recap \ https://www.techradar.com/news/google-io-2019-keynote https:/ ...

  2. input number css hidden arrow

    input number css hidden arrow show arrow OK input[type="number"]::-webkit-inner-spin-butto ...

  3. 生态建设者为何青睐低风险、低成本的NGK算力?

    自从BGV推向市场以来,生态建设者的目光都聚集于BGV这个去中心化金融的新星,其实NGK的其他项目也都在稳健进行当中. NGK在未来将推出"算力市场奖励计划",NGK将会对算力市场 ...

  4. 如何在ASP.NET Core中编写高效的控制器

    ​通过遵循最佳实践,可以编写更好的控制器.所谓的"瘦"控制器(指代码更少.职责更少的控制器)更容易阅读和维护.而且,一旦你的控制器很瘦,可能就不需要对它们进行太多测试了.相反,你可 ...

  5. Linux 内核和 Windows 内核有什么区别?

    Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...

  6. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  7. kali 下的邮件发送工具 swaks

    kali 下的邮件发送工具 swaks Swaks 是一个功能强大,灵活,可编写脚本,面向事务的 SMTP 测试工具,目前 Swaks 托管在私有 svn 存储库中. 官方项目 http://jetm ...

  8. R语言barplot ,掌握本篇的内容,基本的条形图都可以画了

    本篇主要想复现文章中的一张图,原图来源(Antibiotic resistome and its association with bacterial communities during sewag ...

  9. IDEA SVN 使用

    转: IDEA SVN 使用 一.上传项目到 SVN VCS -> Import into Version Control -> Share Project(Subversion) 点击 ...

  10. 基于云原生DevOps服务自动化部署前端项目学习总结

    本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...