想提升查询性能?openLooKeng新下推框架助您一臂之力
openLooKeng执行计划优化简介
在讲述下推框架之前,我们先来简单介绍一下openLooKeng执行计划优化的大致流程。
如上图所示,接收到用户SQL语句之后,SQL被转换成一个Abstract syntax tree (AST)树。AST树再被转换成逻辑执行计划树。然后,也就是执行计划优化过程中最重要的一步,使用规则(Rule)或者优化器(Optimizers)进行执行计划优化,每一个PlanOptimizer可以操作一个子执行计划树,PlanOptimizer基于统计或者经验,用一个更优的子执行计划替换当前的子树,达到优化的目的。PlanOptimizers通常是长期的经验累积得出来的一些优化规则,比如谓词下推、join reorder等等。PlanOptimizers可以存储一些物理执行信息在ConnectorHandle中。新下推框架则工作在这一层。
得到最优的执行计划之后,逻辑执行计划被转换成物理执行计划,然后被分片,分割成按照stage执行的一个个子树,最终调度到worker上执行。
PrestoSql下推方案介绍
最初,openLooKeng是从PrestoSql演进而来,在其基础上增加了很多功能特性,以及大量的性能优化。在讲述openLooKeng的新下推框架之前,先大概介绍其原下推方案。
- 根据社区的讨论,PrestoSql原下推框架有一些目标:
1)使用现有的Rule或Optimizer的框架,而且不是使用基于visitor模式的PlanOptimizers来实现下推,同时能够让connector提供转换rules来实现下推;
2)并不是建立一个原生的机制来支持所有操作的下推。
- 先来看看prestoSql的执行过程:
1)首先,引入一些列的下推规则,每一个规则负责下推相应的操作到TableScan操作中,比如PushFilterIntoConnector, PushProjectionIntoConnector, PushAggregationIntoConnector等等;
2)上述的这些rules通过指定的metadata调用与connectors交互,如果connector支持这个操作下推,操作则被下推到TableScan操作,同时在connectorTableHadle中记录相关信息。
- 下面以PushFilterIntoConnector为例说明。
在上述的例子中,假设filter中有两个过滤条件,一个是like,一个是f函数,其中connector能处理like表达式。
PushFilterIntoConnector会调用 Metadata.pushFilter,实际上是调用connector的pushFilter函数,这个函数会返回一个新的tableHandle,新的tableHandle中记录了like表达式的相关信息,同时返回一个remaining filter,即connector不能处理的表达式。最终,PushFilterIntoConnector就把原来的执行计划(上图中第一个框)转换成一个新的执行计划(上图中最后一个框)。
- 上述的基于Rule的下推方案存在以下的几个问题:
1)不能JoinNode,WindowNode等Nodes的下推,特别是 join的情况,join node不仅仅需要visit当前的join node,还需要visit他的左右节点,同时,还需要保存join的上下文信息,基于rule的下推方案难以处理这种情况;
2)下推逻辑复杂,下推上下文信息无法保存,对于Join的情况,join的下推信息不知道存储在哪。
3) 基于上述原因,当前的下推方案不能把sql语句下推到数据源操作中,这样对于那些执行速度相当快的数据源就不能充分发挥数据源本身的能力,所以引入了新的下推框架。
openLooKeng新的下推框架
- 思想
openLooKeng新下推框架的主要思想是把执行计划子树暴露给connector,让connector提供PlanOptimizers(基于visitor模式的)给执行优化引擎,这样可以让connector引入任意的优化。
为了防止一个connector的PlanOptimizers修改其他connector的执行计划子树,openLooKeng对于暴露给Connector的PlanNode做了两个限制:
1)暴露出来的PlanNodes须移动到presto-spi模块;
2)仅仅暴露属于connector的子执行计划树给相应的connector。如下图所示,左子树只会暴露给Hive Connector,右子树只会暴露给Mysql Connector。然后会应用他们各自的PlanOptimizers。
- 实现
openLooKeng的下推框架如上图所示,新下推框架的工作原理很简单,主要分为两步:
1)Connector在启动的时候会告诉执行优化引擎其提供的ConnectorPlanOptimizer,如下图的HiveFpuPushdownOptimizer,其需要实现上图的optimize接口,optimize函数以子执行计划为入口,返回优化后的执行计划;
2)在执行优化引擎中引入ApplyConnectorOptimization优化器,
该Optimizer会把根据子执行计划所在的connector,调用其connectorPlanOptimizer。如下图所示,经过HiveFpuPushdownOptimizer优化之后,Aggregation和Filter操作都下推到了数据源中。
- 修改
新框架特性PR链接为
https://gitee.com/openlookeng/hetu-core/pulls/633,
主要做了如下修改:
-
移动PlanNodes到presto-spi模块
-
修改PlanNode和Assignments中的Expression为RowExpression(下一节描述)
-
添加TranslateExpressions 和 ApplyConnectorOptimization Optimizer
-
修改已经存在的Rules和Optimizers
-
为connector添加ConnectorPlanOptimizer
- Expression-to-RowExpression
在数据库或者查询系统中,为了更好的隔离,AST树和IR树是隔离,他们使用的数据结构也不一样,这也就是presto社区讨论的分离AST(Node)和IR(PlanNode)。具体就是指把AST树种的Expression转换成PlanNode中的RowExpression。当前AST和PlanNode在混用Expression,不能做到很好的隔离。rker上执行。
当前一个执行计划的生命周期如下:
building AST
building raw plan
plan optimization
plan sanity check
plan cost computation
building subplans
distributing subplan (over the wire)
compiling subplan locally
当前,Expression到RowExpression的转换发生在第8步。我们把转换这个操作移到了第3步。之所以没有把没有把转换移到第二步,是因为涉及的面太广了,修改量太大了。
Example 演示
首先,在演示系统中配置了三个catalog,他们都指向同一个数据源,不过下推的设置不一样,mysql2不下推,mysql1部分下推(join不下推),mysql全下推。
不下推的情况
部分下推的情况,在这个例子中,filter下推了
全部下推情况
如何贡献
下面简单介绍一下开发者如何适配新的下推框架,即在新增的connector中,如何添加connectorPlanOptimizer。主要步骤如下:
第一:在XXXConnector中复写下面的函数
第二:实现XXXPlanOptimizerProvider
第三:在XXXConnector中实现PlanOptimizer
第四:实现PlanOptimizer里面的optimize函数,主要是实现一个visitor去visit执行计划树
第五:实现Visitor,用来生成下推的语句,同时修改执行计划树
第六:实现XXXQueryGenerator,在XXXQueryGenerator中实现一个visitor用来把下推的信息记录到XXXQueryGeneratorContext,如果存在节点可以下推,则生成对应的sql
详细的实现可以参考openLooKeng的baseJdbc的实现,实现了JDBC数据源的下推。
以上便是openLooKeng开发工程师罗旦带来的分享。
直播视频回顾:https://www.bilibili.com/video/BV1of4y1p7sc
活动官网:https://summer.iscas.ac.cn/
学生指南:https://summer.iscas.ac.cn/help/student/
任务详情:https://summer.iscas.ac.cn/#/org/orgdetail/openlookeng
openLooKeng是一款开源的高性能数据虚拟化引擎,提供统一SQL接口,具备跨数据源/数据中心分析能力,为大数据用户提供极简的数据分析体验。
openLooKeng开源社区官方网站: https://openlookeng.io/zh-cn/
openLooKeng代码仓地址: http://gitee.com/openlookeng

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数栈人:从青铜到星耀,10年大数据人的奋战晋级之路
今天,大家就请跟着数栈君一起,和申杭聊聊他从青铜到星耀的大数据之路。 数栈君:申杭,你是07年从华中科技大学软件工程专业毕业的,能说说你当时为什么选择这个专业吗? 申杭:当时会计、师范、机械制造、土木类专业比较热门,一般家人都会让报这些专业,出来好就业。而电子、计算机、软件工程类的专业刚刚兴起,前景并不是很明朗,不过我那时对计算机还是挺好奇的,觉得电脑上开几个黑窗口,随便敲一堆英文字母,就可以做很多事情,很神奇,当看到软件这个名字,感觉很高端、神秘,所以就报了软件工程专业。说起来,我是华科软件专业第二届的学生,算是较早入计算机坑的人。 骚粉的杭哥 数栈君:那现在很多软件工程师估计都得叫你一声前辈了。你有10多年大数据经验,可以说很资深了,几乎见证了中国大数据行业的诞生和发展。能给大家讲一下你的工作经历吗? 申杭:这些经历要说起来,能讲三天三夜,不过今天就长话短说吧。 倔强青铜:初入数据工程师的世界 2007年毕业时,商业智能(BI)在中国发展势头正猛,我的第一份工作就是在四大管理咨询公司,行业所称“四大”之一的上海埃森哲做BI顾问。期间,负责给平安保险、某外资银行做数据仓库的模型设计和...
- 下一篇
4月份OSC“优秀原创作者”TOP10榜单新鲜出炉,速来围观哟
她来了她来了,她带着礼物走来啦~~~ 不忘初心,砥砺前行,恭喜以下获奖作者!有很多新面孔哦。 未上榜的童鞋继续加油哦,5月份评选正在进行中,感兴趣的小伙伴记得点击以下链接,查看活动详情哦: OSCHINA作者月度评选活动开启,精美礼品等你来拿! 「优秀原创作者」 排名 ID 昵称 当月发布文章被推荐数 1 4499317 悟空聊架构-公众号 20 2 3374539 刘涛华 12 3 4788503 李浩宇Alex 9 4 3751245 鸿蒙内核源码分析 7 5 3944379 yes的练级攻略 6 6 3081398 三十三重天 6 7 3556271 削微寒 5 8 4250089 四猿外 5 9 4846815 IT小老妹儿 5 10 1258330 小傅哥 4 PS:如出现数据相同的情况,以作者在OSCHINA社区累计发布的文章数为准,取数量多者为获奖者;若累计发布文章数也相同,取单篇文章阅读数最高者。 @获奖作者请于一周内登陆账号,个人主页-修改个人资料,完善一下收货信息哦,奖品将在一周内寄出哦。 3月份部分获奖作者礼品展示:
相关文章
文章评论
共有0条评论来说两句吧...