摒弃低效的sql,利用hive的统计信息,快速收集表信息

前言

在衡量数据完整性,有个指标就是要统计表的行数。在监控集群的资源使用情况,需要统计表的占用空间。

在观察集群是否有很多小文件,需要统计占用空间/文件个数,可以做一个大致判断。

下面提供了俩个版本,第一个版本构思简单粗暴,效率低。第二个版本,懂数据库人才会想到的,嘿嘿~

第一版本:

  1. 统计统计行数:

    方法:select count(1) from table,

    上述方法存在的问题:这个东西一定是要走mr的,如果表非常大的情况下,eg:在千亿级别的数据表(200T),600node*5%的资源,需要跑俩个小时。

    2. 统计占用空间:

    方法:hadoop fs -du hdfs://username/hive/warehouse/库名/${table_each}_${year_each} |awk ' { SUM += $1 } END { print SUM/(1024*1024*1024) }

    问题:需要desc formatted 表名,查找对应的存储地址,在用awk 进行累加,太繁琐了,不惧美观

第二个版本

分为俩个步骤,统计的信息一步到位:

    1. 先进行hive表统计信息的收集,这个一般花费,几十秒的时间

     方法:anaylze table ${table_each} partition(y='${year_each}',m='${month_each}',d) compute statistics

      PS:这边需要注意的地方是,每次收集的分区尽量少点,hive这个功能不稳定,一次性收集的分区较大有可能会失败。大表不建议采用下面的写法 anaylze table ${table_each} partition(y='${year_each}',m,d) compute statistics"。查看是否失败也可以借助下面的sql工具

    2.写sql统计工具。下面是通用工具,同学可以直接套用。

SELECT tbl_name,sum(case when param_key='numRows' then  param_value else 0 end) 'rownum',

       sum(case when param_key='numRows' then  1 else 0 end) 'part_num' ,

        sum(case when param_key='totalSize' then  param_value else 0 end)/1024/1024/1024 'totalSize',

        sum(case when param_key='numFiles' then  param_value else 0 end) 'numFiles'

FROM hive_meta.PARTITIONS pt

      inner join PARTITION_PARAMS ptp on pt.PART_ID=ptp.PART_ID

      inner join hive_meta.TBLS tbl on pt.TBL_ID= tbl.TBL_ID

where tbl_name in ('表名')  and owner='虚拟用户'

group by tbl_name

反思

在传统的RDMBS,对数据库的元信息,是做得相当完善。围绕这个元信息,可以构建一个监控系统,完整监控数据库级别,表级别,索引,表类型,表空间,段,区,块,段的设计或者参数配置的合理性。随着hive的发展这块也越来越完善了,而且也越来越多借鉴传统关系数据库的实现。故,温故知新,深入一个领域,可以打开一个宽阔的世界!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值