前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SuperSQL:跨数据源、跨DC、跨执行引擎的高性能大数据SQL中间件

SuperSQL:跨数据源、跨DC、跨执行引擎的高性能大数据SQL中间件

作者头像
腾讯技术工程官方号
发布2019-09-24 10:40:05
8.2K1
发布2019-09-24 10:40:05
举报

导语:SuperSQL是腾讯数据平台部自研的跨数据源、跨数据中心、跨执行引擎的统一大数据SQL分析平台/中间件,支持对接适配多类外部开源SQL执行引擎,如Spark、Hive等。

背景

SuperSQL是一款自研的跨数据源、跨数据中心、跨执行引擎的高性能大数据SQL中间件,满足对位于不同数据中心的不同类型数据源的数据联合分析/即时查询的需求。SuperSQL的目标是成为公司内部统一的SQL分析中间件,实现以下三点的价值:

  • 解决业务数据孤岛,最大化数据的使用价值
  • 执行引擎最优选择,提升业务使用数据效率
  • 优化集群资源使用,解决业务资源使用瓶颈

SuperSQL基于Apache社区Calcite[1]动态数据管理框架构建,并围绕上述目标对Calcite Parser/Planner/MetaStore等组件做了大量的定制、扩展和优化。SuperSql的主要特性包括:

  • 跨数据源查询:支持通过JDBC对接MySQL、PostgreSQL、TBase、Hive (ThritServer)、SparkSQL、H2、Oracle、Phoenix (HBase)、ElasticSearch等数据源,且支持对接同一类数据源的不同版本(如Hive 2.3.3与Hive 3.1.1);
  • SQL算子下推:支持常用SQL操作下推数据源执行,具体包括Project、Filter、Aggregate、Join、Sort、Union、Intersect、Except、Limit、Offset、UDF和Nested Query;
  • SQL引擎CBO(基于代价优化):基于Volcano模型,选择最优的查询执行物理计划;
  • 跨数据中心CBO:将集群负载、网络带宽等因子纳入代价估算,选择最优的跨数据中心执行计划,拆分子查询到不同DC的多个计算引擎执行;
  • 最优计算引擎选择:支持对接多种不同类型的分布式计算引擎 (如Spark, Hive, Flink, Presto),支持为每个SQL智能挑选最优的执行引擎;
  • 标准SQL语法:支持SQL 2003、Oracle12和MySQL5语法。

SuperSQL的主要应用场景包括:

  • OLAP数据分析 - 通过SuperSQL对数据分析/挖掘、生成报表等
  • 数据即时查询 - 通过SuperSQL对数据采样、小数据交互式查询等
  • 数据联邦查询 - 通过SuperSQL联合分析不同数据源(例如Hive、HBase)中的数据
  • 割裂的数据版本 - 通过SuperSQL查询不同集群中部署的不同数据源版本中的数据
  • 跨数据中心查询 - 通过SuperSQL查询多个数据中心中的数据

性能优势:TPC-DS基准评测

目前我们评估了在1GB和100GB的TPC-DS性能测试基准数据集之上,SuperSQL V0.1版本与社区SparkSQL JDBC基线相比,在Hive和PG数据源上执行99条TPC-DS SQL查询的响应时间。

测试环境

软硬件参数

SuperSQL V0.1版本当前作为组件之一随TBDS套件对外发布。本测试使用的系统版本是TLinux 2.2 64bit Version 2.2 20190320;使用的Hive和PG数据源、Spark计算引擎等SuperSQL系统模块均为套件中自带的其它组件,参数具体如下所示。

测试结果分析

总体情况

上表给出了性能测试的详细结果,其中字段的含义说明如下:

  • 重复次数:代表了TPC-DS 99条SQL每条被执行的次数;如果大于1,结果取多次测量的平均值;
  • 对比组数:针对SuperSQL和Spark JDBC进行对比,只要有一方能成功执行SQL得到结果,即产生对比;
  • 有效对比组数:和对比组数的区别在于,只有SuperSQL和Spark JDBC双方均能拿到测试结果,才产生对比;
  • 更快方式:对比SuperSQL和Spark JDBC的99条SQL的平均时间,耗时短的更快;
  • 性能提升:Spark JDBC的平均执行时间除以SuperSQL的平均执行时间,表示SuperSQL相比Spark基线查询响应时间降低的倍数;
  • 成功组数:能够拿到测试结果的query数目;
  • 总时间:有效对比组数的总时间,只有双方都拿到测试结果,才会将这个时间计入;
  • 平均时间:有效对比组数的平均时间。

1GB查询时间分析

耗时分布对比

上图展示了在1GB数据规模下,SuperSQL和Spark JDBC针对所有99条TPC-DS SQL(部分SQL带分号拆分为两条串行执行,实际为103条)执行时间的对比情况。通过参数优化等方式解决测试中发现的少量SuperSQL查询执行缓慢问题,目前100%TPC-DS测试用例SQL在SuperSql的执行时间可实现远低于或持平Spark JDBC。测试中,我们认为相差10%以内的响应时间结果数据为等价。

图中横轴代表了SuperSQL某条SQL的查询时间除以对应Spark JDBC该SQL的查询时间,然后按照<50%和50%~100%条目分组,分别代表SuperSQL时间是Spark时间的0.5倍以内和1倍以内。纵轴代表了两个条目每个各自包含的SQL数目。例如,从图中我们可以看到Hive作为数据源时,有45条(占比43.69%)SQL 的SuperSQL查询时间在Spark JDBC的50%以下,PG数据源时这个数目为84条(占比81.55%),Hive+PG时为40条(占比38.83%)。

由于1GB的数据规模实在太小,每条query的执行时间都很短,将时间比值作为性能评价依据存在一定的局限性,因此在100GB的结果分析中中,这种现象将会被更加详细的分析。

平均耗时对比

上图显示了SuperSQL和Spark JDBC在不同数据源下的平均执行时间对比情况。Hive作为数据源时,SuperSQL执行一条TPC-DS SQL的平均时间为11.66s,而Spark JDBC为21.68s,性能上SuperSQL较Spark JDBC提升了约86%;PG作为数据源时,性能提升约60%;Hive + PG跨源时,SuperSQL性能提升约83%。

整体而言,在测试数据集规模比较小1GB时,SuperSQL整体较Spark JDBC可匹配或快不到一倍,但是由于整体平均查询时间仅在十几秒左右,计算耗时的比重较小,SuperSQL的性能提升优势并不是很明显,当数据规模增大时这一情况将会完全改观。

100GB查询时间分析

耗时分布对比

上图展示了在103条TPC-DS查询中,SuperSQL和Spark JDBC查询时间的对比情况。将每条查询的SuperSQL执行时间除以Spark JDBC执行时间,按照20%以下、20%~50%和50%~100% 3个区间段进行区分。横轴代表了不同数据源时上述各分组,纵轴代表的是各分组的数目。从图中我们可以观察到,在Hive单源下,有101条(98.1%)SQL的SuperSQL查询时间只占到Spark JDBC查询时间的20%以下;在100GB Hive+PG的混合源下,有88条(85.4%)SQL的SuperSQL的查询时间只占到Spark JDBC查询时间的20%以下。

需要说明的是,在100GB Hive + PG的组别中,Spark JDBC有46组查询过程中抛出异常,没有返回结果,但是SuperSQL则不会出现类似的情况。针对这种情况,上图的表述为:Spark JDBC的异常组别(无结果)作为时间比值<20%处理,实际上这种处理合乎常理,因为Spark JDBC的异常查询组别显得艰难无比,往往需要40min以上才给出报错,这种反应完全可以当作Spark JDBC的查询时间在40min以上,也有可能更长,而SuperSQL往往在400s以内就能够返回结果,所以上述处理是合理的。这也反映了SuperSQL在相同参数配置的情况下,比Spark JDBC应对复杂query的处理能力整体更加优异,对原SQL的优化和处理是卓有成效的。

平均耗时对比

上图给出了SuperSQL以及Spark JDBC所有查询平均时间的对比。可以看到,在Hive数据源下,SuperSQL执行TPC-DS SQL的平均执行时间仅为1.15min,而Spark JDBC则需要31.27min,SuperSQL较Spark JDBC性能提升了约26倍。在Hive + PG跨源的情况下,SuperSQL执行TPC-DS SQL的平均时间为4.63min,而Spark JDBC需要25.7min,性能提升约4.5倍。相比于1GB数据规模,100GB数据规模时SuperSQL的查询优势更加明显,这也与事实相符:在数据规模更加大时,计算耗时的比重更加大,总体耗时更能反映出查询过程的性能优劣。

有一点需要注意的是,从结果上看居然发现Spark JDBC跨源时的平均查询时间反而比单源更快,事实上,正如上一小节所述,Hive + PG作为跨源数据源时,Spark JDBC有将近一半(46条)query 查询失败,而在计算平均时间时这些组别是无法进行统计的,所以在能够执行的query范围内,Spark JDBC的跨源平均查询时间才比单源快,因此这个只是偶发现象,对整体而言是不准确的结论。正是因为Spark JDBC存在诸多异常组别(无结果),平均时间的对比并不能完全反应SuperSQL的性能优势,若是Spark JDBC有更多的组别不会因为资源限制拿不到结果,预计SuperSQL在数值上的性能提升将会更加可观。

测试结果总结

SuperSQL 性能测试结果汇总如下表所示,SuperSql在海量数据下相比社区基线(Spark JDBC)性能优势明显

  1. TPC-DS 100GB基准测试集,98%的Hive和86%的Hive + PG查询,SuperSQL执行时间不到Spark JDBC时间的20%
  2. TPC-DS 1GB基准测试集, 44%的Hive、82%的PG和39%的Hive + PG查询,SuperSQL执行时间不到Spark JDBC时间的50%

SuperSQL作为公司自研的跨DC多数据源的数据分析平台,不管是单源还跨源的情况下都比开源Spark JDBC有着极为突出的性能优势,且在应对复杂查询时对资源的要求远比Spark要低,具有更好的鲁棒性。SuperSQL性能测试后续将持续进行并获取新的结果,同时在后续版本中针对性能测试发现的问题持续优化,进一步提升SuperSQL的可用性与稳定性。

未来规划

现在的SuperSQL即将融合现网落地,但仍有很多特性需要完善和改进,之后的主要方向包括:

  • 兼容存量业务和数据:兼容各个BG存量的业务和数据,这包括不同的数据版本、不同的业务类型等;
  • 高效统计信息采集:统计信息(CBO Stats)是代价估算的基础 ,高效的Stats采集是SQL引擎必不可少的一部分,包括支持基于并发采样与增量更新的采集机制、兼容对接第三方Stats接口或仓库,基于历史查询负载的智能自动采集,等等;
  • 基于多代价因子的优化:扩展优化Calcite的VolcanoPlanner CBO模型,支持包括:规则集切分优化、单DC CBO网络代价与字节数估算扩展、多计算引擎的跨DC分布式查询执行、下推并发子查询切分,等等;
  • 最优执行引擎的智能选择:不同的SQL可能适合于不同类型的计算引擎(Hive,Spark,Flink,Presto等)来执行,目前路由基于简单的规则和启发性代价,未来要开发一套智能规则,根据每个SQL的特征选择其最适合的引擎来执行。

参考

[1] Calcite: https://calcite.apache.org/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯技术工程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试环境
  • 测试结果分析
  • 测试结果总结
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档