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.mfbz.cn/a/300941.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传感数据分析——高通滤波与低通滤波

传感数据分析——高通滤波与低通滤波 文章目录 传感数据分析——高通滤波与低通滤波前言一、运行环境二、Python实现总结 前言 对于传感信号而言,我们可以提取其中的高频信息和低频信息,低频信息往往是信号的趋势,高频信息往往是一些突变或异…

vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化

文章目录 ⭐前言💖vue3系列文章 ⭐html数据解析💖 html字符串转为html对象💖 深度遍历html对象内容 ⭐echarts 树图的渲染💖 处理html内容为树状结构💖 渲染树状图💖 inscode代码块 ⭐总结⭐结束 ⭐前言 大…

(低级错误)IDEA/Goland报错连接数据库失败:URL错误和权限问题。

前言 做毕设ing,使用Goland自带的数据库工具连接服务器的数据库。报错 错误: Malformed database URL, failed to parse the main URL sections. (view)服务器是华为云,使用宝塔面板。数据库版本5.6.50。 排查过程 鉴于Goland报错报的狗屁不是&#…

hfish蜜罐docker部署

centos 安装 docker-CSDN博客Docker下载部署 Docker是我们推荐的部署方式之一,当前的版本拥有以下特性: 自动升级:每小时请求最新镜像进行升级,升级不会丢失数据。数据持久化:在宿主机/usr/share/hfish目录下建立dat…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

编码风格之(3)GUN软件标准风格(1)

GNU软件编码标准风格(1) Author:Onceday Date: 2023年12月26日 漫漫长路,才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standards …

prometheus 黑盒监控

黑盒监控 “白盒监控” 是需要把对应的Exporter程序安装到被监控的目标主机上,从而实现对主机各种资源以及状态的数据采集工作 ”黑盒监控“ 是不需要把Exporter程序部署到被监控的目标主机上,比如全球的网络质量的稳定性,通常用ping操作&am…

【网络技术】【Kali Linux】Wireshark嗅探(八)动态主机配置协议(DHCP)

一、实验目的 本次实验使用 Wireshark (“网鲨”)流量分析工具进行网络流量嗅探,旨在初步了解动态主机配置协议(DHCP协议)的工作原理。 二、DHCP协议概述 动态主机配置协议( D ynamic H ost C onfigurat…

Transformer - Attention is all you need 论文阅读

虽然是跑路来NLP,但是还是立flag说要做个project,结果kaggle上的入门project给的例子用的是BERT,还提到这一方法属于transformer,所以大概率读完这一篇之后,会再看BERT的论文这个样子。 在李宏毅的NLP课程中多次提到了…

Latex + Overleaf 论文写作新手笔记

.tex 文件main.tex 文件 Latex 的文档层次结构不同文档类型的层次结构report 6 层结构实例article 5 层结构实例 Latex 语法图表插入与引用使用 figure 环境来插入图片使用 ref 命令来引用已有的图表格的插入与引用 代码块列表无序列表 itemize有序列表 enumerate 学位论文项目…

基于SSM的企业员工管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

实验笔记之——Linux实现COLMAP

之前博客跑instant-NGP的时候,除了用官方的数据集,用自己的数据则是通过手机采集,同时获得pose与image。但是这种获取的方式对于3D gaussian而言,并不支持对应的数据格式,为此采用COLMAP来根据image获取pose&#xff0…

Java网络编程之IP,端口号,通信协议(UDP,TCP)

目录 1.软件架构2.网络编程三要素3.IP1.IPV42.IPV6 4.端口号5.协议1.UDP协议1.单播2.组播3.广播 2.TCP协议1.三次握手2.四次挥手 1.软件架构 ①C/S:客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美…

Windows系统任务栏应用图标显示成空白的解决方案

背景 任务栏应用图标为空白: 原因 Windows系统为了加快系统响应速度,在安装完应用第一次显示完应用图标后,会将应用的图标放入缓存中,以后每次显示应用直接在缓存中获取,如果缓存中的图标信息发生错误,…

SSM医院预约挂号系统【源码】【最详细运行文档】

SSM医院预约挂号系统【源码】【最详细运行文档】 系统简介系统涉及系统运行系统演示源码获取 系统简介 随着医疗水平的提高,以及人们对于健康的观念越来越重视,出入医院成了一种常见的现象。而随着看病人数增多,经常出现挂号难的现象。一部分…

【微服务】springcloud集成skywalking实现全链路追踪

目录 一、前言 二、环境准备 2.1 软件环境 2.2 微服务模块 2.3 环境搭建 2.3.1 下载安装包 2.3.2 解压并启动服务 2.3.3 访问web界面 三、搭建springcloud微服务 3.1 顶层公共依赖 3.2 用户服务模块 3.2.1 准备测试使用数据库 3.2.2 添加依赖 3.2.3 添加配置文件 …

1329:【例8.2】细胞 广度优先搜索

1329:【例8.2】细胞 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一矩形阵列由数字0 到9组成,数字1到9 代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 4 10 0234500067 1034560500 2045600671 00000000…

Ubuntu22.04开机左上角下划线闪烁不开机

按下CtrlAltF2,打开TTY系统,然后通过用户名和密码登录,随后使用 sudo apt --fix-broken install 根据提示排除错误信息,然后使用apt安装lightdm安装就行。 tips:当使用EasyConnect的时候,你可能参考了下面这篇文章知…

Open CASCADE学习|Draw Harness

目录 显示长方体 提供帮助信息 执行文件 记录交互式命令 使用getsourcefile可以快速查找到Tcl命令对应的C源文件 在Tcl中内置了一些变量,并赋予了一定的功能。内置变量列表如下: 退出 加载插件 在屏幕显示变量 返回绘图变量信息 视图 mu, md…

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令: 1.ps:查看静态进程信息状态 2.top:查看动态进程排名信息 3.pgrep:查看指定进程 4.pstree&#…