导语:得益于调度单元是通用的SQL语句,SuperSQL能够做到与特定计算引擎解耦,也正因为此原因,SuperSQL只需专注在最优执行计划生成,并根据SQL具体类型选择最佳的计算引擎。
天穹SuperSQL是腾讯自研的跨数据源、跨数据中心、跨计算引擎的大数据SQL引擎,能够满足位于不同数据中心、不同类型数据源的数据联合分析/即时查询的需求。在腾讯整个天穹大数据图谱中,负责连接端与存储。
数据源无论是关系型数据库、NoSQL还是大数据系统;数据存储无论是跨集群还是跨数据中心;数据计算无论是报表生成、分析挖掘还是交互式查询......SuperSQL作为统一的SQL引擎,都能够提供统一的异构数据管理和联邦分析入口。
本文将专注于SuperSQL的计算实现,详解SuperSQL为何要实现跨计算引擎、如何实现计算引擎解耦,以及计算对接的未来工作。
01
计算引擎在SuperSQL中的位置
SuperSQL的核心设计思路是“漂移计算“,就是将单一SQL中涉及不同DC数据源的子计算部分(子查询SQL),尽可能下推给对应的数据源本地执行;计算引擎完成不同数据源子查询中间结果的联接与合并。因为计算引擎仅从各个数据源获取子查询下推后的中间结果,其相比原始数据表的数据量通常小很多,这就能够节省DC间有限的网络带宽资源。
SuperSQL的技术架构图如下,逻辑上可以分为三部分:(1)客户端:对外提供多种标准接口;(2)Server:决定最优执行计划(计算下推、DC间计算路由等)(3)计算引擎:计算核心。
在SuperSQL整体的架构中,计算引擎是计算核心。计算引擎负责从数据源或者其他集群的计算引擎(当涉及跨DC时)拉取下推计算完成的结果,完成数据汇总计算。计算引擎的执行效率和稳定性会直接影响SQL结果的返回。
02
为何要实现跨计算引擎?
SuperSQL设计之初面临两个选择,一是将SQL优化、计算下推等逻辑耦合到特定计算系统上(例如SparkSQL),二是将SQL优化、计算下推等逻辑与计算解耦。
SuperSQL选择了后者,原因如下:
- 与计算耦合会导致随着这些开源计算引擎的不断迭代演化,SuperSQL中需要对应进行定制化修改,可扩展性差,维护代价高
- 在大数据领域,没有一个万能的计算引擎,各有优缺点。例如,Hive虽然执行慢,但执行稳定;Spark计算Batch SQL效率比Hive高,但长时间运行的SQL稳定性不如Hive(因内存或网络抖动Shuffle经常失败重试);MPP类计算系统适合小数据量的快速交互查询,但因其缺少容灾且隔离差,一个变态SQL可能造成整个系统崩溃
- 与计算解耦,SuperSQL可以专注在最优执行计划生成(计算下推提取、DC间计算路由等)。同时,可以根据不同计算引擎的特点以及SQL类型量体裁衣,智能选择最佳的计算引擎。
03
SuperSQL对接计算引擎整体方案
SuperSQL在执行层采用的方案是:将CBO挑选的最优物理执行计划反向生成SQL,不同的数据源的下推SQL首先以视图(View)的形式注册到计算引擎中,然后利用计算引擎来执行一条汇总的SQL语句。假设一个SuperSQL查询中涉及N个JDBC数据源时,最终将生成至少N 1条SQL语句,其中N条SQL是需要下推到数据源执行的(一条SQL对应一个数据源,每条SQL映射为计算引擎的一张视图),最后一条则是由计算引擎负责,将各个视图的结果(即下推计算的结果)汇总计算返回结果,如图1所示。
图1:SuperSQL查询执行流程:下推SQL视图 执行引擎汇总
基于上述方案,无论用户期望使用哪种计算引擎,因为SQL语言的通用性,只需要添加对应的轻量级语法方言(Dialect)适配类即可完成对接,既不需要改动底层逻辑,也达到了与特定计算引擎解耦的目的,使得SuperSQL作为中间件具备了良好的可维护性和扩展能力。此外,因为生成的是SQL,既便于系统的调试与问题的定位,也能够很方便地展示给用户和管理人员。
此外,SuperSQL支持用户接入用户自定义的计算引擎。考虑到整体的架构实现,SuperSQL对接入的引擎要求包括以下几点:
- 支持标准SQL语法并提供JDBC接口,供SuperSQL对接
- 能够通过JDBC/HDFS/定制适配器等方式连接到每个SuperSQL数据源,连接信息在视图创建时由SuperSQL动态发给执行引擎
- 支持对接Hive MetaStore读写常用格式的HDFS表,如ORC、TEXT等(此要求可选)
04
SuperSQL对接计算引擎的具体实现
以对接Spark为例。SuperSQL外接Spark执行引擎来查询执行的整体流程:一方面将数据源下推SQL映射为视图,另一方面是执行合并SQL并返回结果。
图2:SuperSQL对接计算引擎的具体实现
如图2所示,用户的SQL语句经过优化后对应的执行计划逻辑是:首先对PostgreSQL数据源的数据表进行聚合操作,对来自MySQL数据源的两张表进行Join操作,最后再进行Join操作汇总结果。那么SuperSQL会将该执行计划转换为三条SQL语句,其中视图1(View1)对应下推给数据源PostgreSQL执行的SQL,视图2(View2)对应下推给数据源MySQL执行的SQL。在Spark计算引擎中会注册这两个视图,并进行最后的SQL汇总计算。
整体的算法实现逻辑采用Visitor设计模式,起到核心作用的是SuperSqlJdbcImplementor和SuperSqlImplementor,SuperSqlImplementor生成汇总SQL,SuperSqlJdbcImplementor生成各视图的SQL和数据源的基本信息。
图3:访问者模式生成SQL语句
如图3所示,当SuperSqlImplementor访问到JdbcToEnumerableConverter节点时(该节点子树代表一个数据源的下推计算),停止继续递归访问,调用SuperSqlJdbcImplementor来访问子树。当SuperSqlJdbcImplementor访问到JdbcTableScan时(代表扫描一张Jdbc数据源表),保存数据源的基本信息。
最终,SuperSqlImplementor可以从SuperSqlJdbcImplementor中获取到视图的基本信息及其生成的下推SQL,并将得到的视图名称返回给SuperSQL,作为访问JdbcToEnumerableConverter节点的结果。在此过程中,数据源方言(Dialect)起到了至关重要的作用,其内部定义了不同数据源的特性,这样执行计划会相应地生成不同的SQL语句。
05
SuperSQL对接计算引擎优化:数据源等价集
上述方案实现了通用的逻辑,满足了通用情况下用户任务分布式执行的需求。然而在一些特定的场景下,还涉及到一些可以优化的点。例如在现网环境中,不同的数据源在逻辑上是相互独立的,但物理层连通且计算引擎共用。
这里举个例子,假设用户的分析语句如下:需要对来自TDW平台的两个数据源(tdw.ss.test和tdw.t1.test)中的两个表,以及Venus平台的一个数据源(venus.kf.test)中的一个表进行Join操作。
select t1.x, t2.y, t3.zfrom tdw.ss.test.mytable1 t1 join tdw.tl.test.mytable2 t2 on t1.id=t2.id join venus.kf.test.mytable3 t3 on t2.id=t3.id
因为TDW中的两个数据源在逻辑上是不同的,那么SuperSQL中对应生成的执行计划如图4所示,整个物理算子树将被拆分为三个模块。
图4:数据源等价的场景
但是在物理层面,这两个数据源本质上是能够相通的,能够在同一个HiveServer上访问。如果将其看成两个不同的数据源,这样会带来两方面的性能问题:(1)额外的JDBC传输次数,带来网络和存储的不必要开销;(2)执行逻辑复杂化,底层的执行引擎会被多次调用。
图5:基于数据源等价集的优化
考虑到上述情况,SuperSQL中引入了数据源等价集的概念,用来表示在物理层面两个数据源对应的计算引擎是共享的或者是可以相互访问的。基于数据源等价集的概念,在生成SQL之前,SuperSQL会访问执行计划,根据JdbcTable中的信息进行查找,将等价数据源对应的子树进行合并,然后再基于合并后的子树生成SQL。
如图5所示,上述例子中,下推到TDW数据源的两个子树可以合并,相应地,两条下推的SQL也可以简化为一条,Join操作也能够在TDW的HiveServer中完成,减少了通过JDBC接口的数据传输次数。
06
计算对接的未来工作
SuperSQL已经支持的计算引擎包括(支持动态切换): 单机内存执行(仅小数据量或演示使用) ;Hive(负责DDL、ACL类SQL);Spark(负责Batch SQL)。
后续SuperSQL会尝试对接更多的计算引擎。目前引擎的选择是基于规则或者Session参数,还没有做到真正的“智能”化。未来SuperSQL会将计算引擎的选择扩展到CBO框架中,利用基于的代价优化来挑选最适合SQL的计算。
07
总结 & 业务价值
SuperSQL灵活、易扩展的计算引擎框架支持快速开发插件对接其它类型的大数据计算引擎,且不紧耦合于特定的引擎类型或版本。与计算解耦可以让SuperSQL专注在最优执行计划生成,同时也为根据SQL类型选择最佳的计算引擎留下优化空间。
SuperSQL计算引擎框架对业务透明,为业务SQL自动选择最佳计算,提升业务使用数据效率。目前SuperSQL已经服务腾讯云、音乐、游戏等业务,满足业务对跨数据源的联邦分析需求,最大化数据使用价值,助力业务发展。
作者:朱锋,腾讯大数据SuperSQL团队工程师。
以上就是这篇文章的全部内容了,大家如果对腾讯天穹SuperSQL有疑问,欢迎随时留言给我们。
在文章下方以“#你问我答# 提问内容”的形式留言,就有机会得到专家回复,还将获得腾讯视频VIP月卡一张哦!