StarRocks 在小红书自助分析场景的应用与实践
作者:小红书 OLAP 研发负责人 王成
小编导读:
近两年 StarRocks 一直是小红书 OLAP 引擎体系里非常重要的部分,过去一年,小红书的 StarRocks 使用规模呈现出翻倍的增长速度,目前整体规模已经达到 30 个集群,CPU 规模已经达到了 3 万。在 11 月 17 日举行的 StarRocks Summit 2023 上,小红书 OLAP 研发负责人王成介绍了最近一年小红书在 StarRocks 应用方面的新进展,并重点分享了 StarRocks 在小红书自助分析场景下的应用与实践经验。据王成介绍,StarRocks 3.0 在湖上分析能力的增强促使小红书自助分析场景的主力查询引擎通过灰度迁移机制从 Presto 平滑迁移到 StarRocks,已迁移部分的平均查询性能提升了 6~7 倍。我们将王成的精彩演讲整理出来,希望小红书的实践经验对大家能有所启发。背景
01
数据平台架构
01
图中是小红书数据平台的整体架构,从下往上分别为存储层、表格式层、数据加工层、查询层、应用层。
存储层,小红书所有的存储都架构在各家云厂商的对象存储之上; 表格式层,以 Hive 和 Iceberg 为主; 数据加工层,包括离线跟实时两个链路,离线同步链路主要使用 Spark ,实时则主要使用 Flink ; 查询层,目前主要有 4 款查询引擎,在这些引擎的基础上,我们构建了非常丰富的数据产品以及分析产品; 应用层,包括各类实时报表平台、自助分析平台以及一些即席分析平台。
02
基于 StarRocks 的实时分析场景
02
近两年,StarRocks 的存算一体模式一直支撑着小红书实时分析场景发展,我们已经全面覆盖了广告、社区、电商直播等各个核心领域的报表以及数据产品。
03
StarRocks 在实时分析场景的规模
03
过去一年,小红书的 StarRocks 使用规模翻倍增长,目前整体规模已经达到 30 个集群,总 CPU 核数达到 3 万,每天数据写入量达到千亿级别,查询达到上亿次,单个集群的查询峰值 QPS 能够达到 2000 甚至 3000,并且整体的平均查询延迟能够控制在 200 毫秒,这些数字充分说明了 StarRocks 在小红书内部起到的关键作用。
04
Adhoc 场景遇到的问题
04
但是这种存算一体模式也存在一定缺陷,最核心的问题是存在额外的数据同步过程,数据必须同步到 StarRocks 内部才能对外提供服务,这就引入了数据同步以及数据冗余,带来了额外的资源消耗。此外,数据同步以及数据校验方面的工作,也给我们带来了很大的运维压力。
在自助分析场景下,查询的 QPS 以及延迟时间要求会稍微低一些,但是数据规模非常大,底层数据是整个数仓的基础数据,包括上万张表、 EB 级别的数据,如果想把这么多数据都同步到 StarRocks 里明显不现实。在这个场景下,我们之前采用了 Presto 来优化整体的查询性能,Presto 因其在交互式分析以及复杂查询上面的优势,过去几年帮助我们很好地提升了查询性能和用户体验。但是随着小红书自助分析场景需求的不断增长,Presto 已不能满足我们日益增长的降本增效需求。
在 Adhoc 场景下,Presto 上遇到了几个问题:
技术架构复杂化,公司内部同时有 Clickhouse、Presto 及 StarRocks 三个核心查询引擎需要维护,大大增加了开发以及运维难度。 Presto 的性能优化困难。 Presto 的主从模式还存在单点故障问题,有潜在的稳定性风险。
升级选型与真实场景测试
01
StarRocks 湖仓新范式
01
StarRocks 3.0 提出了湖仓分析新范式,在湖上分析能力的增强,给我们带来了曙光。根据官方的一个 benchmark,相比于 Trino, StarRocks 直接分析湖仓数据能够有 3~5 倍的性能提升,因此我们决定从 Presto 迁移到 StarRocks 上。
迁移的理由包括:
StarRocks 性能的优化代表它能够提供更高的性价比,能够给我们在降本增效上带来收益。 StarRocks 能够简化我们的技术体系,降低运维难度。目前在小红书内部,StarRocks 已经成为最关键的查询引擎,我们在 StarRocks 的运维以及技术方面的积累更为深厚。在这种情况下,如果能把 Presto 替换成 StarRocks,整体的运维压力以及运维难度会大大降低。 从 Presto 到 StarRocks 的迁移非常方便,在 StarRocks 里查询外部数据,只需简单定义一个 catalog 即可,同时 StarRocks 能够支持一些 Java UDF,这就方便我们迁移在 Presto 上开发的一些定制化功能。更重要的是,StarRocks 3.0 支持了 Trino 的方言模式。对我们来说,用户是我们的分析师,他们的常用习惯很难改变,在这种情况下,兼容 Trino 查询语义,可以让整个迁移过程变得更平滑,用户体验也会更好。
02
基于实际业务验证的四个方向
02
我们基于实际业务验证的 4 个方向分别是正确性、稳定性、性能以及兼容性。正确性和稳定性是查询引擎的生命基线;性能决定着我们在迁移之后能够拿到多大的业务价值;兼容性则代表着迁移的步伐,以及迁移的难度。
正确性方面,我们整体的验证过程起始于 3.0 版本,收敛于 3.1 版本。在 3.0 版本上,我们在测试过程中遇到过一些问题,但是在跟社区合作过程中,社区非常活跃,及时解决了这些问题,在 3.1 版本基本已不再存在正确性方面的问题了。 在稳定性方面,3.1 版本已经能够达到非常高的稳定性,在我们的高压测试中,可以稳定运行一周以上。我们做了不同并发下的一个压力测试,分别是 10 并发、20 并发以及 30 并发,使用了 StarRocks 3.1.4 和线上稳定的 Presto 版本进行对比。随着查询并发数的增加,StarRocks 在稳定性方面的表现明显优于 Presto。
在性能方面,我们从线上过去的实际查询中抽取 3000 个查询,分别进行了串行 10 并发、20 并发、30 并发的压力测试。对比 Presto,96% 的查询都有非常明显性能优化效果。同时,在所有的并发度下,StarRocks 的查询性能相比于 Presto 而言都会有 4 倍以上的提升。
在兼容性上,3.1 版本在对很多的语法兼容能力进行补全之后,对 Presto 相关语法兼容性能够达到 90%,只缺少少量特殊语法,例如 CTAS。目前我们线上的整体覆盖度能够达到 60%。
目前我们线上稳定版本已经升级到 3.2 ,该版本不仅提供了 CTAS 语法的支持,并通过 JNI 接口帮助我们去扩展更多的 table format,以及还有很多 Iceberg 相关兼容性优化。基于这些优化,我们的整体覆盖度已经提高到 85% 左右,我们还在持续扩展部分自定义功能,预计整体覆盖度可以提升到 90% 以上,达到新的里程碑。
从上述 4 个维度上来说,StarRocks 都已经达到了生产准入标准。
迁移过程
在后续的迁移过程中,我们希望整个迁移过程尽可能地平滑以及稳定,因此采取了动态灰度策略。
01
原查询服务整体架构
01
如图所示是引入 StarRocks 之前小红书自助分析的整体架构,在这里面的 Kyuubi 是具有分布式以及多租户特性的网关服务,也是我们查询服务 SQL 查询的入口。在 Kyuubi 上我们也做了深度定制化开发,在这个场景中,用到的核心功能是查询的路由功能和灰度功能。查询路由功能就是 Kyuubi 在接收到用户的查询之后,会根据用户查询的语法特性以及负载情况,将其动态路由到合适的计算引擎进行查询。
在这个场景下,以 Presto 的查询引擎为主,当用户的查询涉及到一些比较特殊的语法或者数据的扫描量特别大的时候,会将这些查询路由到 Spark 去执行。
02
灰度迁移机制
02
在引入 StarRocks 之后,我们对原有的 Presto 集群进行了切割,搭建了一个 StarRocks 集群,同时在路由规则里面增加 StarRocks 目前还不兼容的语法判断条件。当用户的查询过来之后,会首先判断用户的查询是否在 StarRocks 上能兼容,如果不能兼容,就会直接路由到 Presto 去执行。如果能够兼容,就会根据我们的灰度规则来动态决定它是发到 StarRocks 还是 Presto。这里的灰度规则主要是指动态的灰度比例,可以进行实时调整。
03
实际业务效果
03
在整个灰度调整过程中,我们会进行持续的正确性验证,利用每天闲时,也就是集群使用量较低的低峰期时间段,对 StarRocks 上的查询结果跟 Presto 查询结果进行动态比对。只有当天的查询性能、稳定性以及正确性都满足目标时,我们才会进一步增加动态灰度比例。这样的灰度调整大概持续了一个月,StarRocks 的灰度比例从 0% 提升到了100%,在这个过程中,我们切实享受到了 StarRocks 带来的性能提升效果。就已经迁移的部分而言,整体的平均查询性能提升了 6~7 倍,查询的 p90 降低了 90%,对于用户来说,查询体验得到了非常大的优化。并且我们整个迁移过程非常平稳,没有出现任何事故,也没有遇到用户吐槽。
弹性伸缩降本增效
01
集群架构
01
基于以上已经灰度的 StarRocks 湖上分析集群,我们拿到了很多的性能上的收益。同时我们希望能够在保持这部分性能不变的情况下,进一步达到降本增效的效果,因此我们在弹性伸缩上做了一些尝试。我们的 StarRocks 湖上分析集群整体架构分为 FE、CN 两部分,其中 CN 作为计算节点,本身就没有状态,非常符合弹性伸缩的理念。
02
基于 AWS Spot 的弹性伸缩方案
02
通常可以通过 CN 的容器化来进行弹性伸缩,我们的场景会更特殊一点,因为我们目前的数仓架构体系核心还是构建在 AWS 之上的,而 AWS 提供的 Spot 实例服务,可以让我们以竞价方式来获取空闲的机器,相比于包年包月方式最高能够享受到 90% 的折扣,并且可以随启随用,在低峰期能直接把机器还给 AWS,不收取任何费用。
为了适配弹性伸缩,我们主要实现了两块内容,一个是 CN 的自动化部署脚本,还有一个是 CN 会自动向 FE 进行注册跟注销。在扩容时,我们会自动向 AWS 申请 Spot 实例机器,当这些实例机器就位之后,会通过我们的自动化部署脚本进行部署,然后注册到 FE 上,这时候就可以对外提供服务了。缩容时,会自动从 FE 进行注销,注销之后再向 AWS 归还 Spot 实例。这两个自动化脚本让整体的扩缩容流程变得更加丝滑,扩缩容操作可以在 2 分钟内完成。
在整体架构上,所有 FE 以及少量 CN 使用的是包年包月方式,少量常驻的机器能保证最基础的服务能力,另外有 90% 的 CN 节点是通过 Spot 来申请的,可以在低峰期将这部分机器完全还掉。
03
成本优化效果
03
目前我们采取的还是一种在固定时间进行弹性扩展的方式。比如现在定义的低峰期就是 00:00~8:00,高峰期是 9:00~23:00。高峰期机器比较抢手,竞价价格会比较高,我们也不希望我们的机器经常被其他用户所抢占,因此高峰期的成本基本持平。在低峰期我们可以将 90% 的 CN 机器全部还掉,这能够节约大量的成本。总体而言,在目前查询性能不变的前提下,总体的成本能够降低 35%。
未来规划
短期目标
进一步拓展 StarRocks 的湖上分析能力
短期目标
未来我们的短期目标还是继续在 StarRocks 的湖上分析上进行更多拓展。StarRocks 湖上分析是我们走向湖仓一体的第一步,这一块目前还有一些欠缺。
我们目前最关注的指标就是整体查询的覆盖度,3.2 的版本的发布给我们带来很大的覆盖度提升。剩下一部分主要是 udf 功能持续的丰富,StarRocks 目前的 udf 相比于 Hive 而言灵活性稍差,比如支持的类型有限,不能支持动态返回类型等,我们未来会和社区一起在这方面进行持续的功能拓展。 数据湖 Iceberg 的集成优化,这一块目前也有一些亟需优化的点,我们会持续的跟社区一起去合作打磨。 我们目前完全没有开启缓存,上述的那些测试数据都是不使用缓存的,我们未来也希望能够去对本地缓存以及分布式缓存进行持续探索,看看能不能基于缓存进一步优化整体的查询性能。
长期目标
实践存算分离与湖仓一体
长期目标
长期来看,我们的两个方向,一个是存算分离模式的实践,另外一个还是湖仓一体的建设。
存算分离模式的引入能够帮助我们去替换掉更多的 OLAP 分析场景,帮助我们进一步降低整体技术栈的复杂度。
在湖仓一体方面,我们希望能将存算分离模式和湖上分析场景融合到一起,通过湖仓一体架构带来更强的数据开发和数据分析能力,包括但不止于以下两个关键特性:
打破湖和仓之间的隔阂,降低架构复杂度
存算分离模式,StarRocks 私有的数据格式也会放到云上,实际上成为了整个湖仓体系中一个普通的数据 format。用户在基于湖数据进行自助分析时,如果对查询性能有了更高的要求,可以通过物化视图的方式,将数据聚合成更高维度的 StarRocks 私有格式数据,提供查询加速。物化视图的构建也可以根据查询历史自动化构建,更为智能和高效。
2. 数据的流转更加方便高效
社区目前也在尝试通过 Spark 直接生成 StarRocks 自由格式数据,这项功能可以进一步实现读写分离,优化湖仓一体场景下数据同步的性能和便利性。
关于 StarRocks
Linux 基金会项目 StarRocks 是数据分析新范式的开创者、新标准的领导者。面世三年来,StarRocks 一直专注打造世界顶级的新一代极速全场景 MPP 数据库,帮助企业构建极速统一的湖仓分析新范式,是实现数字化转型和降本增效的关键基础设施。StarRocks 持续突破既有框架,以技术创新全面驱动用户业务发展。当前全球超过 300 家市值 70 亿元以上的头部企业都在基于 StarRocks 构建新一代数据分析能力,包括腾讯、携程、平安银行、中原银行、中信建投、招商证券、大润发、百草味、顺丰、京东物流、TCL、OPPO 等,并与全球云计算领导者亚马逊云、阿里云、腾讯云等达成战略合作伙伴。拥抱开源,StarRocks 全球开源社区飞速成长。目前,已有超过 300 位贡献者,社群用户近万人,吸引几十家国内外行业头部企业参与共建。项目在 GitHub 星数已超 7000 个,成为年度开源热力值增速第一的项目,市场渗透率跻身中国前十名。互联网:芒果TV|微信|小红书|网易邮箱|滴滴|美团餐饮SaaS|得物 |贝壳|马蜂窝|汽车之家|B站|58同城|同程旅行|360
新经济:蔚来汽车|理想汽车|顺丰|京东物流|大润发|华润万家|TCL |万物新生
StarRocks 技术内幕:极速湖仓神器:物化视图|存算分离,兼顾降本与增效 |实时更新与极速查询如何兼得|Query Cache,一招搞定高并发|资源隔离|大数据自动管理|查询原理浅析