导语:SuperSQL是腾讯数据平台部自研的跨数据源、跨数据中心、跨执行引擎的统一大数据SQL分析平台/中间件,支持对接适配多类外部开源SQL执行引擎,如Spark、Hive等。
背景
SuperSQL是一款自研的跨数据源、跨数据中心、跨执行引擎的高性能大数据SQL中间件,满足对位于不同数据中心的不同类型数据源的数据联合分析/即时查询的需求。SuperSQL的目标是成为公司内部统一的SQL分析中间件,实现以下三点的价值:
SuperSQL基于Apache社区Calcite[1]动态数据管理框架构建,并围绕上述目标对Calcite Parser/Planner/MetaStore等组件做了大量的定制、扩展和优化。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系统模块均为套件中自带的其它组件,参数具体如下所示。
总体情况
上表给出了性能测试的详细结果,其中字段的含义说明如下:
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)性能优势明显:
SuperSQL作为公司自研的跨DC多数据源的数据分析平台,不管是单源还跨源的情况下都比开源Spark JDBC有着极为突出的性能优势,且在应对复杂查询时对资源的要求远比Spark要低,具有更好的鲁棒性。SuperSQL性能测试后续将持续进行并获取新的结果,同时在后续版本中针对性能测试发现的问题持续优化,进一步提升SuperSQL的可用性与稳定性。
未来规划
现在的SuperSQL即将融合现网落地,但仍有很多特性需要完善和改进,之后的主要方向包括:
参考
[1] Calcite: https://calcite.apache.org/