StarRocks 统一 OLAP 引擎在滴滴的探索实践

news2024/11/17 23:26:11

作者:余辉,滴滴出行 OLAP 团队负责人/专家工程师;李明皇,滴滴出行高级软件开发工程师

发展历程

滴滴的 OLAP 系统早期由用于实时监控系统的 Apache Druid (以下简称 Druid)和离线加速使用的 Apache Kylin(以下简称 Kylin)逐步发展起来。在 2018 年后开始全面发展,当时主要使用 Druid、Kylin 和 Presto 等引擎,用于承接实时监控、实时看板和数据分析等场景。随着业务使用量和业务复杂度的提升,原有的这些引擎由于性能、稳定性、易用性、维护成本等原因,已经无法满足各种复杂的使用需求,查询性能和稳定性难以满足。

在 2020 年后引入当时业界广泛使用的 ClickHouse 引擎。ClickHouse 是一款开源 OLAP 的列存数据库, 号称比 MySQL 快 100-1000 倍,最大的特色是高性能的向量化执行引擎,单机性能强悍。通过 ClickHouse,支持了当时网约车、 顺风车、青桔单车、橙心优选等多个业务线运营看板、实时分析等场景。经过长时间的发展和迭代, ClickHouse 和 Druid 成为当时滴滴内部主要的 OLAP 引擎,也初步让 OLAP 产品在滴滴内部发展壮大。

选型

随着在滴滴内部使用 OLAP 场景的不断增加,主要涵盖监控报表、日志分析、离线加速和实时数仓这四个场景。原有的基于 ClickHouse 和 Druid 建设的 OLAP 系统暴露的问题越来越多。主要有:

1. 维护困难:在 OLAP 场景中维护的引擎和组件有 5 个之多,每个引擎使用方式,运维方式不一样。导致难以维护, 难以发展。

2. 使用不便:不同引擎特点不同,它们针对的场景比较单一,用户难以根据业务场景正确选择引擎。另外,对于 ClickHouse 从能用到用好难度很大,经常出现查询性能未达预期。

3. 稳定性压力大:引擎多投入人力有限,问题频频发生,无有效解决方案。很多业务场景混合在一个集群中,缺少资源隔离机制,服务稳定性难保障。

4. 用户需求难以满足:部分用户有修改和删除数据的需求,现有引擎无法满足。对于高 QPS 场景,复杂度高查询场景、 Join 等场景,查询性能不能满足需要。

(上图为引进 StarRocks 之前的 OLAP 现状)

针对上面这些问题,我们于 2022 年开始引入 StarRocks。StarRocks 是新一代全场景 MPP 数据库,使用向量化、 MPP 架构、 CBO、智能物化视图、可实时更新的列式存储等技术,实现多维、实时、高并发的数据分析。StarRocks 在 GitHub 上已有 4.7k Star,并且增长迅速,社区也非常活跃。在国内各大互联网公司也有较为广泛的使用。

其主要特点有:

1. 简洁的分布式架构:StarRocks 采用简洁的分布式架构,可以水平扩展以处理大规模数据和高并发查询。它将数据分片存储在多个节点上, 实现了数据的并行处理和查询。

2. 高性能查询:由于采用了列式存储、分布式架构和向量化引擎,StarRocks 能够提供优秀的查询性能。它支持多种查询操作,包括聚合、排序、连接和过滤等,适用于复杂的分析查询,并且支持较高的 QPS。

3. 灵活的数据模型:StarRocks 支持多维度数据模型,可以方便地进行多维度分析。它提供了丰富的数据类型支持和灵活的数据模型设计,适用于各种数据分析需求。并且支持更新和删除。

4. 易于使用和管理:StarRocks 提供了易于使用的管理界面和命令行工具,方便用户进行集群的配置、监控和管理。它还支持资源隔离,可以比较容易的定位和解决用户之间查询影响导致的问题。

5. 统一的湖仓架构:StarRocks 原生支持统一管理数据湖和数据仓库, 支持联邦查询,可作为数据湖引擎的加速器,提供统一查询服务。能通过一套技术方案解决实时分析与湖仓分析。

在引入 StarRocks 后, 前期主要在平台和引擎两方面开展建设。通过一年多的建设和推广, StarRocks 逐渐替代 Druid 和 ClickHouse,成为滴滴内部的最主要 OLAP 引擎。

在业务和规模方面:

StarRocks 集群数大约 30+,数据量达 300TB+,日均查询 QPS 400w+。服务公司内部网约车、顺风车、两轮车、 金融、能源等多个业务线。

平台建设方面:

打通数据链路和上下游生态,包括实时、离线数据导入自动化等;建设云原生管控平台,提供高效的运维管理和业务交付能力。

引擎建设方面:

在稳定性上,通过容器化、资源隔离、双链路机制等方式,对不同稳定性要求的用户提供针对性的稳定性保障手段。

在易用性上,将慢查询监测告警功能和查询分析器开放给用户,让用户有办法感知到慢查询,并且能针对性的调优。

在性能上,重点推广物化视图,通过预处理技术为用户提供更好的查询性能和更低的成本。

StarRocks 在滴滴的实践

MAS 监控报警业务

业务背景

MAS 监控报警业务是针对客户端 APP,通过埋点采集数据,用于分析客户端 APP 性能或功能上的问题,为集团泛前端提供线上问题感知及定位能力,并持续赋能泛前端稳定性建设和保障工作。

MAS 监控报警系统业务挑战:

数据量大:覆盖集团大部分业务线,数据摄入条数 45w/s,每天数据量 12TB。

监控维度筛选灵活:支持多种时间粒度,多个埋点组合,支持自定义筛选字段。

性能和稳定性要求高:查询耗时要求小于 1s, 稳定性要求 99.9%。

此系统原先使用 Druid 作为底层存储引擎,使用中存在下列问题:

  • 查询存在性能瓶颈,有一定概率出现查询超时,影响报警的时效性;

  • Druid 集群成本高,大约需要 60+ 台机器,运维成本高;

  • Druid 集群查询容易受其他用户影响, 导致查询超时或报错,稳定性不足。

迁移过程

经过前期的调研和测试, StarRocks 可以解决 Druid 中的不足,将 MAS 监控报警业务从 Druid 升级到 StarRocks 上,可以提供更好的查询性能,更低的成本和更高的稳定性。在升级 StarRocks 的过程中,针对业务使用场景,在数据建模是根据 StarRocks 特点采用了深层优化手段,主要有:

聚合模型:分析类告警场景中使用大量的聚合计算,选用聚合模型对查询结果预计算,提升查询响应时间。

分区分桶:常见的查询都是按照时间和 APP 维度进行,合理选择时间分区和 app_name 分桶,有效减少单次查询扫描数据量,提升查询性能。

UV 指标:告警场景中关注的指标大部分是 UV 计算,关注的是指标变化趋势,采用 HLL 类型估算 UV 指标, 能提升查询性能。

预处理:使用物化视图,加速将常见的指标查询,按分钟粒度上卷。可以有效降低查询时扫描数据量。

数据导入:使用 Stream Load,相比 Druid 导入方式能降低数据导入成本。

效果收益

MAS 监控报警系统从 Druid 迁移到 StarRocks 之后,在查询性能和成本上有明显收益。在查询性能提升和集群规模缩小的双重影响下,以及 StarRocks 本身资源隔离和易于运维管理的功能下,服务的稳定性也有更好的保障。

升级后的性能收益:

• 查询性能提升 4 倍

• 查询 P90 耗时从 500ms 提升到 150ms

升级后的成本收益:

• 集群规模从 60+节点下降到小于 10 节点• 数据存储量下降约 40%• 综合成本下降 80% 以上

02 金融数据门户建设

业务背景

金融数据门户是滴滴内部金融产品数据平台,主要为金融业务团队提供以数据驱动精细化运营的数据分析功能,解决传统报表对管、产、运指导不够灵活的弊端,想通过 OLAP 系统搭建一套支持全链路核心指标、维度下钻,异动分析等功能组合的数据解决方案。对 OLAP 引擎的要求有:支持自定义时间维度;支持全链路指标,联动分析。查询秒级返回。其中每日数据量大约有 10 亿条。

建设过程

经过前期的调研和测试,选用了 StarRocks 作为金融数据门户的 OLAP 引擎。将 10 亿级数据量下,支持秒级即席分析查询分析作为目标。通过下面四个方面优化手段以达成。

业务建模:通过对金融业务查询场景的需求和数据理解,设计合适的表模型。在满足业务查询和分析的要求的同时,使表的数据结构与存储结构有利于 StarRocks 查询。

数据分布:通过合理的分区和分桶设计,将海量的数据按查询的要求均分到集群各个节点的 tablet 中。使单次查询的数据量在合理范围并且能充分利用集群的计算资源。

查询加速:为了进一步提升查询性能,精心设计前缀索引和 ZoneMap 索引,以保证在查询中能够有效命中,起到大量过滤无效数据的要求,同时在关键查询条件上增加 BloomFilter 与 Bitmap 索引,进一步过滤无关数据,提升查询性能。

预处理:在索引无法覆盖的的优化场景外,通过使用物化视图加 Bitmap 对指标预处理,提升查询的响应时间。通过使用 Bitmap,以及将原来随机 ID 转换成连续递增 ID,进一步提速高基数去重指标的查询性能。

效果收益

通过 StarRocks 提供低耗时的查询分析解决方案后,金融数据门户系统得以提供更为丰富和精细的业务功能。核心业务指标拆分成了卡片、维度下钻、 指标树的方式呈现,能够快速帮助业务通过数据来掌握业务的现状,数据价值能够得到很好的体现。

未来展望

经过一年多 StarRocks 的建设和实践, StarRocks 在滴滴内部已经成为 OLAP 场景中的主要引擎。伴随着大量业务从原有的 ClickHouse和 Druid 引擎上迁移到 StarRocks 上,也使得 StarRocks 能取代 ClickHouse 和 Druid,统一滴滴内部的 OLAP 引擎成为可能。使用 StarRocks 的 MPP 分布式、向量化查询引擎优势、和联邦查询能力搭建统一 OLAP 平台。解决原有的 OLAP 大数据生态领域,在成本,性能、实效性、易用性及灵活性等方面的各种问题。

以下几个 Feature 是我们认为能够解决这些问题的关键,也是我们后续在社区重点关注的方向:

物化视图:物化视图是解决 OLAP 场景中查询性能问题的关键手段之一。在海量的数据分析中秒级查询响应的要求下,物化视图的预处理技术,是从成本和性能上的最佳解决方案。物化视图预处理技术在 OLAP 的地位相当于 MapReduce 在离线数据处理中位置。目前我们在很多场景中使用物化视图,也取得很好的效果,后续将沉淀物化视图在不同场景下的最佳实践。

存算分离:存算分离架构是大数据处理和分析领域重要特性之一,可以满足不同的业务需求和数据处理场景。StarRocks 在使用存算分离后,成本可以下降 90%;计算节点变成无状态之后,可以通过快速弹性的方式来提高计算的容量,以应对重大活动期间突增的数据分析需求。目前 StarRocks 存储成本相对过高,还不具备单独增加计算资源能力。

湖仓一体:湖仓一体是 StarRocks 社区当前发展的方向,在 StarRocks 具备存算分离和数据湖分析能力之后, StarRocks 本身已经形成了一个分层结构的 Lakehouse 的架构,能够将 HDFS、Apache Hive、Apache Hudi、Apache Iceberg 统一在一起,利用 StarRocks 本身的技术优势来提升查询性能。另一方面,物化视图也可以在其中起到简化湖仓建模,实现查询加速等重要作用。通过引入湖仓一体,可以更容易将实时和离线分析统一到一起,实现统一数据口径,简化数仓开发的功效。同时也为亚实时数据分析场景提供更好的解决方案。

如对本篇文章有兴趣,可以点击下方链接观看余辉老师在 StarRocks & Friends 杭州站的分享:

StarRocks 统一 OLAP 引擎在滴滴的探索实践_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随风摇曳的她——美蕨(matlab实现)

目录 1 随风摇曳的她 2 摇曳带来的哲思 3 Matlab代码实现 1 随风摇曳的她 梦幻的场景、浪漫的气息,带上心爱的人,拥抱在这片花海之下,便有了电影男女主角的氛围感; 就算阅尽了世间风貌,也抵不上和她在一起时锦短情长&a…

Idea批量删除空行

1.在编辑框中使用快捷键ctrl f 打开替换框 2.勾选正则模式 Regex 3.在条件框中输入正则^\s*\n 正则解释,匹配以0个或n个\s空白符起首的换行\n 输入正则后可以看到效果,可以看到单行和多行都被选中了 。 如果想只删除连续多行的空行,就需要…

fl studio for window 21.0.3.3517 官方中文版免费下载及新功能介绍

FL Studio 21 for Mac官方中文版免费下载是一款功能强大的音乐编曲制作软件。尽管你可能没有接触过音乐制作,也能通过fl Studio 21,撰写,整理,录制,编辑,混合,掌握和制作出专业的品质音乐。 fl…

每隔一段时间重试,重试n次 java 工具类

需求: 若代码出现异常,则每隔一段时间重试一下,重试n次 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.util.function.Supplier;public class RetryUtils {private static final Logger log LoggerFactory.getLogg…

ASP.NET Core 依赖注入系列一

什么是ASP.NET Core 依赖注入? 依赖注入也称DI是一项技术用来实现对象松耦合以至于应用程序更容易维护,ASP.NET Core通过控制器的构造函数自动注入依赖的对象,我们创建ASP.NET Core MVC应用程序演示依赖注入特性是如何工作, 在这节中我们讲解该特性 1 …

剑指offer45 把数组排成最小的数

剑指offer45 把数组排成最小的数 文章目录 剑指offer45 把数组排成最小的数题目描述思路实现参考文献 题目描述 输入一个非负整数数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出来的所有数字中最小的一个。 思路 此题求拼接起来的最小数字&…

Selenium教程__使用switch_to.window方法处理窗口切换(12)

想一下这样的场景,打开页面A点击一个链接,在一个新的窗口打开页面B,由于之前的driver实例对象在页面A,但是你接下来操作的元素在页面B中,此时脚本就会报错找不到元素。该场景需要使用到selenium的switch_to.window&…

CMake 编译并链接动态库

问题描述 目录结构如下: |---CMP|---mmath|---mmath.h|---mmath.cpp|---CMakeLists.txt|---CMP.cpp|---CMakeLists.txt需要把mmath子项目编译成动态链接库并被CMP.cpp调用 代码如下: //mmath.h namespace mmath { int __declspec(dllexport) add(int…

Python基础(20)——Python函数讲解二

Python基础(20)——Python函数讲解二 文章目录 Python基础(20)——Python函数讲解二目标一. 变量作用域二. 多函数程序执行流程三. 函数的返回值四. 函数的参数4.1 位置参数4.2 关键字参数4.3 缺省参数4.4 不定长参数 五. 拆包和交…

pytest和ValueError: Expect x to not have duplicates(个人笔记)

1.项目在新环境报错为没有pytest 解决办法: 在设置里面的Tools里面的某个选项改为(如下图) 2.同一个项目在旧电脑正常运行,到了新电脑新环境莫名报错 报错为 interpolate.interp1d里面的某个函数报错 具体报错为:Valu…

Bean属性校验

Servlet是一个规范,Tomcat实现的 JDBC是一个规范,各个厂商实现的 JSR303也是一个规范,有人提供实现 我们只需要面向接口编程即可。 一般来说,以javax开头的groupId,都是规范 JSR303提供规范,其余框架实现规…

软考A计划-系统集成项目管理工程师-信息化系统的生命周期-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Mysql数据库操作总结

文章目录 1. DDL(Data Definition Language - 数据定义语言)1.1 数据库1.2 数据表(创建查询删除)1.3 数据表(修改) 2. 数据类型2.1 数值2.2 字符2.3 日期 3. 字段约束3.1 约束3.2 主键约束修改3.3 主键自增 联合主键 4. DML(Data Manipulation Language - 数据操作语言)4.1 添…

本地搭建svn仓库 + 调试svn hooks

本地搭建SVN仓库 调试svn hooks : 文章目录 本地搭建SVN仓库 调试svn hooks :1. 环境准备:2. 搭建本地仓库的过程:3. 将写好的svn hooks pre-commit.bat放到hooks目录内。4. 创建仓库的本地working copy: 1. 环境准备: 需要安装TortoiseSV…

APP专项测试之——网络测试

软件网络测试考虑四种状态下的测试 1、正常网络 wifi:无线网络情况下,软件可正常使用 流量:手机数据情况下,软件可正常使用 2、弱网 概念:在厕所,电梯,停车场,地下商场等封闭性的…

python 包(模块)制作

文档:Quickstart - setuptools 68.0.0.post20230619 documentation 目录结构 sdk目录里面存放源码 在setup.py所在层级目录下执行如下命令既可生成wheel文件 python setup.py sdist bdist_wheel 上传: 需要把生成的.wheel文件上传到 pypi上,才能使用pi…

优秀的测试用例是如何设计的?

这篇文章我们主要聊一下测试工程师最通用的也是最根本的技能,测试用例的设计能力。 测试用例 测试用例是通过使用在测试计划中确定的测试技术,对于已确定的测试条件进行逐步推敲,精炼而设计出来的重点说明如何具体操作产生何种结果的文档。…

Linux自主学习 - 2

一、gcc编译器 第一个HelloWorld 1、查看当前工作目录/home/yang/coding下为空 2、使用vim写一个C源程序hello.c 进入vim界面后,按下i键进入编辑模式,vim窗口下方出现“INSERT”字样 编辑完成后,先按ESC键退出编辑模式,然后输入:…

onnxruntime推理

pytorch模型训练 这里以pytorch平台和mobilenet v2网络为例,给出模型的训练过程。具体代码如下所示: import os import torchvision.transforms as transforms from torchvision import datasets import torch.utils.data as data import torch import…

Java面试题Class类的理解?创建类的对象的方式?

1.Class类的理解 1.类的加载过程: 程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。 接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件 加载到内存中。此过程就称为类的加载。加载到内存中的类&…