StarRocks实战——滴滴OLAP的技术实践与发展方向

news2024/11/18 5:58:35

    原文大佬的这篇StarRocks实践文章整体写的很深入,介绍了StarRocks数仓架构设计、物化视图加速实时看板、全局字典精确去重等内容,这里直接摘抄下来用作学习和知识沉淀。

目录

一、背景介绍

1.1 滴滴OLAP的发展历程

 1.2 OLAP引擎存在的痛点

1.2.1 运维困难

1.2.2 适用场景单一

1.2.3 业务场景需求难以满足

1.2.4 集群稳定性差

1.3 StarRocks优势

1.3.1 简洁的分布式架构

1.3.2 查询性能表现优异

1.3.3 灵活的数据建模方式

1.3.4 易于运维管理

二、StarRocks数仓建设成效

2.1 平台建设方面

2.2 引擎建设方面

三、StarRocks物化视图应用实践

一、背景介绍

1.1 滴滴OLAP的发展历程

     滴滴的OLAP系统,早期是基于Druid的实时监控系统,2017年基于Kylin的离线查询加速应用逐步起步,到2018年后开始全面发展,Druid、Kylin及Presto并存,用于承接实时监控、实时看版、数据分析等场景。随着业务的使用量和复杂度的提升,原有的引擎在性能、稳定性、易用性、及维护成本等多方面,都无法满足复杂的业务应用要求。在2020年前后,滴滴引入了当时业界广泛使用的ClickHouse引擎,作为开源的OLAP,采用列式存储模式,号称比MySQL快1000倍,最大的特色在于向量化的计算引擎,单机性能很强悍。滴滴基于ClickHouse支持了当时的网约车、两轮车、顺风车、橙心优选等多个业务线的实时运营看板、实时分析等场景。经过1年多的发展迭代,ClickHouse和Druid成为了滴滴内部主要的OLAP引擎,也让OLAP在滴滴内部逐步发展起来。

 1.2 OLAP引擎存在的痛点

     公司内部OLAP的使用场景越来越复杂,包括监控报表、日志分析、离线加速、实时数仓等场景。随着用户需求的持续增加,对查询的性能要求也越来越高,基于ClickHouse和Druid的OLAP引擎面临着以下问题:

1.2.1 运维困难

    针对OLAP场景,滴滴维护的引擎超过5个,包括Druid、ClickHouse、Kylin、Presto等,每个引擎的使用方法、运维手段差异大,导致运维压力巨大,后续发展遇到瓶颈。

1.2.2 适用场景单一

    每种OLAP引擎的特点都不一样,如Druid是时序数据库、ClickHouse是计算能力强、但Join关联计算能力较差,各个引擎针对的场景都比较单一,用户难以根据业务场景来正确选择合适的引擎。ClickHouse从能用到好用差异巨大,运维难度大,需要投入大量的人力保障才能做到好用。

1.2.3 业务场景需求难以满足

    比如很多用户有修改、删除数据的要求,当时的ClickHouse、Druid都不支持;以及对于高QPS(每秒的查询率)的场景、复杂Join关联等,当时的OLAP系统也无法满足用户需求。

1.2.4 集群稳定性差

    维护的引擎多,人员相对有限,经常出现稳定性故障;同时多业务运行在同一套集群环境中,缺少相应集群级别的资源隔离机制,服务稳定性难以保障。

1.3 StarRocks优势

     针对上述问题,2022年前后,滴滴引入了StarRocks引擎——StarRocks是一个全新一代的、全场景的、MPP数据库;作为一款高性能分析型数据仓库,StarRocks使用了向量化、PipeLine引擎、CBO、智能的物化视图等功能,可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。

1.3.1 简洁的分布式架构

    StarRocks 架构简洁, 没有外部组件的依赖,整个系统的核心只有 FE(Frontend)、BE (Backend) 两类进程,节点可以在线水平扩展,方便部署与维护。

1.3.2 查询性能表现优异

    StarRocks 使用了列式存储,支持向量化的引擎,实现了数据的并行处理和查询,对于聚合或多表Join查询,相较于ClickHouse也提升显著。

1.3.3 灵活的数据建模方式

   StarRocks还支持多种表结构,如明细模型、聚合模型、主键模型、更新模型等;支持多种数据类型,如需要去重的Hyperloglog、BITMAP等等类型,可以适用于多种数据分析场景。

1.3.4 易于运维管理

   StarRocks自身提供了比较简洁的管理页面和命令行工具,所有的数据均衡、同步、容灾等,都是在内部自动完成的,基本不需要人工的参与。

二、StarRocks数仓建设成效

   从引入StarRocks到现在(截止2023年5月),滴滴已有StarRocks集群超过30个,数据量超过300TB每日查询量超过400W+数据表超过1500张。支持了滴滴几乎所有的业务线,如网约车、单车、能源、货运等等。

2.1 平台建设方面

    在平台建设方面,主要打通了数据链路的上下游生态,包括离线/实时的导入。其中离线导入采用了StarRocks的SparkLoad,实时导入采用Flink的StarRocks Connector导入。此外,开发了基于页面配置的自动化导入工具,用户不需要编写任务,就可以完成简单的数据同步。滴滴还建设了云原生的运维管控平台,提供高效的运维管理工具和业务交付的能力——支持从业务申请创建一个新的集群,到交付给业务可用的集群,只需要1小时。

2.2 引擎建设方面

   通过容器化,资源隔离和双链路等机制,对不同稳定性要求的用户提供针对性的保障手段——目前支持独立的物理集群,独立的独立的容器集群、以及混部在一起的公共集群共存,支持通过不同的成本,来满足用户使用的稳定性要求。在易用性上,将慢查询的监测告警功能、查询细分功能开发个用户让用户能感知到慢查询,从而开展针对性的调优。在性能方面,目前也在重点大力的推广物化视图能力,通过预处理的能力,为用户提供更好的性能和更低成本的服务。

三、StarRocks物化视图应用实践

   此部分详细介绍基于StarRocks的物化视图对业务监控看板进行加速优化。

    网约车的实时看版,是滴滴最核心的业务监控看板,包括实时的呼叫数、冒泡数、还有实时的GMV等超过20多个业务指标,支持业务、数据和运营人员,通过看板数据变化,进行业务趋势及同环比的数据监测,从而及时发现业务过程问题。此外,基于看板数据的实时变化趋势,来调整运营策略,从而影响线上行为。

   旧版的实时看板基于Druid进行配置,使用模糊去重方式进行指标计算,有一定的计算误差。在大促期间,同时访问的用户数非常多,查询并发过高,会导致集群负载过高,从而引发稳定性问题。在引入StarRocks之后,希望通过新的技术来对数据加工链路进行重构,解决指标的准确性和稳定性等应用问题。

  实时看板场景,有以下几个明显的特点:

  • 有大量精确去重的指标计算。高精度基数的精确去重一直是olap技术难点,应对每天上亿规模明细数据的count(distinct ())计算,对计算资源消耗是较大挑战;
  • 筛选维度较灵活。在看板查询的基础上,提供多筛选条件,即表的维度字段设置过滤条件筛选,包括时间、城市、业务线等超过十个维度的字段组合,达到日均千万级维度组合的应用场景;
  • 查询并发高。在大促期间,所有的数据开发,业务运营用户都会盯盘,关注业务瞬时变化趋势,高峰期间有数百上千规模的用户并发访问。每分钟都会进行指标数据刷新,每次刷新都会触发大几十次的查询计算,高峰期间有数百个查询QPS,对集群的负载要求非常高。如果直接使用原始的明细数据进行计算,将消耗巨量的计算资源,成本是无法接受的。

   结合上述业务特点,基于StarRocks的物化视图能力,对整个看板场景链路进行加速优化设计。最上游数据来自数仓,对上线日志,binlog清洗和Join处理后,加入消息队列中,通过flink同步到StarRocks。在StarRocks内部先做一次全局字典转换,对需要去重的指标列,将String映射转化成bigint,为后续使用bitmap类型进行上卷计算。

    之后在StarRocks内部进行数据建模,落地原始明细表,生成ODS层——StarRocks明细模型层,再加工DWD层——StarRocks中的同步物化视图,对不同的维度组合进行上卷。同步物化视图支持增量计算,时效性较高,数据满足强一致,存储类型使用bitmap的中间计算结果。对单次明细查询有明显的提升,但是查询并发还是无法满足应用需求。

     接着加工ADS层——StarRocks中的异步物化视图实现加速,由于异步物化视图使用定时刷新机制,时效性相对会差一些,数据相对基表有一定的更新延迟,查询基表和异步物化视图可能会存在一定的差异,但因为异步物化视图存储的最终计算的结果,因此查询响应极快,可以将异步物化视图理解为查询缓存的持久化。

   经过分析业务的历史查询模式,可以将最高频的查询定义为异步视图;同步视图在一定程度上,可以降低异步视图由于定时刷新计算带来的资源开销。对于一些无法命中异步视图的查询,也可以通过同步视图进行加速,对于剩余小部分低频查询,直接使用原始的明细数据表进行计算。

   针对第一步的写入时全局字典功能,这里进行详细介绍:

    上文提到,实时看板场景会涉及到大量精确去重的指标计算。通常在需要对count(distinct())指标做上卷计算时,StarRocks内部支持HyperLogLog(简称HLL)和bitmap两种去重算法。HLL是一种模糊去重的指标计算模式,对于精确去重的指标需要使用bitmap算法。

  对于bitmap算法,StarRocks内部使用的是roaring bitmap实现,字段类型要求是在uint64以内,而且在数据的连续性比较好的情况下,性能表现更优。若数据是连续递增的,相比完全随机的id,性能差异在百倍以上。所以,滴滴在starrocks中实现了高精度的全局字典功能。具体实现步骤分为以下几步:

   第一步:全局字典表的数据使用StarRocks内部的带自增ID列的主键表进行存储。表的主键使用的是需要去重的字段,ID列就是自增ID的列,数据在写入时生成连续递增的数字,写入时使用了StarRocks的一个partial_update部分列更新的功能,保证了写入幂等。只有在初次写入时生成自增ID列,之后相同的批重新写入,不会对ID的结果进行更新。确保数据可以无限次的重复写入。

   第二步:实现了字典映射的函数dict_mapping,入参为字典表表名、主键值,在计算时,实时查询字典表,并返回生成的ID列的值。使用StarRocks的主键索引进行加速,相比于基于scan 进行扫描,性能提升非常明显。

  第三步:内部改造了Flink的flink-starrocks-connector函数(cdc的连接器),写入时分两次写入:首先,写入字典表,抽取需要写入字典表的列,确保数据写入落盘,事务提交可见。之后,再写入实时数据表,StarRocks支持写入时设置参数、使用函数进行预处理,对数据进行预加工。使用第二步的字典映射函数dict_mapping,通过映射对需要去重的字段进行重新映射,将原有的string类型,映射为字典表中ID列的值。

   在数据全部落盘之后,需要设计异步视图如何创建?

   以简化后的订单表为例进行介绍:订单表中包括分区日期、数据时间、呼叫城市、渠道、业务线等维度字段信息,以及需要去重的字段业务订单ID。

   如下图,利用time_slice函数将时间取整为5分钟,按照5分钟区间粒度进行数据聚合,聚合维度包括呼叫城市、渠道等可累加维度。当用户查询5分钟粒度,且筛选条件和视图中聚合维度完全相同时,可以使用这张视图进行查询加速,而不需要去查询底表明细数据。

  重复上述操作,可以设置1分钟,10分钟,30分钟等不同的区间聚合粒度,按照不同的维度列组合,可以创建出多张异步视图,来满足不同用户,不同维度的组合查询条件,完成对应实时看板的 加速效果。

    在上述过程中,需要创建多少张异步视图,才能使得所有查询都可以命中?以订单表中包含N个维度列 为例,因为count(distinct())结果是不支持累加的,需要完成所有维度字段的排列组合(既2的N次方个视图),才能满足所有查询命中视图加速。即,如果有10个维度列,就需要由超过1000张视图,这个成本是不能接受的。

   结合表数据特点,对异步视图的数量进行优化,上述提到了可累加维度和不可累加维度概念,如果一个订单只能有一个呼叫城市,呼叫城市维度就是可累加维度。如果要进行全国累计呼叫次数计算,就可以通过所有城市的呼叫次数进行累加实现。这样就可以复用物化视图,避免冗余建设全国维度的物化视图。反向的,订单状态是不可累加维度,每个订单会在多个状态之间流转,不支持累加计算。如果数据表中可累加的维度列有M个,那么异步物化视图需要2的(N-M)次方个。

  

     如何使用异步物化视图的透明加速能力来简化使用成本?StarRocks的整条数据加工链路上,除了底层明细表,还有多张异步视图,同步视图等。使用方需要确定本地查询需要使用哪张表,对用户而言,操作比较复杂。StarRocks提供了视图的透明加速功能 ,将查询与这张表关联的所有视图进行对比,将查询自动改写成符合条件的视图上,保证改写前后的语义查询结果相同,查询性能一致。从而保障在不改变查询sql的情况下,使用视图对查询进行加速。

   示例SQL如下图,内层的子查询使用了按5分钟进行聚合,聚合维度包括所有可累加维度——日期分区、数据日期、呼叫城市、渠道等4维度字段,在外层再多数据进行求和。

    基于StarRocks的底表,建立了3张异步视图,视图1包括了1分钟聚合粒度,分区、日期、呼叫城市、渠道等可累加维度;视图2同视图1,将聚合粒度调整为5分钟;视图3集成视图2的基础上,增加业务线可累加维度。

    从而产生了如下四种查询条件:

Case 1: Where 为空,命中MV1

Case 2: Where city IN(...)命中MV2

Case 3:Where product_line=?,命中MV3

Case 4:Where Product_line IN(),多业务线查询,不支持累加,不能命中MV3,如果有创建同步视图的话,可以进行上卷加速。

四、总结与规划

    设计方案的核心在于做取舍,方案的成果关键在于综合性能的提升。

  • 单次查询耗时降低80%,资源消耗降低95%
  • 同规模集群支持qps提升百倍

   缺点也明显,如下:

  • 数据链路相对复杂,视图由人工配置,维护复杂度高,成本较高;
  • 异步视图是定时刷新的,在没有看板访问时,也保持定时刷新,浪费计算资源;
  • 异步视图由于刷新间隔问题,无法保持同底表强一致

    对于看板类查询,并发极高,但查询模式比较固定,大部分的查询时类似的,甚至是重复的,整体方案的思路在于牺牲一定的灵活性,保障查询性能达到极致提升。

    后续规划方向,在性能上进一步优化提升:

  • 首先,在于bitmap计算性能提升。尝试修改StarRocks的bitmap分桶策略、bitmap的range进行分桶,在不需要对bitmap的中间结果进行shuffle情况下,就可以获取到最终结果。使用bitmap的fastunion函数对大量BITMAP的合并速度进行提升。  
  • 其次,异步视图在改写计算环节资源消耗还是比较大。同底表相关的所有视图进行对比,包括分区数据一致性、版本是否一致等等方面,还存在较大的提升空间。例如1s的查询,有500ms都消耗在SQL优化器上。

  • 最后,在易用性上进行提升。由于看板查询都是基于平台配置,自动生成的查询SQL,因而通过分析历史查询记录,提取高频查询,进行物化视图自动创建,降低人工参与,才能更有利于实现技术的更大规模应用和推广。

参考文章:

https://mp.weixin.qq.com/s/FZtJkPM87xJlwjc2ivk1kQ

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

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

相关文章

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时,有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

【数据结构与算法】回溯法解题20240229

【数据结构与算法】回溯法解题20240229 一、46. 全排列1、以[1,2,3]为例,抽象成树形结构2、回溯三部曲 二、LCR 084. 全排列 II1、以[1,1,2]为例,抽象成树形结构 三、面试题 08.07. 无重复字符串的排列组合四、面试题 08.08. 有重复字符串的排列组合 一、…

代码随想录-力扣刷题-总结笔记01

代码随想录:代码随想录力扣:力扣 (LeetCode) 全球极客挚爱的技术成长平台 目录 01、代码随想录 00、琐碎知识点 01、数组 02、链表 03、哈希表 04、字符串 05、双指针法 06、栈与队列 6.1、栈 6.2、队列 07、二叉树 7.1、前中后序-递归遍历 …

UTONMOS元宇宙游戏发展趋势是什么?

UTONMOS元宇宙游戏的发展趋势包括以下几个方面: 更加真实的体验:随着技术的进步,UTONMOS元宇宙游戏将提供更加逼真的视觉、听觉和触觉体验,让玩家更加身临其境。 社交互动:UTONMOS元宇宙游戏将越来越注重社交互动&am…

Premiere水墨风格婚纱照片婚礼视频模板|PR婚庆后期剪辑模板

时尚大气水墨风格婚纱照片展示,婚礼视频制作PR模板,婚庆后期剪辑模板MOGRT。 主要特点:高清(19201080)分辨率/30帧/秒,Premiere Pro 2022或更高版本软件,易于定制,持续时间00:50秒&a…

猫头虎分享已解决Bug || 虚拟网络问题(Virtual Network Issue):VirtualNetworkError, VNetFailure

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈,IPD流程是一种高度结构化的产品开发流程,它集成了业界很多优秀的产品开发方法论,像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点,对全流程的IPD进行合适的裁剪…

陪诊小程序:温暖您的就医之路,让关怀触手可及

随着社会的进步和科技的发展,人们对于医疗健康的需求日益增长。然而,在繁忙的生活节奏中,许多人在面对就医时却面临着无人陪伴的困境。为了解决这一问题,陪诊小程序应运而生。 陪诊小程序是一种便捷、高效、人性化的医疗服务应用…

Python正则表达式:从基础到高级应用的全面总结与实战【第103篇—JSON模块】

Python正则表达式:从基础到高级应用的全面总结与实战 正则表达式是一种强大的文本匹配和处理工具,广泛应用于文本处理、数据抽取、表单验证等领域。本文将从正则表达式的基础知识出发,逐步深入,最终结合代码实战,带你…

【代码随想录python笔记整理】第十四课 · 链表的基础操作 2

前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。 一、分析题目要求 在前面一课中,我们学习了链表的创建以及新元素的插入,并且我们学会了打印链表中的元素。这节课我们依托上节课的基础…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win版

JetBrains DataGrip 2023是一款功能强大的数据库IDE,专为数据库开发和管理而设计。通过DataGrip,您可以连接到各种关系型数据库管理系统(RDBMS),并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023 软件获取 DataGrip …

2024深度学习主流框架对比

tensorFlow 是最受欢迎和广泛使用的深度学习框架之一,目前在github的start数为181k。 TensorFlow是一个由Google Brain团队开发的开源深度学习框架。它允许开发者创建多种机器学习模型,包括卷积神经网络、循环神经网络和深度神经网络等,该框架…

如何在服务器正确读取resources目录下的文件

1、错误代码 InputStream is new BufferedInputStream(new ClassPathResource("fonts/SourceHanSans-Normal.ttc").getInputStream());文件位置 2、正确代码 ClassPathResource classPathResource new ClassPathResource("fonts/SourceHanSans-Normal.ttc…

Python语言基础与应用-北京大学-陈斌-P29-28-计算和控制流:控制流:上机:基本计算程序-给定y和m,计算y年m月有几天?-上机代码

Python语言基础与应用-北京大学-陈斌-P29-28-计算和控制流:控制流:上机:基本计算程序-给定y和m,计算y年m月有几天?-上机代码 # 给定y和m,计算y年m月有几天? run_y_m_day { # 把闰年的每月天数存入字典 1:31, 2:29, …

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展,旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分,其形式更加多元化智能化。智能导览系统作为一种新的服务方式,能够为游客提供更加便捷的旅游服务和游览体验,也逐渐…

django运行项目NameError: name ‘_mysql‘ is not defined

Django运行项目时报错 Django运行项目时报错NameError: name ‘_mysql’ is not defined 安装的mysqlclient 是 2.1.1版本 切换成mysqlclient-2.1.0 运行,解决

高并发数据采集:Ebay商家信息多进程爬虫的进阶实践

背景 Ebay作为全球最大的电子商务平台之一,其商家信息包含丰富的市场洞察。然而,要高效获取这些信息,就需要利用先进的技术手段。本文将深入探讨如何通过并发加速技术,实现Ebay商家信息多进程爬虫的最佳实践方法,并附…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…

springboot-基础-thymeleaf配置+YAML语法

备份笔记。所有代码都是2019年测试通过的,如有问题请自行搜索解决! 目录 配置thymeleafthymeleaf举例参数设置yaml基础知识YAML语法报错:Expecting a Mapping node but got 其他语法 spring boot不推荐使用jsp。thymeleaf是一个XML/XHTML/HTM…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…