【Hive实战】Hive治理方向探讨(请留意见)

news/2024/11/17 7:17:52/

Hive治理方向探讨

文章目录

  • Hive治理方向探讨
    • Hive治理项
      • 治理临时性质的表
      • 控制分区表的分区数量和分区层级
      • 限制建表时使用的存储格式
      • 表或分区记录的location对应的HDFS路径实际不存在
      • 表级路径应是分区路径的前缀
      • 内部表使用非内部表路径
      • 外部表使用内部表路径
      • 表的属性个数异常
      • 按时间维度规整表
    • 附录 分析语句
      • 识别分区数
      • 识别分区层级
      • 存储相关
      • 编解码信息
      • 存储路径
      • 表属性
      • 分区属性
    • 附录 hive元数据数仓表
      • hive元数据数仓表hive元数据存储库对应表

全篇数据已20230618分区的数据为准

Hive治理项

治理临时性质的表

  1. 临时表未及时清理,或按时间维度建表(亦是分区表类)
  2. 临时属性却以常规表标记。

诉求: 能够更好的识别出临时表,对超期临时表进行删除程序。

控制分区表的分区数量和分区层级

内部表的分区表数量 99,709

内部表的非分区表数量 222,555

外部表的分区表数量 7,842

外部表的非分区表数量 719

表类型分布数量

表类型表数量占比
MANAGED_TABLE32226497.28%
VIRTUAL_VIEW4460.13%
INDEX_TABLE3-
EXTERNAL_TABLE85612.58%

hive分区数量分布情况

按时间(天)的维度进行计算分区数区间

时间区间分区数区间表数量占比
半年(6个月)[1,180]2914834.33%
1年[181,365]59146.96%
2年[366,730]1206914.21%
3年[731,1095]1231414.50%
5年[1096,1825]1847621.76%
10年[1826,3650]57516.77%
20年[3651,7300]4010.47%
30年[7301,10950]1560.18%
30年以上[10950,+∞]6870.81%
目前5年以上数据定义为存疑[1826,+∞]69958%

hive分区表的层级分布情况

分区层级此层级的表数量分区级别下的分区数
110547574891729
220728241483
>272141

超过2层分区级别的分区表

TBL_NAMEOWNERPART_LEVEL

诉求: 识别出分区的数量和分区的层级,对数据异常的分区表(分区数量超过1826个,分区层级超过2层的)进行处理。

原则上分区层级不超过2层,单个表(1级分区)的最大分区数不超过2000,单个表(2级分区)的最大分区数不超过5000。

限制建表时使用的存储格式

存储格式

  • 低效存储格式(TextInputFormatRCFileInputFormat

  • 废弃存储格式(DeprecatedLzoTextInputFormat,DeprecatedRawMultiInputFormat

  • 无格式

INPUT_FORMAT分布情况

INPUT_FORMAT类数量占比
com.hadoop.mapred.DeprecatedLzoTextInputFormat1839620.220%
com.twitter.elephantbird.mapred.input.DeprecatedRawMultiInputFormat78890.009%
org.apache.hadoop.hive.ql.io.orc.OrcInputFormat2996634335.902%
org.apache.hadoop.mapred.TextInputFormat1877768022.497%
org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat676330.081%
************************************************************162526767.491%
org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat25221733.022%
org.apache.hadoop.hive.ql.io.RCFileInputFormat2542757530.464%
org.elasticsearch.hadoop.hive.EsHiveInputFormat3-
org.apache.hadoop.mapred.SequenceFileInputFormat152740.018%
************************************************************ 296430.012%
************************************************************ 322970.003%
************************************************************ 42281370.273%
************************************************************ 530230.004%
19820.002%

OUTPUT_FORMAT分布情况

OUTPUT_FORMAT类数量占比
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat2544377830.485%
org.elasticsearch.hadoop.hive.EsHiveOutputFormat40.000%
org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat676330.081%
org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat2996634435.903%
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat155560.019%
org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat133560.016%
org.apache.hadoop.hive.ql.io.HiveNullValueSequenceFileOutputFormat78890.009%
org.apache.hadoop.hive.ql.io.RCFileOutputFormat2542757530.465%
org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat25221733.022%
1982-

分区的格式为空的内部表

TBL_NAMEOWNERTBL_TYPE

格式为空的非分区的内部表

TBL_NAMEOWNERTBL_TYPE

诉求

  • 控制文件格式的选项,若无特殊需求,以ORC和Parquet类的格式为主。

    数据一般按以下结构进行分层存储:

    数据贴源层
    数据加工汇总层
    应用层
    • 贴源层:该层是将数据源中的数据直接抽取过来的,数据类型以文本为主,需要保持数据原样。数据不会发生变化,在初次清洗之后被读取的概率也不大,可以采用ORC格式文件。

    • 加工汇总层:该层是数仓的数据加工组织阶段,会做一些数据的清洗和规范化的操作,比如去除空数据、脏数据、离群值等。采用ORC能够较好支持该阶段的数据ACID需求。

    • 应用层:该层的数据是供数据分析和数据挖掘使用,比如常用的数据报表就是存在这里。此时的数据已经具备了对外部的直接使用的能力。数据的可能具备了一定层度的结构化,而Parquet在实现复杂的嵌套结构方面,比ORC更具有优势。所以该层一般采用Parquet。

      主要考虑的因素

      • 数据的变更性
      • 数据的结构复杂性
      • 数据的读写效率性

表或分区记录的location对应的HDFS路径实际不存在

诉求:这样情况的表或分区是否已停止使用,如果不使用了,就删除。若使用,则需要修正。

表级路径应是分区路径的前缀

内部分区表下的 分区不以表路径为前缀的分区数量268,651,对应的表数量 410

诉求:内部分区表分区location与表路径进行规整。

内部表使用非内部表路径

– 898条

诉求:内部表的表路径需要使用内部路径

外部表使用内部表路径

– 6640条

诉求:外部表的表路径不能使用内部路径

表的属性个数异常

表的基础属性在8个左右

表属性数量区间属性数量区间内的表数量表的占比属性的数量属性的占比
[0,8]29033887.64%138345677.28%
(8,16]4056112.24%39559722.10%
(16,20]1700.05%31370.18%
>202050.06%80250.45%

表属性个数Top20

TBL_NAMEOWNERparam_countTBL_TYPE

诉求:限制表的属性个数

按时间维度规整表

  1. 表的最后写入时间。(hdfs时间、最大分区的值等)
  2. 表的最后读取时间。

诉求:识别出长时间不读取的表,(多长时间没有读取)进行删除流程。

附录 分析语句

表分布语句

-- 不同表类型数量
SELECT  TBL_TYPE,COUNT(1)
FROM hive_meta.hive_meta_tbls
WHERE day = '20230618'
GROUP BY  TBL_TYPE-- 内部表的分区表 99709
SELECT  COUNT(1)
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.TBL_TYPE = 'MANAGED_TABLE'
AND d.TBL_ID IN (
SELECT  A.TBL_ID
FROM hive_meta.hive_meta_PARTITION_KEYS A
WHERE a.day = '20230618' );-- 内部表的非分区表 
SELECT  COUNT(1)
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.TBL_TYPE = 'MANAGED_TABLE'
AND d.TBL_ID NOT IN (
SELECT  A.TBL_ID
FROM hive_meta.hive_meta_PARTITION_KEYS A
WHERE a.day = '20230618' );-- 外部表的为分区表 7842
SELECT  COUNT(1)
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.TBL_TYPE = 'EXTERNAL_TABLE'
AND d.TBL_ID IN (
SELECT  A.TBL_ID
FROM hive_meta.hive_meta_PARTITION_KEYS A
WHERE a.day = '20230618' );-- 外部表的为非分区表 719
SELECT  COUNT(1)
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.TBL_TYPE = 'EXTERNAL_TABLE'
AND d.TBL_ID NOT IN (
SELECT  A.TBL_ID
FROM hive_meta.hive_meta_PARTITION_KEYS A
WHERE a.day = '20230618' );

识别分区数

-- 分区数超出某个阈值的表信息
SELECT  d.TBL_NAME,c.TBL_ID,d.OWNER,c.PART_SUM
FROM
(SELECT  b.TBL_ID,COUNT(*) AS PART_SUMFROM hive_meta.hive_meta_partitions bWHERE b.day = '20230618'GROUP BY  b.TBL_ID
) c
LEFT JOIN hive_meta.hive_meta_tbls d
ON c.TBL_ID = d.TBL_ID	
WHERE c.PART_SUM > 10000
AND d.day = '20230618';-- 某个分区数量区间内的表数量
SELECT  count(1)
FROM
(SELECT  b.TBL_ID,COUNT(*) AS PART_SUMFROM hive_meta.hive_meta_partitions bWHERE b.day = '20230618'GROUP BY  b.TBL_ID
) c
LEFT JOIN hive_meta.hive_meta_tbls d
ON c.TBL_ID = d.TBL_ID	
WHERE c.PART_SUM > 180 and c.PART_SUM <=365
AND d.day = '20230618';

识别分区层级

-- 分区层级超出某个阈值的表信息
SELECT  b.TBL_NAME,b.TBL_ID,b.OWNER,c.PART_LEVEL
FROM
(SELECT  A.TBL_ID,COUNT(A.PKEY_NAME) AS PART_LEVELFROM hive_meta.hive_meta_PARTITION_KEYS AWHERE a.day = '20230618'GROUP BY  A.TBL_ID
) c
LEFT JOIN hive_meta.hive_meta_TBLS B
ON c.TBL_ID = B.TBL_ID
WHERE b.day = '20230618'
and c.PART_LEVEL>2-- 某个分区层级内的表数
SELECT  count(1)
FROM
(SELECT  A.TBL_ID,COUNT(A.PKEY_NAME) AS PART_LEVELFROM hive_meta.hive_meta_PARTITION_KEYS AWHERE a.day = '20230618'GROUP BY  A.TBL_ID
) c
LEFT JOIN hive_meta.hive_meta_TBLS B
ON c.TBL_ID = B.TBL_ID
WHERE b.day = '20230618'
and c.PART_LEVEL=2-- 某个分区层级内的分区数
SELECT  COUNT(1)
FROM hive_meta.hive_meta_PARTITIONS b
WHERE b.day = '20230618'
AND b.TBL_ID IN (
SELECT  TBL_ID
FROM
(SELECT  A.TBL_ID,COUNT(A.PKEY_NAME) AS PART_LEVELFROM hive_meta.hive_meta_PARTITION_KEYS AWHERE a.day = '20230618'GROUP BY  A.TBL_ID
) c
WHERE c.PART_LEVEL >2 )

存储相关

-- output_FORMAT分布情况
SELECT  output_FORMAT分布情况,count(1)
FROM hive_meta.hive_meta_sds
WHERE day = '20230618' group by output_FORMAT-- input_FORMAT分布情况
SELECT   input_FORMAT,count(1)
FROM hive_meta.hive_meta_sds
WHERE day = '20230618' group by input_FORMAT-- 分区的格式为空的内部表
SELECT  d.*
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618' and 
AND d.TBL_ID IN (
SELECT  b.TBL_ID
FROM hive_meta.hive_meta_partitions b
WHERE b.day = '20230618'
AND b.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds AS a 
WHERE a.day = '20230618'
AND (a.output_FORMAT = '' or a.INPUT_FORMAT = '')) );-- 格式为空的非分区的内部表
SELECT  b.*
FROM hive_meta.hive_meta_tbls b
WHERE b.day = '20230618'
AND b.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds AS a
WHERE a.day = '20230618'
AND (a.output_FORMAT = '' or a.INPUT_FORMAT = ''));

编解码信息

  • 编解码表中存在不指向信息存储表的数据
SELECT  count(1)
FROM hive_meta.hive_meta_serdes a
WHERE serde_id not IN ( SELECT serde_id FROM hive_meta.hive_meta_sds b WHERE b.day = '20230618')
and a.day = '20230618'

存储路径

  • 表或分区记录对应的location为空
SELECT  count(1)
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618' AND ( location is null or location = '' )-- 查询没有存储路径的分区表
SELECT  d.*
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.TBL_ID IN (
SELECT  b.TBL_ID
FROM hive_meta.hive_meta_partitions b
WHERE b.day = '20230618'
AND b.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618' AND ( location is null or location = '' )));-- 查询没有存储路径的表--- 结果可能是视图SELECT  d.*
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618' and d.TBL_TYPE in ('MANAGED_TABLE','EXTERNAL_TABLE')
AND d.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618' AND ( location is null or location = '' ));-- 不属于上述的2与3  '495136682','495137661','872437188'
SELECT  a.*
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618'
AND ( location is null or location = '' )
AND sd_id not IN (
SELECT  d.sd_id
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618'
AND ( location is null or location = '' )));SELECT  d.*
FROM hive_meta.hive_meta_tbls d
WHERE d.day = '20230618'
AND d.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618' AND  a.sd_id in ('495136682','495137661','872437188'));SELECT  d.*
FROM hive_meta.hive_meta_partitions d
WHERE d.day = '20230618'
AND d.sd_id IN (
SELECT  a.sd_id
FROM hive_meta.hive_meta_sds a
WHERE a.day = '20230618' AND  a.sd_id in ('495136682','495137661','872437188'));
  • 表路径应是分区路径的前缀
SELECT  TBL_TYPE,COUNT(1)
FROM hive_meta.hive_meta_TBLs a
WHERE a.day = '20230618'
GROUP BY  TBL_TYPE;-- MANAGED_TABLE 322264
-- INDEX_TABLE 3
-- EXTERNAL_TABLE 8561
-- VIRTUAL_VIEW 446
-- 不易表路径为前缀的分区情况
SELECT  *
FROM
(SELECT  m.*,n.TBL_NAME,n.location AS tablelocation,n.ownerFROM(SELECT  a.TBL_ID,a.PART_ID,b.location,a.sd_idFROM hive_meta.hive_meta_partitions a, hive_meta.hive_meta_sds bWHERE a.sd_id = b.sd_idAND a.day = '20230618'AND b.day = '20230618' ) mLEFT JOIN(SELECT  c.TBL_ID,c.TBL_NAME,c.sd_id,c.owner,d.locationFROM hive_meta.hive_meta_TBLS c, hive_meta.hive_meta_sds dWHERE c.sd_id = d.sd_idAND d.day = '20230618'AND c.day = '20230618'  and c.TBL_TYPE='MANAGED_TABLE') nON m.TBL_ID = n.TBL_ID
) t
WHERE t.location not like concat(t.tablelocation, '%');
-- all 807946 
-- MANAGED_TABLE 268651
  • 内部表使用非内部表路径。
SELECT  c.TBL_ID,c.TBL_NAME,c.sd_id,d.location,c.owner
FROM hive_meta.hive_meta_TBLS c, hive_meta.hive_meta_sds d
WHERE c.sd_id = d.sd_id
AND d.day = '20230618'
AND c.day = '20230618'
AND c.TBL_TYPE = 'MANAGED_TABLE'
and d.location not like concat('%','/hive/warehouse/', '%');
-- 898条
  • 外部表使用内部表路径
SELECT  c.TBL_ID,c.TBL_NAME,c.sd_id,d.location,c.TBL_TYPE,c.owner
FROM hive_meta.hive_meta_TBLS c, hive_meta.hive_meta_sds d
WHERE c.sd_id = d.sd_id
AND d.day = '20230618'
AND c.day = '20230618'
AND c.TBL_TYPE != 'MANAGED_TABLE'
AND d.location like concat('%', '/hive/warehouse/', '%');
-- 6640条

表属性

SELECT  e.TBL_ID,e.OWNER,e.TBL_NAME,d.param_count,e.TBL_TYPE
FROM
(SELECT  c.TBL_ID,COUNT(*) AS param_countFROM(SELECT  a.TBL_ID,b.PARAM_KEYFROM hive_meta.hive_meta_tbls aLEFT JOIN hive_meta.hive_meta_table_params bON a.TBL_ID = b.TBL_IDWHERE a.day = '20230618'AND b.day = '20230618' ) cGROUP BY  c.TBL_ID
) d, hive_meta.hive_meta_tbls e
WHERE e.day = '20230618' and e.TBL_ID=d.TBL_ID
AND d.param_count > 100 

分区属性

-- 表下的分区
SELECT  e.TBL_ID,e.OWNER,e.TBL_NAME,d.TART_NAME,e.TBL_TYPE,c.PART_ID,c.PART_param_count
FROM
(SELECT  a.PART_ID,COUNT(*) AS PART_param_countFROM hive_meta.hive_meta_partitions aLEFT JOIN hive_meta.hive_meta_partition_params bON a.PART_ID = b.PART_IDWHERE a.day = '20230505'AND b.day = '20230505'GROUP BY  a.PART_ID
) c, hive_meta.hive_meta_partitions d, hive_meta.hive_meta_tbls e
WHERE d.day = '20230618'
AND e.day = '20230618'
AND c.PART_ID = d.PART_ID
AND d.TBL_ID = e.TBL_ID
-- 分区
SELECT  COUNT(1)
FROM
(SELECT  a.PART_ID,COUNT(*) AS PART_PAR_SUMFROM hive_meta.hive_meta_partitions aLEFT JOIN hive_meta.hive_meta_partition_params bON a.PART_ID = b.PART_IDWHERE a.day = '20230618'AND b.day = '20230618'GROUP BY  a.PART_ID
) c
WHERE PART_PAR_SUM > 0
AND PART_PAR_SUM <= 10;

附录 hive元数据数仓表

hive元数据数仓表hive元数据存储库对应表

数仓表名hive元数据表名注释
hive_meta_partition_keyspartition_keys分区字段的信息
hive_meta_sdssds文件存储的基本信息
hive_meta_partitionspartitions分区的基本信息
hive_meta_table_paramstable_params表的相关属性信息
hive_meta_db_privsdb_privs库的授权信息
hive_meta_tbl_privstbl_privs表的授权信息
hive_meta_tblstbls表的基础信息
hive_meta_columns_v2columns_v2字段的信息
hive_meta_dbsdbs存储Hive中所有数据库的基本信息
hive_meta_serde_paramsserde_params存储序列化的属性信息
hive_meta_partition_paramspartition_params分区的相关属性信息
hive_meta_serdesserdes存储序列化的基础信息

http://www.ppmy.cn/news/502223.html

相关文章

[年中总结]真正的精彩都在海里

时间过得可真的是快啊,一眨眼就是六月底了 这半年的经历也是挺多彩 二月底的时候,跟老大提出了离职申请,经过 老大/hr/部门 leader 的谈话之后,依然决定离职 四月底拿到离职证明之后,就出去玩了一圈,六月份刚回来,哈哈哈哈 我不知道有没有人和我一样,非常在意能不能在一份工作…

企业微信 创建应用后如何构造网页授权 获取token 获取用户信息

第一次对接企业微信&#xff0c;上网找了各种方案。 目的是在企业微信中&#xff0c;公司发给员工一个地址&#xff0c;员工点开后打开画面&#xff0c;在这个画面上可以获取到这个员工的userid&#xff08;后续功能操作就是各自不同的功能了哈&#xff0c;就不详细说了&#…

python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录 一、前言二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略三、轨迹图像的处理要点四、本篇部分核心控制策略python代码&#xff1a;五、结论 一、前言 基于最近的测试&#xff0c;得到了一种粗略控制的算法&#xff0c;其控制效果适合单线路和急转弯的情…

【PTA】【C语言】母牛生小牛-递归

有一头母牛&#xff0c;它每年年初生一头小母牛。每头小母牛从第四个年头开始&#xff0c;每年年初也生一头小母牛。请编程实现在第n年的时候&#xff0c;共有多少头母牛&#xff1f;递归实现。 函数接口定义&#xff1a; int Cow(int n);该函数返回第n年牛的总数量&#xff…

递归案例 ---- 母牛生小牛

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; // 有一头小母牛。从第四年起每年生一头小母牛。 // 生的小母牛也是从第四年起每年生一头小母牛。 // 如此循环。编程求N年后有多少头母牛。。。。。。。 /* * 思路&#xff1a;递归套娃 * Year coun…

母牛生小牛问题递归python实现

#File Name : 母牛问题.py # 开始有一只母牛 母牛每年可以生一只母牛 # 新出生三年后才能每年生一只母牛 假设都不会死 # 第n年有几只def cowNum(N):if N<1:return 1return cowNum(N-1)cowNum(N-3)a cowNum(7) print(a)# f(n) f(n-1) f(n-3) # 今年的牛 去年的牛 三年…

苹果电脑可以进行数据恢复吗

可能对于一个做设计的人来说&#xff0c;拥有一款苹果电脑是一个最大的愿望吧&#xff0c;当然&#xff0c;咱不能跟土豪们对&#xff0c;他们可能还没毕业就有苹果电脑了&#xff0c;咱们一般的工薪族&#xff0c;小白领们&#xff0c;可能现在连ipad都用不上&#xff0c;更别…

小牛马的编程

1 自我介绍 大家好我是来自甘肃兰州&#xff0c;大一的学生&#xff0c;要说我是怎么喜欢上编程的那就要从一部电影说起来了&#xff0c;《没有绝对安全的系统》我就感觉黑客都很厉害&#xff0c;随便就入侵别人的系统&#xff0c;各种攻击&#xff0c;然后我也看了一些关于黑…