无需数据搬迁,10倍性能提升!携程的统一分析之旅
StarRocks 小编导语:
携程自 2022 年起引入了 StarRocks,目前已经成为了集团内部的主要技术栈,应用到酒店、机票、商旅、度假、市场、火车票等多个关键业务线。目前,携程内部已经拥有超过 10 个 StarRocks 集群,内表总数据量超过 230T,每日查询量超过 1100W ;StarRocks-Hive外表每日查询量超过 10W。SQL复杂、底表大:为了满足复杂的业务需求,用户配置的报表 SQL 往往涉及多表关联、子查询、聚合等复杂操作,非常多的 SQL 达到数百行。并且,用户查询的底表通常很大,往往超过了百 GB,甚至超过 TB。
高并发、低耗时:用户习惯上会把数据通知的邮件任务设置在整点,比如 8:00、9:00 是发送邮件的高峰期。这时系统内会有超过上千个复杂 SQL 同时查询,给整个集群带来比较大的压力。并且,单个仪表盘往往包含十多张甚至几十张报表,当用户打开仪表盘时,会有几十个复杂 SQL 同时查询。如何降低 SQL 延迟,保证响应足够快,让用户 0 等待也是一个比较大的挑战。
01
Complex Workflow ->
One Data,All Analytics
01
Stage1: StarRocks as an OLAP, 10 time faster but complex
01
一个最直观的方案是把数据导入至 OLAP 数据库内进行加速。经过一系列调研、测试、验证,自 2022 年起,携程就开始采用 StarRocks 作为加速 Artnova 报表的新引擎。
第一阶段我们把 StarRocks 当作 OLAP 数据库使用,小表通过 StreamLoad 方式、大表通过 SparkLoad 方式将数据从 Hive 导入到 StarRocks 内部,并针对 SQL 查询创建合适的索引。这样的方案取得了非常好的加速效果,加速后平均耗时从 20 秒左右降低到了 1.5 秒,性能有 10 倍以上提升,真正为业务提供了秒级的报表体验。
图表为日均查询耗时,可以看到前后对比明显
然而,这样的方式也有一定弊端:
导入性能虽然比较快,但相较查询 Hive 数据仍有一定的滞后,业务查询的灵活性和实效性受到了影响。 需要额外维护导入任务、针对不同查询进行表模型、索引设计,为整个数据 pipeline 引入了复杂性。
02
Stage2: StarRocks as a Lakehouse, fast and also easy and scalable
02
我们迫切的需要一种能够在降低数据链路复杂度的前提下提升性能的方式。作为 StarRocks 的用户,我们一直积极地参与社区、关注社区的最新进展。社区自 2.0 版本之后就开始不断打磨湖上联邦查询的能力。3.0 版本发布之后,StarRocks 正式宣布升级为湖仓一体的新范式。不仅在查湖的性能、稳定性上进行了增强,外表物化视图的能力更是让人眼前一亮,而且社区还支持了 Trino 的语法,大大降低了迁移门槛。这让我们迫不及待的开始了测试。
测试效果非常惊艳。StarRocks 在直接查湖的性能上非常优异,在开启 Data Cache 后性能是 Trino 的 7 倍,某些场景下创建物化视图后甚至有几十倍性能提升。
上图为 Artnova 当前的架构。新的架构充分利用了 StarRocks 数据湖查询以及异步物化视图的能力。新架构有如下优点:
无数据延时:StarRocks 的 Hive Catalog 可直接对 Hive 进行高效查询,提供比 Trino 更快的查询加速,解决了 StarRocks 作为 OLAP 时的数据延时问题。 无数据搬迁:因为直接查询的性能已经足够优秀,大部分场景不用再将数据导入内表;对于部分需要进一步加速的极端复杂场景,可以通过物化视图来维护计算逻辑以及更新 pipeline。这大大降低了数据链路的维护成本,使整套方案更加通用可扩展。 按需透明加速:物化视图的透明查询改写能力使平台可以按需对慢 SQL 进行治理。当出现慢查询时,平台只需分析 SQL 逻辑、创建合理的物化视图即可,不需要大张旗鼓地对数仓各层表逻辑进行更改。对于业务用户来说,也无需更改查询语句,即可通过透明改写享受到查询提速。从而业务用户可以不再关注性能优化,专注于业务逻辑;平台也提升了体验优化的效率。
02
湖上直查性能强悍,7倍以上性能提升
湖上直接查询的性能是选型基础。网上有很多使用 TPC_DS、SSB 标准数据集测试StarRocks 和 Trino 的报告,效果非常理想。我们便跳过这一阶段,直接用真实业务报表进行测试。
先介绍下我们报表平台的数据结构:数据集和报表。数据集结构是指基础 SQL,可以是单表查询,雪花模型,星形模型等复杂 SQL。报表结构则是在数据集基础之上,进一步加工聚合的业务 SQL,同一个数据集上根据业务需求不同可能会存在多张报表。本次测试选取了涉及 10 个常用数据集的共 4000 张报表,包含 15 种业务场景,涵盖多表 join,单表,大表,小表等 4000 多个常用查询。在稳定性,正确性,查询性能等方面都得到了验证。
在同等配置的集群下,在未开启 DataCache 情况下,StarRocks 是 Trino 的2.2倍,在开启了 DataCache 之后,平均是 Trino 的7.4倍。
测试结果下:
图表中延时为每一类查询的平均延时。
03
StarRocks为什么能比Trino直查快
StarRocks 凭借其优秀的向量化引擎、pipeline 执行引擎、CBO、Global Runtime Filter 等特性,在复杂场景下的查询原生就具备优势。但是,湖上查询与内表不同,一方面数据在远端存储上,计算和存储不在一个节点会导致天然的网络开销。另一方面,元数据不是 StarRocks 托管的,很难像内表一样完全掌控统计信息用于加速查询规划和调度。
但是好在 StarRocks 也对湖上查询做了非常多的专项优化,主要分为两大块:
01
裸查加速优化
01
湖上查询加速的瓶颈主要在 I/O 跟元数据上。StarRocks 做了很多降低 I/O 的优化:
I/O 合并:根据查询情况自适应 I/O 合并,从而减少 I/O 次数; 延迟物化:首先对带谓词筛选的列进行过滤,定位目标行,再对应读取其他需要访问的列,减少 I/O 总量; 针对各类文件类型 Reader 的优化
02
Data Cache
02
StarRocks 查询 Hive 外表需要把远端数据拉取到BE节点进行计算,这一阶段比较消耗网络开销,也会对 HDFS 造成一定压力。并且,如果 HDFS 有抖动,也会对最终的响应时间有一定影响。
StarRocks 的 Data Cache 可以在用户第一次查询时异步地按照查询范围的 block 块缓存原始数据到 BE 节点,当后续查询命中 block 块时便可以直接从 BE 节点读取,避免了再次从 HDFS 取数。社区也在研发异步填充 Cache 的优化,从而让 Cache 填充本身不会对查询性能产生影响。
除了这些湖上的原生加速手段,StarRocks 还拥有一个其他湖仓架构没有的加速利器:物化视图。
03
物化视图锦上添花,整体 10 倍以上性能提升
03
虽然直接查询已经比 Trino 的性能好很多,但是还是有一些老大难的数据集不仅数据量大、查询复杂,业务的查询时延要求还较高。在这种情况下,原来我们只能将数据提前进行处理,然后将结果数据导入到 StarRocks 来进行加速。这意味着我们需要额外维护数据的加工及导入逻辑,用户的查询 SQL 也需要对应改到查询 StarRocks 内表。
通过物化视图可以方便、无痛地解决这个问题。物化视图具备如下几个特点:
自动异步加载数据
物化视图可以自己维护刷新的逻辑,尤其分区物化视图还能自动根据分区变更进行增量刷新,降低了维护成本。另外物化视图加载和处理数据的速度非常快,原来 Spark Load 耗时一小时的表,物化视图大概只需要 5 分钟。
透明加速
物化视图支持透明的查询改写,从而用户不用修改 SQL 便可借用物化视图进行查询加速,做到了对用户透明。
我们针对某个查询延时要求较高、数据量较大的场景进行了 PoC 验证。该场景需要对 16 亿行的大数据集进行聚合计算,由于数据量太大,全部导入内表基本不可能。然而,直接通过 Catalog 冷查询的性能在 1-2 分钟,不能满足业务需求。因此我们根据查询创建了物化视图。物化视图的大小缩小至 10GB 左右,整体刷新在 15 分钟内即可完成,基于物化视图的查询耗时缩短至了 2.5 秒以内,性能有 3-40 倍提升。
物化视图非常适合数据聚合加速的场景,应用可以非常灵活,在单表聚合、多表 join 在聚合等场景都能发挥价值。某特慢数据集从 Trino 转为 StarRocks Hive 外表+MV 的查询前后性能对比如下,可以看到在8月23日之后查询耗时有断崖式的下跌。
通过 Catalog+MV 的整体方案,提速非常显著,已迁移 StarRocks Hive 外表的报表平均提速达到 10 倍,与 StarRocks 内表提速相当。目前已超过 10W 查询从 Trino 切到 StarRocks Hive 外表上。用户体验得到显著提升。
最佳实践
01
语法兼容性 99%,为业务迁移打好基础
01
02
开启 Data Cache
02
03
创建合适的物化视图
03
04
DataNode混部
04
05
自动迁移
05
后续优化方向
01
物化视图的智能推荐
01
02
物化视图的索引
02
03
通过StarRocks进行湖上ETL:Iceberg+DBT+StarRocks
03
支持 Iceberg V2 表的 equal-delete 读取 支持更新 Icerberg 文件(Merge Into语法) Iceberg 文件 compaction 及管理优化
关于 StarRocks
Linux 基金会项目 StarRocks 是数据分析新范式的开创者、新标准的领导者。面世三年来,StarRocks 一直专注打造世界顶级的新一代极速全场景 MPP 数据库,帮助企业构建极速统一的湖仓分析新范式,是实现数字化转型和降本增效的关键基础设施。StarRocks 持续突破既有框架,以技术创新全面驱动用户业务发展。当前全球超过 300 家市值 70 亿元以上的头部企业都在基于 StarRocks 构建新一代数据分析能力,包括腾讯、携程、平安银行、中原银行、中信建投、招商证券、大润发、百草味、顺丰、京东物流、TCL、OPPO 等,并与全球云计算领导者亚马逊云、阿里云、腾讯云等达成战略合作伙伴。拥抱开源,StarRocks 全球开源社区飞速成长。目前,已有超过 300 位贡献者,社群用户近万人,吸引几十家国内外行业头部企业参与共建。项目在 GitHub 星数已超 5600 个,成为年度开源热力值增速第一的项目,市场渗透率跻身中国前十名。