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

    原文大佬的这篇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.mfbz.cn/a/414838.html

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

相关文章

IOC 和 AOP

IOC 所谓的IOC(inversion of control),就是控制反转的意思。何为控制反转? 在传统的程序设计中,应用程序代码通常控制着对象的创建和管理。例如,一个对象需要依赖其他对象,那么它会直接new出来…

express+mysql+vue,从零搭建一个商城管理系统6--数据校验和登录

提示:学习express,搭建管理系统 文章目录 前言一、修改models/user.js二、修改routes下的user.js三、Api新建user/login接口四、删除数据库原有数据,添加新验证规则的用户四、用户登录总结 前言 需求:主要学习express,…

【Linux】基础篇-Linux四种环境搭建的方式(详细安装说明步骤,搭载下载安装地址)

目录 1. 使用虚拟机(推荐VMware)centos 7版本 1.1VMware虚拟机下载 1.2VMware 安装 1.3centos-7 清华大学镜像下载 1.4 centos-7 清华大学镜像导入虚拟机VMware 2.使用虚拟机ubuntu 20.04版本 2.1虚拟机下载同上 2.2虚拟机安装同上 2.3ubunt…

ROS-Ubuntu 版本相关

ROS-Ubuntu 版本相关:安装指引 年代ROS1版本Ubuntu 版本2014Indigo14.042016Kinetic16.042018Melodic18.042020Noetic20.04 & 22.04 ROS2兼顾了工业使用上的问题。 年代ROS2版本Ubuntu 版本2022Humble20.04 & 22.042023Iron16.04 相关参考: […

【Qt 学习之路】使用 cmake 在Windows上 编译 ZeroMQ

文章目录 1、概述2、编译2.1、用 Visual Studio 的解决方案方式2.1.1、找到 Builds 文件夹2.1.2、查看 deprecated-msvc 下的 libzmq.sln 文件2.1.3、使用 Visual Studio 打开 libzmq.sln 解决方案2.1.4、修改 libzmq.import.props 文件2.1.5、编译生成 2.2、用 C 的cmake方式2…

【前端入门】设计模式+单多页+React

设计模式是一种解决特定问题的经验总结,它提供了经过验证的解决方案,可以在软件开发过程中使用。设计模式可以帮助前端开发人员更有效地组织和管理代码,并提供一种共享的语言和框架,以便与其他开发人员进行交流。 以下是一些常见…

十二、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法(promotion)重新定义paintEvent事件 2、实现程序 (1)创建项目,基于QWidget (2)添加类,为Widget组件提升类 #inclu…

Delegate(P29 5.5delegate)

一、Delegate简介 每个代理都可以访问许多附加的属性,其中一些来自数据模型,另一些来自视图。 从模型中(Model):属性将每个项目的数据传递给 delegate。 从视图中(View):属性将状…

dcat admin 自定义页面

自定义用户详情页 整体分为两部分:用户信息、tab框 用户信息采用自定义页面加载,controller代码如下: protected function detail($id) {return Show::make($id, GameUser::with(finance), function (Show $show) {// 这段就是加载自定义页面…

pdf怎么合并在一起?

pdf怎么合并在一起?在日常工作和学习中,我们常常需要处理大量的PDF文件。有时候,我们可能希望将多个PDF文件合并成一个文件,以便于管理和分享。这时候,PDF文件合并工具就能派上用场了。PDF文件合并是一种将多个PDF文件…

MySQL 事务原理分析

事务 前提:有并发连接。定义:事务是用户定义的一系列操作,这些操作要么都做,要么都不做,是一个不可分割的单位。目的:事务将数据库从一种一致性状态转换为另一种一致性状态,保证系统始终处于一…

【数据结构】从链表到LinkedList类

🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈 🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈&…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装,本文记录Linux安装的过程,且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

JavaWeb——005 请求响应 分层解耦(Postman、三层架构、IOC、DI、注解)

SpringBootWeb请求响应 这里写目录标题 SpringBootWeb请求响应前言1. 请求1.1 Postman1.1.1 介绍1.1.2 安装 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 …

产品老化试验目的、用途

什么是老化试验? 老化试验是通过模拟产品在使用过程中的老化情况,来评估产品在长期使用后的性能和可靠性。这种测试可以帮助制造商了解产品的寿命和耐久性,以及产品在不同环境条件下的表现。 模拟量采集/老化房采集软件 为什么需要进行老化试…

【Leetcode每日一刷】贪心算法01:455.分发饼干、376. 摆动序列、53. 最大子序和

博主简介:努力学习和进步中的的22级计科生博主主页: Yaoyao2024每日一句: “ 路虽远,行则将至。事虽难,做则可成。” 文章目录 前言:贪心算法一、455.分发饼干二、376. 摆动序列三、53. 最大子序和 前言:贪…

挑战杯 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…

信号系统之切比雪夫过滤器

1 切比雪夫和巴特沃斯的响应 切比雪夫响应是一种数学策略,通过允许频率响应中的纹波来实现更快的滚降。使用这种方法的模拟和数字滤波器称为切比雪夫滤波器。这些滤波器因使用切比雪夫多项式而得名,切比雪夫多项式由俄罗斯数学家帕夫努蒂切比雪夫&#…

基于FPGA的9/7整数小波变换和逆变换verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 9/7整数小波变换原理 4.2 逆变换过程 5.算法完整程序工程 1.算法运行效果图预览 将测试结果导入到matlab显示 2.算法运行软件版本 vivado2019.2,matlab2022a 3.部分核心程…

寒假作业Day 01

这个项目主要是为了复习博主之前关于C语言和数据结构的寒假作业,大家也可以根据这些题目自己进行填写并检查自己的知识点是否过关 博主也会有错误,所以如果大家看到错误,也希望大家能够进行指正,谢谢大家! Day 01 一…