分享好友 最新动态首页 最新动态分类 切换频道
Hive优化器原理与源码解析系列—统计模块内存成本估算
2024-12-26 19:30

背景

Hive优化器原理与源码解析系列—统计模块内存成本估算

在上篇文章“Hive优化器原理与源码解析系列--统计信息选择性计算”中,讲到了基于成本优化器和基于规则优化器的区别,这里就不再赘述。基于成本优化器会根据RelSet(等价关系表达式集合,其中元素每个RelNode关系表达式又是SQL中如Select、From、Where、Group的以代数表达式的表现形式)选出综合成本最低的关系表达式,使用动态规划算法构建出成本最优执行计划。那么基于成本优化器CBO有哪些计算指标作为成本函数的输入,除了选择性Selectivity、基数Cardinality,排序信息Collation(排序字段,排序方向等)、是否分布式等物理属性收集之外,还有IO、记录数RowNums、内存Memory都计算在成本内。这些都会作为成本优化器成本函数的输入。此文主要在介绍成本函数估算指标-内存计算。

Operator的内存估算

在Hive基于成本优化器CBO中,成本函数的输入都是基于Operator操作符,如Join、Filter、Project、Aggregate、TableScan、Unoin等Operator来估算的,内存成本估算也不例外。

内存的计算公式大致如下:

内存大小=记录数 * 列数 * 平均列长度或平均列大小

*注:有些列大小估算是根据每列的数据类型进行计算的,下面源码解析会讲到的。

Hive优化器是使用Apache Calcite框架来实现的。其中RelMetadataQuery对象可理解为Hive metaData元数据统计信息的访问媒介,因为下面会用到它,知晓其是用来访问统计信息的,细节就不再展开了。RelMetadataQuery对象访问Hive元数据表有四张:

PART_COL_STATS:基于表分区的列统计信息收集

TAB_COL_STATS:基于表的列统计信息收集

两者张表的表结构大致相同,一个基于表一个基于表的分区级别。

这里讲解一下PART_COL_STATS统计哪些元数据信息(这里基于Mysql存放Hive元数据信息),表结构如下:

登陆Hive元数据库,可PART_COL_STATS的查询

Hive统计信息收集方式有两种:

1. 表统计信息收集:

set hive.stats.autogather=true,在Hive DML操作(但Load data 这种方式除 外)时更新统计信息,

ANALYZE TABLE COMPUTE STATISTICS;

ANALYZE TABLE partition (day="2019-01-01") COMPUTE STATISTICS

信息收集同步到Hive元数据库的TABLE_PARAMS和PARTITION_PARAMS表内,包含了rawDataSize(未解压数据集大小)、numRows(记录数)。totalSizenumFiles是对Hive元数据库进行更新时操作的。

2. 列统计信息收集:

set hive.stats.column.autogather=true,这些信息的收集设定Hive参数自动进行收集,

ANALYZE TABLE COMPUTE STATISTICS for COLUMNS;

ANALYZE TABLE partition (day="2019-01-01") COMPUTE STATISTICS for COLUMNS;

手动执行命令基于表的命令,或基于表到分区的命令会将收集到信息同步到Hive元数据库的PART_COL_STATS或TAB_COL_STATS表内。包含了关于表各自分区ID或表ID唯一标示的表级别统计信息和列级别统计信息,常用的统计信息有,平均列长度、最大列长度、列数据类型、列的NDV非重复值的个数、为null值个数、为true或false个数等等

统计信息准确与否,直接决定了内存估算的准确性,进而影响成本函数的估算及优化器会构建出错误的执行计划。可见统计信息的重要性。

统计模块-内存估算源码解析

统计stats模块内存估算由HiveRelMdMemory继承了calicite的RelMdMemory实现的,Hive成本基于内存Memory的计算其实还不够完善,有些Operator都默认是0.0的内存大小。

1) HiveTableScan(表读取)、HiveFilter(谓词类似where条件)、HiveProject(投影类似Select 选取的字段操作符)、HiveUnion等这些源码实现时,默认给出0.0内存估算

2)HiveAggregate汇总Operator的内存估算实现

先从元数据访问对象获取此HiveAggregate关系表达式总记录rowCount和记录平均大小avgRowSize

如果这两个值中,任意一个值为null,则内存估算的大小为null。否则

内存大小 = rowCount * avgRowSize

3) HiveSortLimit排序Operator的内存估算实现

HiveSortLimit计算方法大致和汇总HiveAggregate类似,唯一区别在于Collation排序信息为null,即没有排序字段和排序方向的信息,此时内存估算大小为0.0.

4)HiveJoin会根据引擎不同,成本模型实现不同(MR 和 Tez两种引擎的对Join内存估算方法不同),返回结果不同。是由HiveCostModel模型内,对JoinAlgorithm接口具体实现决定的。

MR引擎:HiveDefaultCostModel,getMemory返回null

Tez引擎:HiveTezCostModel,使用HiveAlgorithmUtil.getJoinMemory() 实现的,不做展开

averageColumnSizes平均列大小的估算

Hive平均列大小的估算是由HiveRelMdSize继承calcite的RelMdSize实现的,源码解析如下:

1)HiveTableScan表扫描每列平均大小估算

TableScan列平均大小和其他Operator不同,其可RelOPtHiveTable表对象的形式获取TableScan所需要列的完整的ColStatistics统计信息对象,如果ColStatistics对象为null,使用数据类型方法averageTypeValueSize估算,否则事情getAvgColLen()元数据信息估算

2) SemiJoin每列平均大小估算

SemiJoin只需要获取左侧RelNode关系表达式使用RelMetadataQuery访问收集的元数据信息进行估算大小

3)HiveJoin每列平均大小估算

Join和上述的SemiJoin的平均列大小估算方法大致相同,区别是Join获取左右侧两侧RelNode关系表达式使用RelMetadataQuery访问收集的元数据信息进行估算大小

4) Hive每种数据类型大小的估算

这里枚举了每种数据类型大小估算,大致30种数据类型的情况

总结

内存的估算是根据stats统计模块收集的元数据信息:总记录数、平均列长度、列数、列数据类型,按照一定计算方法得出。内存作为成本函数输入,是成本高低很重要的一部分指标。

最新文章
给一个网站让做优化自然排名做到百度首页前三要怎么做
在开始进行网站优化之前,首先要明确我们的目标:将网站的自然排名提升到百度首页前三。这需要我们对网站的关键词、内容、结构、外部链接等多个方面进行全面优化。关键词研究与策略制定1. 选择合适的关键词:根据网站的主题和定位,选择具
融水网络推广优化,企业腾飞的新动力引擎
融水网络推广优化,成为企业发展的新引擎,通过精准策略提升品牌知名度,拓宽市场渠道,助力企业高效腾飞,实现业绩飞跃。随着互联网的飞速发展,网络营销已经成为企业品牌推广、产品销售的重要手段,在竞争激烈的今天,如何进行有效的融水
淘宝店铺为什么要补流量?
现在很多朋友在运营淘宝店铺的时候,一上来就会选择提升销量,有的会选择提升流量,有的会选择提升排名,有的会选择提升关键词,提升关键词里有大学问,今天跟各位分享一下淘宝运营如何提升词?淘宝运营如何提升词当我们新品上架以后,从前
粉笔垂域大模型落地面试场景 AI考官1:1模拟真实考场
  2025年度国考笔试已经落幕,广大考生即将投入到紧张的面试备考复习中。公考行业龙头粉笔(02469.HK)宣布,基于公司自研垂域大模型,推出精品面试AI点评产品,于12月13日正式上线,用户可以以1元/次的价格限时进行体验。  据了解,精
置顶【商家券API】常见问题官方精选热门
Q1:商家券接口文档参数字段”适用商品范围goods_name”是在哪里展示的?A1:在商家券详情里的优惠说明展示,具体展示规则如下:换购券:“商家券批次名称stock_name”和“适用商品范围goods_name”拼接满减券:适用商品范围goods_name折扣
新奥精准资料免费大全,可持续执行探索_免费版46.676
随着数字时代的到来,数据的获取和分析成为了企业决策的重要依据。新奥精准资料免费大全,免费版46.676,作为一套全面的数据分析工具,为用户提供了强大的数据支持。本文将详细介绍这一工具的特点、功能以及如何可持续地执行探索。新奥精准
自我提升的4个好方法
月5停止无意义的抱怨。要明白,无论当下的处境多么艰难,都只是你自己造成的,与别人无关,抱怨只会雪上加霜,并不能带来任何有用的改变。与其怨天尤人,不如停下吐槽的嘴巴,踏踏实实地去做一些能改变生活的事。如果你觉得自己一无是处,
营销推广岗岗位职责
营销推广岗岗位职责15篇  在我们平凡的日常里,接触到岗位职责的地方越来越多,制定岗位职责能够有效的地防止因为职位分配不合理而导致部门之间或是员工之间出现工作推脱、责任推卸等现象发生。一般岗位职责是怎么制定的呢?下面是小编收
百度AI的2020
世界的2020,是充满不确定性的变局之年;中国的2020,是团结一心、共克时艰、于变局中开新局的希望之年;百度 AI 的2020,是坚定信念,拥抱变化,践行“科技为更好”的实干之年。 回望2020年&#x
用AI绘技:一键生成超逼真美女写真,让每个家人都成为画家!
访问搜索引擎:打开你的浏览器,输入“搜狐简单AI”,进入其官方网站或小程序。创建账号并登录:如果你是第一次使用,可以选择用微信或手机号注册一个新账号,随即登录。选择模板:在主界面中,你会看到不同风格的模板,依照需要选择一个适
相关文章
推荐文章
发表评论
0评