StarRocks 在小红书自助分析场景的应用与实践

作者:小红书 OLAP 研发负责人 王成

近两年 StarRocks 一直是小红书 OLAP 引擎体系里非常重要的部分,过去一年,小红书的 StarRocks 使用规模呈现出翻倍的增长速度,目前整体规模已经达到 30 个集群,CPU 规模已经达到了 3 万。

在 11 月 17 日举行的 StarRocks Summit 2023 上,小红书 OLAP 研发负责人王成介绍了最近一年小红书的 StarRocks 的应用新进展,并重点分享了 StarRocks 在小红书自助分析场景下的应用与实践经验。据王成介绍,StarRocks 3.0 在湖上分析能力的增强促使小红书自助分析场景的主力查询引擎通过灰度迁移机制从 Presto 平滑迁移到 StarRocks,已迁移部分的平均查询性能提升了 6~7 倍。

我们将王成的精彩演讲整理出来,希望小红书的实践经验对大家能有所启发。

背景 数据平台架构

alt

图中是小红书数据平台的整体架构,从下往上分别为存储层、表格式层、数据加工层、查询层、应用层。

  • 存储层,小红书的所有的存储都架构在各家云厂商的对象存储之上;
  • 表格式层,以 Hive 和 Iceberg 为主;
  • 数据加工层,包括离线跟实时两个链路,离线同步链路主要使用 Spark ,实时则主要使用 Flink ;
  • 查询层,目前主要有4款查询引擎,在这些引擎的基础上,我们构建了非常丰富的数据产品以及分析产品;
  • 应用层,包括各类的实时报表平台、自助分析平台以及一些即席分析平台。

基于 StarRocks 的实时分析场景

alt

近两年,StarRocks 的存算一体的模式,一直支撑着小红书实时分析场景发展,我们已经全面覆盖了广告、社区、电商直播等等各个核心领域的报表以及数据产品。

StarRocks 在实时分析场景的规模

alt

过去一年,小红书的 StarRocks 使用规模翻倍增长,目前整体规模已经达到 30 个集群,总 CPU 核数达到 3 万,每天数据写入量达到千亿级别,查询达到上亿次,单个集群的查询峰值 QPS 能够达到 2000 甚至 3000,并且整体的平均查询延迟能够控制在 200 毫秒,这些数字都充分说明了 StarRocks 小红书内部起的关键作用。

Adhoc 场景遇到的问题

alt

但是这种存算一体的模式也存在一定缺陷,最核心的问题是存在额外的数据同步过程,数据必须同步到 StarRocks 内部才能对外提供服务,这就引入了数据同步以及数据冗余,带来了额外的资源消耗。此外,数据同步以及数据校验方面的工作,也给我们带来了很大的运维压力。

在自助分析场景下,查询的 QPS 以及延迟时间要求会稍微低一些,但是数据规模非常大,底层数据是整个数仓的基础数据,包括上万张表、 EB 级别的数据,如果想把这么多数据都同步到 StarRocks 里明显不现实。在这个场景下,我们之前选择了采用 Presto 来优化整体的查询性能,Presto 因其在交互式分析以及复杂查询上面的优势,过去几年帮助我们在很好地提升了查询性能、提高用户体验。但是随着小红书自助分析场景需求的不断增长,Presto 已不能满足我们日益增长的降本增效方面的需求。 在 Adhoc 场景下,Presto 上遇到了几个问题:

  1. 技术架构复杂化,公司内部同时有 Clickhouse、Presto 及StarRocks 三个核心查询引擎需要维护,大大增加了我们开发以及运维上面的难度。
  2. Presto 的性能优化困难。
  3. Presto 的主从模式还存在单点故障的问题,有潜在的稳定性的风险。

升级选型与真实场景测试

alt

StarRocks 湖仓新范式

StarRocks 3.0 提出了湖仓分析的新范式,在湖上分析能力的增强,给我们带来了曙光。根据官方的一个Benchmarks,相比于 Trino, StarRocks 直接分析湖仓数据的能够有 3~5 倍的性能提升,因此我们也是选择从 Presto 迁移到 StarRocks 上。

迁移的理由包括:

  1. StarRocks 性能的优化代表它能够提供更高的性价比,能够给我们在降本增效上带来收益。
  2. StarRocks 能够简化我们的技术体系,降低运维难度。现在 StarRocks 实际上在小红书内部已经是最重要的一款查询引擎,我们对 StarRocks 的运维以及技术方面的积累更为深厚的。在这种情况下,如果能把 Presto 替换成 StarRocks,我们的整体的运维压力以及运维难度会大大降低。
  3. 从 Presto 到 StarRocks 的迁移非常方便,我们在 StarRocks 里面如果要查询外部数据,只需要简单定义一个 catalog 就可以了,同时 StarRocks 能够支持一些 Java 的 udf,这就方便我们去迁移在 Presto 上开发的一些定制化的功能。更重要的是,StarRocks 3.0 支持了 Trino 的方言模式。对我们来说用户是我们的分析师,他们的常用习惯是很难改变的,在这种情况下,兼容 Trino查询语义,可以让我们的整个迁移过程变得更平滑,用户体验也会更好。

***基于实际业务验证的四个方向(((

我们基于实际业务验证的 4 个方向分别是正确性、稳定性、性能以及兼容性。正确性和稳定性是查询引擎的生命基线;性能决定着我们在迁移之后能够拿到多大的业务价值;兼容性则代表着迁移的步伐,以及迁移的难度。

  1. 正确性方面,我们整体的验证过程起始于 3.0 版本,收敛于 3.1 版本。在 3.0 版本上,我们在测试过程中其实也是遇到了一些问题,但是在跟社区合作过程中,社区非常活跃,及时地解决了这些问题,在 3.1 版本基本上不再存在正确性方面的问题了。

  2. 在稳定性方面,3.1 版本已经能够达到非常高的稳定性,在我们的高压的测试当中,可以稳定运行一周以上。我们做了不同并发下的一个压力测试,分别是 10 并发、20 并发以及 30 并发,使用了 StarRocks 3.1.4 和线上稳定的 Presto 版本进行对比。随着查询并发数的增加,StarRocks 在稳定性方面的表现明显优于 Presto。

alt
  1. 在性能方面,我们从过去的线上的实际查询中抽取了 3000 个查询,分别进行了串行 10 并发、20 并发、30 并发的压力测试。对比 Presto 3000 个查询里面有 96% 的查询都有非常明显性能优化效果。同时在所有的并发度下,StarRocks 的查询性能相比于 Presto 而言都会有 4 倍以上的提升。
alt
  1. 在兼容性上,3.1 版本在对很多的语法兼容能力进行补全之后,目前对 Presto 相关语法兼容性能够达到 90%,还差了少量特殊语法,例如 CTAS。目前我们线上的整体覆盖度能够达到60%。

目前我们线上稳定版本已经升级到 3.2 ,该版本不仅提供了 CTAS 语法的支持,并通过jni接口帮助我们去扩展更多的 table format,以及还有很多 Iceberg 相关的兼容性优化。基于这些优化,我们的整体覆盖度已经提高到 85%左右,我们还在持续地扩展部分自定义功能,预计整体覆盖度可以提升到 90% 以上,达到新的里程碑。

alt

从上述 4 个维度上来说,StarRocks 都已经达到了生产准入的标准。

迁移过程

在后续的迁移过程中,我们希望整个迁移过程尽可能的平稳以及稳定,因此采取了动态灰度策略。

原查询服务整体架构

alt

如图所示是引入 StarRocks 之前小红书自助分析的整体架构,在这里面的 Kyuubi 是具有分布式以及多租户特性的网关服务,也是我们查询服务 SQL 查询的入口。在 Kyuubi 上我们也做了深度定制化开发,在这个场景里面,我们用到的核心功能是查询的路由功能和灰度功能。查询路由功能就是 Kyuubi 在接收到用户的查询之后,会根据用户查询的语法特性以及负载情况,将其动态路由到合适的计算引擎进行查询。

在这个场景下,我们是以 Presto 的查询引擎为主,当用户的查询涉及到一些比较特殊的语法或者数据的扫描量特别大的时候,会将这些查询路由到 Spark 去执行。

灰度迁移机制

alt

在引入 StarRocks 之后,我们对原有的 Presto 集群进行了切割,搭建了一个 StarRocks 集群,同时在路由规则里面增加 StarRocks 目前还不兼容的语法判断条件。当用户的查询过来之后,会首先判断用户的查询是否在 StarRocks 上能兼容,如果不能兼容,就会直接路由到 Presto 去执行。如果能够兼容,就会根据我们的灰度规则来动态决定它是发到 StarRocks 还是 Presto。这里的灰度规则主要是指动态的灰度比例,可以进行实时调整。

实际业务效果

alt

在整个灰度调整过程中,我们会进行持续的正确性验证,会利用每天闲时,也就是集群使用量较低的低峰期时间段,去对 StarRocks 上的查询结果跟 Presto 查询结果进行动态比对。只有当天的查询性能、稳定性以及正确性都满足目标的时候,我们才会进一步增加动态灰度比例。这样的灰度调整大概持续了一个月,StarRocks 的灰度比例从 0% 提升到了100%,在这个过程中,我们切实享受到了 StarRocks 带来的性能提升效果。就已经迁移的部分而言,整体的平均查询性能提升了 6~7 倍,查询的 p90 降低了 90%,对于用户来说,查询体验得到了非常大的优化。并且我们整个迁移过程非常平稳,没有出现任何事故,也没有遇到用户吐槽。

弹性伸缩降本增效

集群架构

alt

基于以上已经灰度的 StarRocks 湖上分析集群,我们拿到了很多的性能上的收益。同时我们希望能够在保持这部分性能不变的情况下,进一步达到降本增效的效果,因此我们在弹性伸缩上做了一些尝试。我们的 StarRocks 湖上分析集群整体架构分为 FE、CN 两部分,其中 CN 作为计算节点,本身就没有状态,非常符合弹性伸缩的理念。

基于 AWS Spot 的弹性伸缩方案

通常可以通过 CN 的容器化来进行弹性伸缩,我们的场景会更特殊一点,因为我们目前的数仓架构体系核心还是构建在 AWS 之上的,而 AWS 提供的 Spot 实例的服务,可以让我们以竞价的方式来获取空闲的机器,这个竞价相比于包年包月的方式能够最高享受到 90% 的折扣,并且可以随起随用,在低峰期可以直接把机器还给 AWS,不收取任何费用。

为了适配弹性伸缩,我们主要实现了两块内容,一个是 CN 的自动化部署的脚本,还有一个是 CN 会自动的向 FE 进行注册跟注销。在扩容的时候,我们会自动向 AWS 去申请 Spot 实例机器,当这些实体机器就位之后,会通过我们的自动化部署脚本进行部署,然后注册到我们的 FE上,这时候就可以对外提供服务了。缩容的时候,会自动的从 FE 进行注销,注销完之后再向 AWS 归还我们的 Spot 实例。这两个自动化脚本让我们整体的扩缩容的流程变得更加的丝滑,扩缩容操作可以在 2 分钟内完成。

在整体架构上,我们所有的 FE 以及少量的 CN 上,使用的是包年包月方式,少量常驻的机器能保证我们能够提供最基础的服务能力,另外有 90% 的 CN 节点是通过 Spot 来申请的,可以在低峰期将这部分机器完全还掉。

成本优化效果

alt

目前我们采取的还是一种固定时间进行弹性扩展的方式。比如现在定义的低峰期就是 00:00~8:00,高峰期是9:00~23:00。高峰期机器比较抢手,竞价价格会比较高,我们也不希望我们的机器经常被其他用户所抢占,因此高峰期的成本基本持平。在低峰期我们可以将 90% 的 CN 机器全部还掉,这能够节约大量的成本。总体而言,在目前查询性能不变的前提下,总体的成本能够降低 35%。

未来规划

短期目标:进一步拓展 StarRocks 的湖上分析能力

未来我们的短期目标还是继续在 StarRocks 的湖上分析上进行更多拓展。StarRocks 湖上分析是我们走向湖仓一体的第一步,这一块目前还有一些欠缺。

  1. 我们目前最关注的指标就是整体查询的覆盖度,3.2 的版本的发布给我们带来很大的覆盖度提升。剩下一部分主要是 udf 功能持续的丰富,StarRocks 目前的 udf 相比于 Hive 而言灵活性稍差,比如支持的类型有限,不能支持动态返回类型等,我们未来会和社区一起在这方面进行持续的功能拓展。

  2. 数据湖 Iceberg 的集成优化,这一块目前也有很多亟需优化的点,我们会持续的跟社区一起去合作打磨。

  3. 我们目前完全没有开启缓存,上述的那些测试数据都是不包括缓存的,我们未来也希望能够去对本地缓存以及分布式缓存进行持续的探索,看看能不能基于缓存去进一步优化我们整体的查询性能。

长期目标:实践存算分离与湖仓一体

alt

长期来看,我们的两个方向,一个是存算分离模式的实践,另外一个还是湖仓一体的建设。

存算分离模式的引入能够帮助我们去替换掉更多的 OLAP 分析场景,帮助我们进一步降低整体技术栈的复杂度。

在湖仓一体方面,我们希望能将存算分离模式和湖上分析场景融合到一起,通过湖仓一体架构带来更强的数据开发和数据分析能力,包括但不止于以下两个关键特性:

1 ,打破湖和仓之间的隔阂,降低架构复杂度

存算分离模式,StarRocks 私有的数据格式也会放到云上,实际上成为了整个湖仓体系中一个普通的数据 format。用户在基于湖数据进行自助分析时,如果对查询性能有了更高的要求,可以通过物化视图的方式,将数据聚合成更高维度的 StarRocks 私有格式数据,提供查询加速。物化视图的构建也可以根据查询历史自动化构建,更为智能和高效。

2 ,数据的流转更加方便高效

社区目前也在尝试通过 Spark 直接生成 StarRocks 自由格式数据,这项功能可以进一步实现读写分离,优化湖仓一体场景下数据同步的性能和便利性。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/233225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件,有如下一段话: 在构建 Redis 时,通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc,但在 Linux 系统上,jemalloc 是…

图像分割-Grabcut法(C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的VB版本请访问:图像分割-Grabcut法-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像中的…

Python | 基于Mediapipe框架的手势识别系统

一、项目要求 1、题目 本题着力于解决会商演示系统中的非接触式人机交互问题,具体而言,其核心问题就是通过计算机视觉技术实现对基于视频流的手势动作进行实时检测和识别。通过摄像头采集并识别控制者连续的手势动作,完成包括点击、平移、缩放…

小白入门基础 - Restful

一:REST与RESTful: REST:表现层状态转移,资源在网络中以某种形式进行状态转移。 RESTful是基于REST理念的一套开发风格,是具体的开发规则。 服务器端只返回数据,以json或者xml的格式。 RESTful开发规范&a…

【大数据】Spark学习笔记

初识Spark Spark和Hadoop HadoopSpark起源时间20052009起源地MapReduceUniversity of California Berkeley数据处理引擎BatchBatch编程模型MapReduceResilient distributed Datesets内存管理Disk BasedJVM Managed延迟高中吞吐量中高优化机制手动手动APILow levelhigh level流…

MySQL之视图外连接、内连接和子查询的使用

目录 一、视图 1.1 含义 1.2 操作 1.3 SQL数据 二、连接查询案例 (1)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 (2)查询同时存在" 01 "课程和" 02 "课程的情况 &a…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址:Installing GoCD server on Windows | GoCD User Documentation gocd文档:GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM水质历史数据可视化设计是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主…

QT常用控件使用及布局

QT常用控件使用及布局 文章目录 QT常用控件使用及布局1、创建带Ui的工程2、ui界面介绍1、界面设计区2、对象监视区3、对象监属性编辑区4、信号与槽5、布局器6、控件1、Layouts1、布局管理器2、布局的dome 2、Spacers3、Buttons4、项目视图组(Item Views)5、项目控件组(Item Wid…

“数据要素×”正式来袭|美创“全栈能力、深入场景”保障数据价值安全释放

千呼万唤,1月4日,国家数据局等17部门联合印发的《“数据要素”三年行动计划(2024—2026年)》(下称《三年行动计划》)正式发布! 作为国家数据局成立以来公开发布的首个重磅文件,《三年…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

uniapp获取手机当前信息及应用版本

appVersion 是app端查询的数据信息 appWgtVersion 是浏览器端查询的数据信息 onLoad() {const systemInfo uni.getSystemInfoSync();console.log(systemInfo);// #ifdef H5const uniAppVersion systemInfo.appVersion;// #endif// #ifndef H5const uniAppVersion systemIn…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

vue-springboot基于java的实验室安全考试系统

本系统为用户而设计制作实验室安全考试系统,旨在实现实验室安全考试智能化、现代化管理。本实验室安全考试管理自动化系统的开发和研制的最终目的是将实验室安全考试的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的…

模板管理支持批量操作,DataEase开源数据可视化分析平台v2.2.0发布

2024年1月8日,DataEase开源数据可视化分析平台正式发布v2.2.0版本。 这一版本的功能升级包括:在“模板管理”页面中,用户可以通过模板管理的批量操作功能,对已有模板进行快速重新分类、删除等维护操作;数据大屏中&…

大数据 - Doris系列《二》- Doris安装(亲测成功版)

目录 🐶2.1 安装前准备 🥙1.设置系统最大文件打开句柄数 >启动一个程序的时候,打开文件的数量就是句柄数 🥙2.设置文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量 🥙3.时钟同步 🥙4.关闭交…

labelImg的安装与使用

目录 1、查看本机是否安装labelImg 2、安装labelImg 3、创建自己的数据集 3.1 建立新文件夹 3.2 打开labelImg 注意:出现闪退的情况处理。 4、文件格式转换 4.1 修改文件夹路径 4.2 新建datasets文件夹 4.3 修改图片路径 4.4 执行 1、查看本机是否安装la…

uniCloud 云函数

相对于云函数,官方更推荐使用 云对象 新建云函数 编辑云函数 uniCloud-aliyun/cloudfunctions/hello_func/index.js use strict; exports.main async (event, context) > {let {name} eventreturn 你好,${name}! };云函数接收的参数从event中解构获…

部署可道云网盘的一个漏洞解决

目录 1漏洞展示 2.防范措施 1漏洞展示 因为可道云网盘的上传文档有保存在 /data/Group/public/home/文档/ 中,当别有用心之人知道个人部署的域名与上次的文件后,可以进行访问拿到uid。例我在我部署的网盘上上次一个aa.php 文件,然后拿来演示 然后通过…

密码学中的Hash函数

目录 一. 介绍 二. hash函数的五个基本性质 (1)压缩性 (2)正向计算简单性 (3)逆向计算困难性 (4)弱无碰撞性 (&…