当前位置: 首页 > article >正文

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

相关文章:

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

作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…...

Easy Trans Spring Boot Starter ---Spring系列的字段翻译库

Easy Trans Spring Boot Starter 使用文档 1. 简介 easy-trans-spring-boot-starter 是一个基于 Spring Boot 的库,用于简化数据翻译和转换操作。它可以帮助你将数据库中的枚举值、状态码等转换为用户友好的文本,或者将一种数据格式转换为另一种格式。…...

JAVA入门——IO流

一、了解File类 这个类里面提供了一些文件相关的方法,了解即可,方法有很多,不好背下面这个是最常用的只能对文件本身操作,不能读取数据 public File[] listFiles();//获取当前路径下的所有内容 注意:如果是需要权限才…...

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型:一场流式响应的"魔法吟唱"仪式 一、前言:关于流式响应的奇妙比喻 想象一下你正在火锅店点单,如果服务员必须等所有菜品都备齐才一次性端上来,你可能会饿得把菜单都啃了。而流式响应就像贴…...

Android Binder 用法详解

Binder 是 Android 系统中的一种进程间通信(IPC)机制,它允许不同进程之间进行高效通信。Binder 在 Android 系统中被广泛使用,例如在 Activity 与 Service 的交互中。 Binder 的基本组成 实现 Binder 通信通常包含以下几个关键部…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思? 在 Ubuntu(或其他基于 GNOME 文件管理器的 Linux 发行版)中,文件或文件夹的右下角出现一把“锁”标志,通常表示 你当前的用户没有该文件/文件夹的写…...

达梦数据库如何收集表和索引的统计信息

命令: DBMS_STATS.GATHER_TABLE_STATS(OWNNAME >HIDC,TABNAME > SYS_OSS,ESTIMATE_PERCENT>100,METHOD_OPT > FOR ALL COLUMNS SIZE AUTO,DEGREE > 2,CASCADE > true); dbms_stats.gather_table_stats:用于收集目标表,目…...

大语言模型:从诞生到未来的探索

1 发展历程 1.1 早期探索:基础积累 大语言模型的发展并非一蹴而就,其源头可以追溯到自然语言处理的早期阶段。早期的自然语言处理系统主要基于规则和模板,通过人工编写的语法规则来处理文本。例如,早期的机器翻译系统就是根据预…...

DeepSeek-V3:AI语言模型的高效训练与推理之路

参考:【论文学习】DeepSeek-V3 全文翻译 在人工智能领域,语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型,技术的进步令人瞩目。然而,随着模型规模的不断扩大,训练成本和推理效率成为了摆在…...

【多模态】Magma多模态AI Agent

1. 前言 微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互&…...

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…...

DeepSeek在PiscTrace上完成个性化处理需求案例——光流法将烟雾动态可视化

引言:PiscTrace作为开放式的视图分析平台提供了固定格式的类型参数支持个性化定制处理需求,本文一步步的实现光流分析按照不同需求根据DeepSeek的代码处理视频生成数据。 光流法(Optical Flow)是一种基于图像序列的计算机视觉技术…...

explore与explode词源故事

英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢&#xff1f…...

LeeCode题库第三十七题

37.解数独 项目场景: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请…...

【数字信号处理:从原理到应用的深度剖析】

一、数字信号处理的原理 数字信号处理(DSP)是一种通过数学算法对信号进行分析、处理和转换的技术。其核心在于对离散时间信号的操作,目的是提取有用信息或将信号转换为更易于解释的形式。 (一)信号的数字化过程 1. …...

MySQL 数据库安全配置最佳实践

文章目录 MySQL 数据库安全配置最佳实践账户与权限管理账户最小化原则权限最小化配置密码策略强化 认证与访问控制禁用匿名账户启用安全认证 网络安全防护访问源限制禁用远程root访问启用SSL加密 日志审计与监控全量审计配置二进制日志管理 服务端安全加固关键参数配置文件权限…...

小红书自动评论

现在越来越多的人做起来小红书,为了保证自己的粉丝和数据好看,需要定期养号。 那么养号除了发视频外,还需要积极在社区互动,比如点赞、评论等等,为了节省时间,我做了一个自动化评论工具。 先看效果 那这个是…...

OpenCV图像认知(一)

OpenCV: 是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法 OpenCV-Python: OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。 Python是一种由Gui…...

自学微信小程序的第六天

DAY6 1、使用录音API首先需要通过wx.getRecorderManager()方法获取到一个RecorderManager实例,该实例是一个全局唯一的录音管理器,用于实现录音功能。 表32:RecorderManager实例的常用方法 方法名称 说明 start() 开始录音 pause() 暂停录音 resume() 继续录音 stop() 停止…...

C++动态与静态转换区别详解

文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中,dynamic_cast 和 static_cast 是两种不同的类型转换操作符,主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别: 一、 类…...

Qt6.8编译项目找不到文件——6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist.

问题:Error: dependent ‘…\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow’ does not exist. jom: D:\Temp\untitled1\build\Makefile [release] Error 2 20:20:43: 进程"D:\ProgramFiles\Develop\Qt6.8.2\Tools\QtCreator\bin\jom\jom.exe"…...

AI工具导航平台功能模块之混合分类器功能说明文档

AI工具导航平台功能模块之混合分类器功能说明文档 这是我最近正在开发的AI工具信息平台的部门功能模块混合分类器的说明文档,我的AI工具信息平台基于streamlit架构,整理出来与大家分享。 该程序的混合分类器采用规则引擎与深度学习模型协同工作的架构&…...

【时序预测】在线学习:算法选择(从线性模型到深度学习解析)

——如何为动态时序预测匹配最佳增量学习策略? 引言:在线学习的核心价值与挑战 在动态时序预测场景中(如实时交通预测、能源消耗监控),数据以流式(Streaming)形式持续生成,且潜在的…...

某个设备的RJ45网口接头为何不可连接任何POE设备

某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么? POE设备是指支持通过以太网线传输电力和数据的设备,即“Power over Ethernet”(PoE)技术的设备。这种技术允许网络设备在传输数据的同时,通过标准的RJ4…...

发展中的脑机接口:SSVEP特征提取技术

一、简介 脑机接口(BCI)是先进的系统,能够通过分析大脑信号与外部设备之间建立通信,帮助有障碍的人与环境互动。BCI通过分析大脑信号,提供了一种非侵入式、高效的方式,让人们与外部设备进行交流。BCI技术越…...

绕过密码卸载360终端安全管理系统

一不小心在电脑上安装了360终端安全管理系统,就会发现没有密码,就无法退出无法卸载360,很容易成为一个心病,360终端安全管理系统,没有密码,进程无法退出,软件无法卸载,前不久听同事说…...

Java数据结构第十五期:走进二叉树的奇妙世界(四)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…...

Transformer 代码剖析9 - 解码器模块Decoder (pytorch实现)

一、模块架构全景图 1.1 核心功能定位 Transformer解码器是序列生成任务的核心组件,负责根据编码器输出和已生成序列预测下一个目标符号。其独特的三级注意力机制架构使其在机器翻译、文本生成等任务中表现出色。下面是解码器在Transformer架构中的定位示意图&…...

JAVA八股—计算机网络(自用)

JAVA八股—计算机网络(自用) 2.7 1.介绍一下TCP/IP模型和OSI模型的区别 OSI模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,将计算机网络通信划分为七个不同的层级,每个层级都负责特定的功能。每个…...

unity和unity hub关系

unity和unity hub关系 Unity和Unity Hub是紧密相关但功能不同的两个软件,以下是它们的关系说明: Unity 定义:是一款专业的实时3D开发平台,广泛用于创建各种类型的3D和2D互动内容,如视频游戏、建筑可视化、汽车设计展示、虚拟现实(VR)和增强现实(AR)应用等。功能:提供…...