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


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

  • 相关阅读:
    申诉电信ADSL宽带限速
    回帖整理
    继续无题
    抛砖引玉,征集体会
    关于程序组织和组织技巧的学习
    周鸿祎行
    无题
    用此书为例讨论下软件思想的学习
    笔记
    方法论究竟为社区提供了什么
  • 原文地址:https://www.cnblogs.com/bigdatalearnshare/p/14620988.html
Copyright © 2020-2023  润新知