鲲鹏社区首页
中文
注册
通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV

通过AI算法在Apache Spark上智能推荐高性能物化视图——OmniMV

大数据

发表于 2025/05/10

0

作者:张鑫/徐立

1 特性介绍

OmniMV物化视图特性是通过AI算法从历史SQL查询中推荐出最优物化视图,并在大数据组件Spark中自动对用户SQL进行物化视图匹配,将匹配成功的物化视图替换用户执行计划的部分SQL,大幅减少重复计算,提升查询性能。

2 开源地址

代码地址:
https://gitee.com/kunpengcompute/boostkit-bigdata/tree/br_feature_omnimv_spark343/omnimv
安装指南:
安装指南在鲲鹏社区,大家自取。
https://www.hikunpeng.com/document/detail/zh/kunpengbds/appAccelFeatures/sqlqueryaccelf/kunpengbds_omniruntime_20_0403.html

3 架构介绍

OmniMV物化视图主要包含两大模块:物化视图候选视图生成模块、物化视图SQL写模块。

  • 物化视图候选视图生成模块:生成候选视图。
  • 物化视图SQL写模块:修改SQL的物理执行计划。
OmniMV物化视图的使用流程如下。
1. 收集历史查询日志,例如Yarn logs的日志。
2. 从历史日志中解析得到SQL相关的信息,包括SQL文本、SQL执行计划、SQL运行时间等。
3. 从2得到的信息中,进行候选视图生成,然后使用贪心选择TOP N的候选视图。

4 应用场景

Spark作为一个常见的大数据计算引擎,在大数据典型硬件配置的场景下,运行标准测试用例TPC-DS,采用OmniMV,开启物化视图的11条SQL平均性能提升50%以上。

5 逻辑计划重写源码解读

本文主要是对相关逻辑进行源码解读,特性使能参考上面的安装指南
下图展示了Spark中基于物化视图的逻辑计划重写流程:优化规则从 HDFS 加载元数据,经逻辑计划检查等流程,提取引用表并筛选候选视图,遍历候选视图时通过视图逻辑计划检查、引用表匹配程度计算等操作,在物化视图 join 补偿、谓词补偿等过程辅助下,实现逻辑计划的重写功能,以优化查询执行。

代码链接:

https://gitee.com/kunpengcompute/boostkit-bigdata/blob/br_feature_omnimv_spark343/omnimv/omnimv-spark-extension/plugin/src/main/scala/org/apache/spark/sql/catalyst/optimizer/rules/AbstractMaterializedViewRule.scala

5.1 元数据加载

5.1.1 加载时机

(1) 在OmniMV插件规则第一次被加载的时候,会进行元数据的加载。
(2) 执行create、drop命令时,也会进行元数据的更新。

5.1.2 元数据内容

(1) 物化视图查询SQL对应的逻辑计划。
(2) 物化视图的表逻辑计划。

5.2 逻辑计划检查

5.2.1 基础检查

深度遍历逻辑计划中的所有节点,节点的类型只允许以下类型。
  • Table
        − LogicalRelation
        − HiveTableRelation
        − SubqueryAlias
  • Table
  • Project
  •  Filter
  • Join
        − Inner

5.2.2 Aggregate检查

逻辑计划的根节点是Aggregate类型,并且所有子节点满足基础检查要求。

5.3 引用表提取

(1) 深度遍历逻辑计划,提取节点类型为HiveTableRelation和LogicalRelation的节点。
(2) 统计每个表的同名序号(从0开始),封装成表比较类(TableEqual)。TableEqual:数据库、表名、同名序号。

5.4 遍历候选视图

获取和当前逻辑计划可能匹配的候选物化视图,然后遍历执行后续的逻辑。

5.5 视图逻辑计划检查

同逻辑计划检查

5.6 引用表匹配程度计算

获取和当前逻辑计划可能匹配的候选物化视图,筛选条件就是两者引用表存在重合。
(1) 查询引用表包含视图引用表
(2) 视图引用表包含查询引用表
(3) 两者存在部分交集,部分独有

5.7 物化视图Join补偿

5.7.1 MaterializedViewJoinRule

遍历视图相对于查询缺少的表集合。
(1) 每个表创建一个Join逻辑计划,包装原先的视图表逻辑计划,最终生成补偿后的视图表逻辑计划。
(2) 每个表创建一个Join逻辑计划,包装原先的视图查询逻辑计划,最终生成新物化视图(join上这些表之后当做物化视图)的视图查询逻辑计划。

5.7.2 MaterializedViewAggregateRule

遍历视图相对于查询缺少的表集合。
(3) 每个表创建一个Join逻辑计划,包装原先的视图表逻辑计划,最终生成补偿后的视图表逻辑计划。
(4) 每个表创建一个Join逻辑计划,包装原先的视图查询逻辑计划(Agg)的子计划,再包装个Agg(groupingExpressions和aggregateExpressions,加上新增表的所有字段),最终生成新物化视图(join上这些表之后当做物化视图)的视图查询逻辑计划。
(5) 在新物化视图的视图查询逻辑计划上,再包装个Project,最终生成新物化视图(join上这些表之后当做物化视图)的视图查询Project逻辑计划。

5.8 谓词补偿

5.8.1 谓词提取

(1)对待提取的逻辑计划做化简。
(2)遍历化简后的逻辑计划。
 对Filter算子的condition做splitConjunctivePredicates运算,将所有用And谓词连接的谓词放到conjunctivePredicates中保存。
 对Join算子的condition做splitConjunctivePredicates运算,将所有用And谓词连接的谓词放到conjunctivePredicates中保存。
(3)遍历conjunctivePredicates。
     算子类型是EqualTo
 左右子表达式都是AttributeReference类型,则该算子算作equiColumnsPreds(等价谓词)
 左右子表达式其中一个是AttributeReference类型,另一个是常量,则该算子算作rangePreds(比较谓词)
 左右子表达式没有一个是AttributeReference类型,则该算子算作是residualPreds(其他谓词)
 算子类型是LessThan、GreaterThan、LessThanOrEqual、GreaterThanOrEqual
 左右子表达式其中一个是AttributeReference类型,另一个是常量,则该算子算作rangePreds(比较谓词)
 其余情况,该算子都算作residualPreds(其他谓词)
 算子类型不属于上面的类型都算做residualPreds(其他谓词)
(4)使用equiColumnsPreds(等价谓词)构造等价类EquivalenceClasses。

5.8.2 等价字段谓词

计算视图中的每个等价字段谓词集合,可以用来补偿查询中那个等价字段谓词集合,构建Multimap的索引映射。
如果存在不能用来补偿的视图,那么当前视图是不符合条件的。
遍历所有的查询等价字段谓词集合,检查Multimap中是否存在可用来补偿的视图等价字段谓词集合。
(1)不存在,查询等价字段谓词集合中的字段依次构建EqualTo,加入补偿结果。
(2)存在,遍历所有可用来补偿的视图等价字段谓词集合。
 计算查询和视图的差异字段集合。
 遍历差异字段集合,和视图等价字段谓词集合的第一个字段构建EqualTo,加入补偿结果。

5.8.3 范围谓词

对查询谓词进行等价字段映射(使用查询的等价字段字典)。
对视图谓词进行等价表映射、等价字段映射(使用查询的等价字段字典)。
对查询谓词和视图谓词进行重排序。
(1)用OR分割谓词。
 分割后的视图谓词和查询谓词相同,返回TRUE。
 分割后的视图谓词包含查询谓词,返回查询谓词。
 其他继续往下。
(2)用AND分割谓词。
 分割后的视图谓词和查询谓词相同,返回TRUE。
 其他继续往下。
(3)视图谓词 AND NOT(查询谓词),判断是否存在极端不可能的情况。
 将视图谓词 AND NOT(查询谓词)的结果,按AND条件分到NORMAL和NOT类型的集合里。
 NORMAL中有FALSE类型的,那么当前视图是不符合条件的。
 NOT中有TRUE类型的,那么当前视图是不符合条件的。
 遍历NOT类型的谓词,按AND分解,如果是NORMAL的子集,那么当前视图是不符合条件的。
 其他继续往下。
(4)重排序后的查询谓词 AND 重排序后的视图谓词,再进行简化和重排序。
 新谓词不总为False,并且新谓词和重排序后的视图谓词用AND分割后是相同的。
按AND条件分割新谓词和重排序后的视图谓词,从新谓词中移除在视图谓词中已经存在的。将剩余的谓词用AND拼接,返回。
 其他,该视图不满足要求。

5.8.4 其他谓词

逻辑和范围谓词一致。

5.9 逻辑计划重写

5.9.1 MaterializedViewJoinRule

(1) 提取查询的projectList,进行等价字段映射。
(2) 利用物化视图中的字段进行重写,新的projectList中的表达式Alias为1中projectList的表达式。
(3) 基于2的结果创建新的Project。

5.9.2 MaterializedViewAggregateRule

提取查询的aggExpressions和groupExpressions。
提取物化视图的aggExpressions和groupExpressions。
比较两者的groupExpressions。
(1)相同。
利用物化视图中的字段进行重写查询的aggExpressions和groupExpressions。
(2)查询的是物化视图的子集。
  • 如果查询中的aggExpressions可以进行rollUp,那么进行rollUp替换。

例如view: select count(1) as ct from t group by c1,c2 ;
query:select count(1) from t group by c1;
rollUp:select sum(ct) from view group by c1;
min,max,sum,count

  • 利用物化视图中的字段进行重写查询的aggExpressions和groupExpressions。

本页内容