StarRocks 在爱奇艺大数据场景的实践

作者:林豪,爱奇艺大数据 OLAP 服务负责人

小编导读:

本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。

  • 在广告业务中,StarRocks 替换 Impala+Kudu 后,接口性能提升 400%,P90 查询延迟缩短 4.6 倍。

  • 在“魔镜”数据分析平台中,StarRocks 替代 Spark 达 67%,P50 查询提升 33 倍,P90 提升 15 倍,节省 4.6 个人天。

爱奇艺 OLAP 体系简介

爱奇艺数据分析场景

图片

在爱奇艺的大数据分析场景中,通常需要实现两个核心目标:一是看过去,包括生成报表、分析剧集热度以及会员运营等;二是知未来,即预测用户增长和预估收入。虽然我们的最终目标是精准预测未来,但由于这一任务难度较大,我们更多地是通过精准的报表和历史数据分析,挖掘数据中的潜在价值,从而为未来决策提供支持。

爱奇艺 OLAP 架构

图片

上图是爱奇艺 OLAP 架构的总体设计。底层存储层包括传统的 Hive(用于离线存储)和 Kafka(用于实时数据仓库),近年来还引入了 Iceberg 作为近实时的存储解决方案。在存储层之上是多种查询引擎,随着 OLAP 引擎的快速发展,我们引入了多种引擎以满足不同需求。再往上是我们自研的智能 SQL 网关,它可以屏蔽底层众多引擎的接入细节,最上层则是各种应用场景。

如此多样的引擎带来了巨大的运维负担。因此,我们需要对引擎进行整合,以降低运维复杂性。

爱奇艺 OLAP 引擎演化

图片

接下来,我将从两个角度介绍我们引擎的发展历程:传统数仓(存算一体)场景 和 数据湖(存算分离)场景。这种划分并非绝对,而是基于实际需求和客观约束形成的两种技术形态。

数仓场景中,我们通常需要满足高并发、低延迟的在线查询需求,因此需要独立的存储。早期,我们使用 MySQL 或 Elasticsearch(ES),但 MySQL 的规模较小,而 ES 则是性能较差。随后,我们引入了 Impala 结合 Kudu,虽然性能有所提升,但规模仍受限。对于大规模时序数据,我们引入了 Druid,但它不支持明细查询和 Join 操作。为了追求极致性能,我们又引入了 ClickHouse。

数据湖场景中,我们更多地用于即席分析和故障排查等场景,这些场景对性能要求不高,但对数据规模和成本控制要求较高。最初,我们使用 Hive,随着需求增长,我们引入了 Spark 和 Trino。然而,近期我们发现 StarRocks 能够实现数仓和数据湖计算引擎的统一。在数仓场景中,StarRocks 能够达到与 ClickHouse 相当的查询性能,同时替代 Druid,支持大规模数据下的明细分析。在数据湖场景中,StarRocks 的性能也优于 Spark 和 Trino。

高性能实时数仓:StarRocks vs. ClickHouse

图片

接下来,我将介绍在数仓场景中实时数据处理的典型应用。以我们内部的广告场景为例,其核心需求是高并发、低延迟和数据一致性。在传统的 Lambda 架构中,我们同时进行实时数据写入和离线数据覆盖,以处理反作弊等行为。早期,我们使用 Kudu 和 HDFS 分别保存实时和离线数据,并通过 Impala 提供统一查询接口。这一方案在很长一段时间内能够满足业务需求。

然而,随着数据量的持续增长和查询频率的提升,现有方案的性能瓶颈愈发明显。为了追求更高性能,我们考虑了 ClickHouse,但其在数据一致性方面存在不足,最终选择了 StarRocks。接下来,我将详细阐述为何放弃 ClickHouse,转而选择 StarRocks 来满足这一场景需求。

ClickHouse 和 StarRocks 在很多方面有相似之处,例如它们都追求极致性能,采用 MPP 架构,支持向量化执行和物化视图。但今天我更想强调它们的不同点,尤其是 ClickHouse 的局限性。主要问题可以归纳为三个方面:数据一致性问题、存算分离的支持程度以及运维复杂度。以下我将分别展开讨论这三个方面:

数据一致性

图片

第一个问题是数据一致性。假设我们使用 Flink 从 Kafka 消费数据并写入 ClickHouse,其官方的连接器通常只能保证“至少一次(at least once)”的语义。这意味着当 Flink 任务因集群或节点问题重启时,可能会导致 ClickHouse 中的数据重复。相比之下,StarRocks的 Flink 连接器支持“精确一次(exactly once)”语义,这是一个非常重要的特性,能够有效避免数据重复问题。

此外,我们需要通过离线数据覆盖实时数据,例如在反作弊处理后校准实时数据。然而,ClickHouse 的分布式表不支持原子替换操作,替换时需逐个节点操作,增加了复杂性。如果临时表数据为空,可能导致空数据覆盖目标表。虽然可以通过技术手段解决,但无疑增加了数据流程的复杂性。StarRocks 在这方面表现更为出色,支持分区级别的原子替换操作,确保离线覆盖时的安全和高效。

湖仓融合特性

图片

接下来讨论第二个特点:湖仓融合能力。湖仓融合是当前数据处理领域的一个重要趋势,许多企业都在探索如何更好地整合数据湖和数据仓库。

虽然 ClickHouse 支持湖仓查询,但其能力相对有限,主要通过外部表访问数据湖,而非通过统一的 Catalog 管理。此外,在与 Iceberg 等数据湖技术的集成上,ClickHouse 的支持并不友好。下面我使用一个场景来做对比:

图片

上图展示的是一个故障级降级场景:业务通过 Hive 离线同步到 ClickHouse 提供日常服务。如果要为此业务提供高可用方案,ClickHouse 通常需要搭建灾备集群并进行数据同步,主集群故障时切换到灾备集群。这种方案成本高且需额外管理同步链路。

相比之下,StarRocks 的方案更简单。当主集群故障时,只需启动一个 StarRocks 弹性计算集群,并通过外表模式直接访问 Hive 表。关键在于访问 Hive 外表的性能能否接近 StarRocks 内表的性能。我们的测试表明,在大多数查询场景中,StarRocks 访问 Hive 外表的性能能够与内表相近,甚至在某些大数据规模场景下(如 Q2),直接查询 Hive 外表的性能更快。

运维复杂度--扩缩容

图片

最后讨论运维复杂性,尤其是集群的扩缩容问题。ClickHouse 在这方面更像“手动挡”汽车,需要大量手动调优。扩容时,ClickHouse 的历史数据无法自动重新分布,只有新数据会自动分配到新节点。若某节点宕机,需手动处理,否则可能导致副本数量不足,甚至数据丢失。此外,ClickHouse 的缩容操作几乎无法实现。

相比之下,StarRocks 在扩缩容方面更为自动化,类似“自动挡”汽车。StarRocks 支持无缝扩缩容,能够自动进行数据均衡,节点宕机或缩容时,StarRocks 能自动同步副本,无需人工干预。

引入 StarRocks 与上线效果

图片

在引入 StarRocks 后,我们的整体架构如下:

  1. 集群部署:同时部署物理机上的存算一体集群和弹性计算集群,满足高性能需求并具备灵活扩展能力。

  2. 缓存优化:当前使用基于 Alluxio 的缓存机制,未来可能引入 StarRocks 自带的 DataCache 缓存机制或结合 Alluxio 进行对比测试。

  3. 智能 SQL 网关:在架构上层部署自研的智能 SQL 网关,屏蔽底层引擎的复杂性(如用户名和密码等细节),支持高可用性(HA)并基于集群健康度和性能动态调度。查询拦截功能通过网关实现,所有 SQL 查询都通过网关处理,为未来的性能优化和物化视图分析提供数据基础。

广告业务上线效果:

在广告业务场景中,我们将原有的 Impala+Kudu 替换为 StarRocks 后,接口性能显著提升,整体性能提升了 400%,P90 查询延迟加快了 4.6 倍。

湖上即席查询:从 SparkSQL 到 StarRocks

引擎选择

图片

爱奇艺内部有一个名为“魔镜”的一站式数据分析平台,每天支持 500+ 用户和 1400 多个查询。此前,我们使用 Spark 查询引擎进行即席查询,性能较慢,导致分析师在交互过程中需要等待数据返回,严重影响了分析效率。经过评估,我们发现每天因查询延迟浪费的分析师人力相当于 12.5 个人天。

在 SQL 引擎方面,我们原本计划从 Spark 切换到 Trino,但鉴于两者语法差异较大,最终决定直接切换到 StarRocks。经过测试,StarRocks 不仅与 SparkSQL 兼容性良好,性能也比 Trino 快 2 到 3 倍。

Pilot 双跑平台

图片

我们进行切换的核心目标是对业务完全透明,让业务方感知不到底层使用的是 Spark 还是 StarRocks。为此,我们依托内部的 Pilot 双跑平台,该平台支持多种场景需求,如引擎切换、版本升级、参数验证以及机型选择变更等。

整个切换流程大致分为四个阶段:

  1. SQL 集合筛选:从历史 SQL 执行记录中,通过筛选或手动录入的方式,圈定需要双跑的 SQL 集合。

  2. 配置实验:定义对照组(Spark)和实验组(StarRocks)。为每个 SQL 分别生成子任务,分别在对照组和实验组中执行。

  3. SQL 改写与执行:对 SQL 进行改写,例如将写入线上表的语句改为写入临时表,避免影响生产环境。所有子任务执行完成后,我们会进行行列级别的数据校验,只有数据完全一致才视为对数通过。

  4. 生成实验报告:对于通过验证的 SQL 集合,我们可以进行切换;对于未通过的集合,我们会分析具体问题,并进行参数调优。

图片

上图 Pilot 双跑平台的页面示意图清晰展示了每个子任务的耗时和对数结果。如果发现某个子任务失败或数据不一致,可以通过详情页面查看具体细节。双跑平台极大地简化了我们的数据切换工作。

双跑对数-5 轮结果汇总

图片

我们对历史数据进行了多轮对数验证,并将 Spark 与 StarRocks 的切换情况分为以下三种场景:

  1. 切换到 StarRocks 后执行失败:这种情况可以接受,可能由于 UDF 不支持、语法兼容问题或数据规模较大等原因导致。如果 StarRocks 执行失败,平台会自动降级到 Spark 执行,从业务感知上来说,最终 SQL 仍然执行成功。因此,只要将失败比例控制在较低水平即可。

  2. StarRocks 执行成功,但数据存在不一致:这种情况不能接受,因为用户无法判断哪些查询可以切换到 StarRocks。因此,修复数据不一致问题非常重要。我们最终修复了 13 个不一致问题,将不一致的比例从 19% 降低到 0%。

  3. StarRocks 执行成功且数据一致:这是我们追求的理想场景。在双跑验证中,最终能够成功切换的比例约为 78%。

对数不一致常见问题

  • 精度问题:某些字段最初的小数保留位数较少,经过调整后,我们增加了保留位数,从而实现了数据的一致性。我们设定了一个标准:精度误差不超过万分之一,即可视为一致。

  • 函数语义不同:例如,from_unixtime 函数在不同系统中的支持类型有所不同。StarRocks 官方支持的类型有限,而我们在生产环境中遇到了多种类型,因此我们对其进行了扩展支持,以确保兼容性。类似的,日期函数和 split 函数的适配也遵循这一原则,确保能够支持类似正则表达式的识别功能。

图片

图片

  • 其他:例如数组的起始下标或类型转换。以 StarRocks 为例,如果尝试将一个带有小数点的值转换为 BIGINT,Spark 能够正确处理,但 StarRocks 会返回 NULL

切换效果

针对上述提到的一些问题,我们已经进行了修复,以下是修复后的上线效果:

图片

目前,StarRocks 的切换比例为50%。这一比例尚未达到更高,并非因为存在技术限制,而是许多业务在查询时明确指定了使用 Spark 引擎。现阶段,我们优先尊重业务的指定选择。未来,我们会积极推动业务逐步提高使用 StarRocks 的比例。

在已切换的业务中,StarRocks 成功替换 Spark 的比例约为67%,即三分之二左右。这一比例略低于我们此前双跑测试时的预期,但对于切换成功的部分,效果非常显著:P50 查询速度提升了 33 倍,P90 查询速度提升了 15 倍

此外,我们通过优化节省了 4.6 个人天。从柱状图中可以看出,前两个柱子代表纯 Spark 的查询,后面的柱子代表部分切换到 StarRocks 后的查询。切换到 StarRocks 后,查询耗时大幅减少,节省了大量时间。

未来展望与规划

存算一体

  • 技术升级:我们将升级至3.3版本,并验证物化视图的加速效果,同时考虑引入分级存储,将历史数据转存到 HDFS。

  • 引擎收敛:未来一年,我们将重点替换 ClickHouse 和 Druid,逐步统一数据处理引擎,降低运维复杂度。

存算分离

  • 扩大规模:目前切换成功比例为三分之二。未来,我们将扩大切换规模,解决 UDF 兼容性不足的问题,进一步提升切换成功率。

  • 性能优化:针对外表查询性能不够理想的情况,我们将通过物化视图实现透明加速,并计划替换 Trino 引擎,提升整体性能。

更多交流,联系我们:StarRocks

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

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

相关文章

【Linux】Linux的进程控制

目录 1. 学习思维导图 2.进程创建(fork) 2.1 fork创建进程失败 3.进程终止 3.1 进程退出情况 3.1.1main函数 3.1.2 退出码 3.2 exit/_exit函数 1. exit() 函数 2. _exit() 函数 4.进程等待 4.1 实现进程等待的方法 wait/waitpid方法 区别&a…

ubuntu防火墙iptables

文章目录 步骤开启自启防火墙iptables规则链Chains的区别 在 Ubuntu 上使用 iptables 配置防火墙并保证服务可用 步骤 #防火墙状态 systemctl status iptables systemctl start iptables #开启防火墙并且开启22端口 systemctl start iptables && iptables -A INPUT -p…

计算机毕业设计SpringBoot+Vue.js公司日常考勤系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

Hive-01之数仓、架构、数据类型、DDL、内外部表

一、主题 hive的核心概念hive与数据库的区别hive的架构原理hive的安装部署hive的交互式方式hive的数据类型hive的DDL语法操作 二、要点 1.数据仓库的基本概念 1.数据仓库的基本概念 英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的…

【Markdown 语法简洁讲解】

Markdown 语法简洁语法讲解 什么是 Markdown1. 标题2. 列表3.文本样式4. 链接与图片5. 代码6. 表格7. 分割线8. 流程图9. 数学公式10. 快捷键11. 字体、字号与颜色 什么是 Markdown Markdown 是一种轻量级标记语言,通过简单的符号实现排版格式化,专注于…

数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全

信息化高速发展,数据已成为企业的核心资产,驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入,常态化的数据流通不仅促进了信息的快速传递与共享,还能帮助企业快速响应市场变化,把握商业机遇,实…

Linux网络 TCP全连接队列与tcpdump抓包

TCP全连接队列 在 Linux 网络中,TCP 全连接队列(也称为 Accept 队列)是一个重要的概念,用于管理已经完成三次握手,即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接,避免因…

网络流算法: Edmonds-Karp算法

图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…

Python的那些事第三十六篇:基于 Vega 和 Vega-Lite 的数据可视化解决方案,Altair 声明式可视化库

Altair 声明式可视化库:基于 Vega 和 Vega-Lite 的数据可视化解决方案 摘要 在数据科学和分析领域,有效的数据可视化是理解数据、发现模式和传达见解的关键。Python 作为数据科学的主要编程语言之一,提供了多种数据可视化库。其中,Altair 是一个基于 Vega 和 Vega-Lite 的…

文件描述符与重定向

1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备,并返回一个文件描述符,通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件,具体行为取决于传递给它的参数。 需要包含的头文件&#xf…

【WPF】绑定报错:双向绑定需要 Path 或 XPath

背景 最开始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

【Linux高级IO】五种IO模型 多路转接(select)

目录 1. 五种IO模型 1.1 阻塞式IO 1.2 非阻塞IO 1.3 信号驱动IO 1.4 多路转接 1.5 异步IO 2. 同步通信与异步通信 3. 多路转接 3.1 select 总结 1. 五种IO模型 1.1 阻塞式IO 阻塞式IO最为常见&#xff0c;在内核将数据准备好之前, 系统调用会一直等待&#xff0c;所有的…

Linux服务升级:Almalinux 升级 DeepSeek-R1

目录 一、实验 1.环境 2.Almalinux 部署 Ollama 3.Almalinux 升级 DeepSeek-R1 4.Almalinux 部署 docker 5. docker 部署 DeepSeek-R1 6.Almalinux 部署 Cpolar (内网穿透) 7.使用cpolar内网穿透 二、问题 1.构建容器失败 一、实验 1.环境 &#xff08;1&#xff09…

深度剖析数据分析职业成长阶梯

一、数据分析岗位剖析 目前&#xff0c;数据分析领域主要有以下几类岗位&#xff1a;业务数据分析师、商业数据分析师、数据运营、数据产品经理、数据工程师、数据科学家等&#xff0c;按照工作侧重点不同&#xff0c;本文将上述岗位分为偏业务和偏技术两大类&#xff0c;并对…

CosyVoice2整合包 特殊声音标记,声音克隆更逼真,新增批量生成

新增批量生成,可用于制作直播话术音频 特殊声音标记 符号示例1_语气加强<strong> </strong>每天都<strong>付出</strong>和<strong>精进</strong>&#xff0c;才能达到巅峰。2_呼吸声[breath][breath] 吸气,[breath] 呼气! [breath] 吸,[b…

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

如何保证 Redis 缓存和数据库的一致性?

如何保证 Redis 缓存和数据库的一致性&#xff1f; 1. 问题出现场景 先修改数据库&#xff0c;再删除缓存 删除数据库数据成功了&#xff0c;但是删除缓存却失败了&#xff0c;缓存中仍保留的是旧数据 先删除缓存&#xff0c;再删除数据库 如果 Redis 缓存删除成功后&#xf…

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…

网络原理--TCP/IP(2)

我们在之前已经介绍到TCP协议的核心机制二,接下来我们将继续介绍其他的核心机制。 核心机制三:连接管理 即建立连接,断开连接,在正常情况下,TCP要经过三次握⼿建⽴连接,四次挥⼿断开连接。 建立连接:TCP是通过“三次握手” 在生活中的握手就是打招呼,,但握手操作没有…