微信基于StarRocks的湖仓一体实践

作者:StarRocks Active Contributer、微信 OLAP 内核研发工程师

微信作为国内活跃用户最多的社交软件,其数据平台建设经历了从 Hadoop 到 ClickHouse 亚秒级实时数仓的阶段,但仍旧面临着数据体验割裂、存储冗余的问题。通过 StarRocks 的湖仓一体方案,以及和社区密切配合开发的实时增量物化视图,微信解决了“实时、极速”背后的“统一”诉求。在直播业务场景中,通过湖上建仓的方案改造,使得数据开发同学需要运维的任务数减半,同时存储成本降低65%以上,离线任务产出时间缩短两小时。

当前,基于 StarRocks 的湖仓一体方案已经在微信的多个业务场景中上线使用,包括视频号直播、微信键盘、微信读书和公众号等,集群规模达到数百台机器,数据接入量近千亿,向理想化的湖仓一体形态不断演进。

背景

从 Hadoop 到亚秒级实时数仓建设:多年以前,微信的数据分析架构还是完全基于 Hadoop 生态的,其存在着较多的弊端:首先,查询非常慢,数据延迟高,业务同学进行数据开发也很慢;其次,在架构方面,采用的是流批分离的架构,整体架构非常臃肿。

随着微信业务的不断发展,视频号等推荐系统对个性化体验的强烈诉求,我们基于 ClickHouse 内核打造了亚秒级的 OLAP 实时数仓,广泛用于 A/B 实验平台、BI 分析、实时指标计算等场景中。在基于 ClickHouse 的实时数仓中,我们做到了亿行数据的亚秒级响应,海量数据的低延迟、精确一次接入,实现了流批一体架构。

“实时、极速”后的“统一”诉求:一直以来,数据分析技术栈从 MySQL 开始基本上是沿着两条路线不断往前演进的,一条是实时的路线,另一条是极速的路线。实时的路线经历了从 Lambda 架构到 Kappa 架构,再演进到最近的 Data Lake,形成流批一体;而极速的路线经历了从 Hive 小时以上的分析时延,然后演进到 SparkSQL,再到 Presto/Druid/Kylin 达到分钟级的查询时延,最终演进到了诸如 ClickHouse 这类的 OLAP 数据库,达到亚秒级响应。从未来的趋势来看,两者会形成统一,这也是湖仓一体/Modern OLAP 所要达到的目标。

alt

在微信的数据分析场景中,主要面临三个方面的挑战:

  • 海量数据:在我们的业务场景下,数据规模很大,单表日增万亿,单次查询扫描数据量在10亿以上,同时需要计算的指标和维度可能会非常多(50+维度,100+指标);
  • 极速:微信业务场景对查询耗时要求极高,查询耗时 TP 90 需要在5秒以内,同时要求数据低时效(秒/分钟);
  • 统一:我们希望能够实现计算侧和存储侧的统一。

过去,在基于 ClickHouse 的实时数仓中,我们已经解决了海量数据和极速的挑战,但还有一个统一的需求没有解决。

湖仓一体

湖仓一体要解决的是通用大数据计算引擎处理 OLAP 数仓体验割裂、存储多份的问题。过去,无论是在湖上面还是仓上面,都存在着相应的困境。

alt

湖上面面临的主要问题是查询性能太慢,如果需要对 Hadoop 中的数据进行即席查询,则需要先将数据导出到 OLAP 数据库中再进行查询加工,造成了资源的浪费,工序繁琐;而仓上面,存在着通用大数据计算引擎处理 OLAP 实时数仓生态不够友好的问题,例如,Spark 无法直接分析 ClickHouse 中的数据,如果要进行查询分析,则需要先将数据从 ClickHouse 落回 Hive 中。总结来看,过去的架构存在的问题就是:

  • 两份存储
  • 口径不一致
  • 额外的数据导入导出步骤
  • 数据分析流程难以标准化

通过湖仓一体架构,我们希望能够真正解决上述问题,实现存储统一、接口统一、元数据统一,亚秒级查询与分钟级查询统一等,最终理想化的湖仓一体形态:面向SQL,用户不再需要感知底层架构。

技术路线一:湖上建仓

实现湖仓一体的第一种技术路线是湖上建仓,即在数据湖基础上实现数仓的功能,代替传统数仓,构建 Lakehouse:在传统 Hadoop 系统中引入 Delta lake、Hudi、Iceberg 或 Hive 3.0 等更新技术;引入 Presto、Impala 等 SQL on Hadoop 查询引擎;引入 Hive Meta Store 进行统一元数据和权限管理;引入对象存储作为底层存储等数仓特性,形成湖仓一体,业务比较有代表性的是 Databricks 提出的湖仓一体架构。 在微信内部,湖上建仓的架构经历了从 Presto+Hive 到 StarRocks + Iceberg 的演变过程,通过使用 StarRocks 替代 Presto,数据的时效性从小时/天级提高到了分钟级,同时查询效率从分钟级提高到了秒级/分钟级,其中80%的大查询用 StarRocks解决,秒级返回,剩下的超大查询通过 Spark 来解决。

  • 秒级: 中大表,秒级返回,StarRocks
  • 分钟级:大表查询,分钟级,Spark
alt

与 Presto 相比,StarRocks 直接查湖的性能提升 3-6 倍以上。

alt

目前,在我们的使用场景中,湖上建仓的方案主要通过外挂调度的方式来实现。未来,当 StarRocks 的外表物化视图功能更加成熟以后,会采用更加简洁、方便、易于运维的外表物化视图来实现。

alt

湖上建仓方案具有的优点是成本低,实现简单,同时 Hadoop 生态兼容性更好。但其存在的缺点是:数据延迟较高,需要5-10分钟左右;另外,ODS、DWD 层的查询会比较慢,需要通过本地缓存等方式来进行加速。因此,综合来看,湖上建仓的方案主要还是湖为主,更适合于离线分析为主的场景。

技术路线二:仓湖融合

实现湖仓一体的第二种技术路线是仓湖融合,通过在数仓中加入跨源融合联邦查询的功能,打通内容存储,从而不需要经过 ETL 能够直接分析数据湖。在该方案中,我们采用冷存下沉的手段,实现仓湖数据的统一。

alt

在该方案中,数据会先实时接入仓,之后,冷存经过转换下沉到湖,通过 Meta Server 实现仓湖元数据的统一管理,在查询时,能够合并冷热数据读取,同时,通过 SparkLake API 提供对通用离线计算的支持。在该方案中,由于数据是先落仓的,因此数据的实时性会更高,在秒级到2分钟以内,同时 DWD 层的查询响应会更快。但其缺点是成本高(热数据TTL),Hadoop 生态兼容性不如湖上建仓的方案。因此,综合来看,仓湖融合的方案主要还是考虑仓为主,更适合于实时分析为主的场景。

当前,仓湖融合、冷存下沉的湖仓一体方案已经在微信安全的业务场景中落地,接入的大表每日数据量达数十亿,超大表每日数据量千亿以上。小时分区降冷耗时分钟级,天分区降冷耗时小时级;在内存消耗方面,单任务最大消耗 5GB 左右,对集群无明显影响。

同时,通过 BE/FE 参数调优: compaction 线程数比例调整、flush 线程数调整、并发事务数调整,消除了大表并发时的数据挤压,全天稳定运行:

alt 上线前

alt 上线后

湖仓一体架构

从前面的分析中可以看到,湖上建仓和仓湖融合两种方案各有优缺点,分别适用于湖为主和仓为主的业务场景,而在微信的业务场景中,两种路线都有需求。

alt

因此,在我们的湖仓一体方案中,采用的是湖上建仓和仓下沉湖的融合方案。

alt

在该方案中,我们同时支持实时接入和准实时接入,用户可以根据自身对成本、性能和数据时效性的要求来选择通过哪种方式进行接入,并且是可切换的。例如,刚开始时,用户对性能、数据时效性要求不是特别高,那么可以选择通过湖接入的方式,这样成本较低,当后续该用户对性能和数据时效性要求变高了,那么他可以切换到仓接入的方式,这样就可以满足需求。因此,在我们的湖仓一体架构中,既能够支持极速 BI 分析的场景,也能够满足通用离线计算的需求。

实时增量物化视图

过去,在 StarRocks 中主要有两种不同类型的物化视图:异步物化视图和同步物化视图。

异步物化视图会根据基表的数据变化,定时触发刷新或手动刷新物化视图更新数据变化,在进行刷新时,需要对整个表或整个分区进行一次完整的 INSERT OVERWRITE,如下图所示。在查询基础表时,优化器会根据物化视图定义自动进行查询改写,从而利用物化视图的预计算结果来对查询进行加速,同时也可以直接查询物化视图表的数据。

alt

然而,由于需要不断进行分区级的 INSERT OVERWRITE 刷新,当基础表的数据量比较大时,这一刷新的过程开销会非常大,容易影响集群整体负载和稳定性;同时,物化视图是通过异步刷新来更新数据的,更适合于离线数仓场景,而不适用于实时数仓场景。

同步物化视图能够在数据写入基础表的时候同步刷新物化视图。与异步物化视图不同的是,同步物化视图的结果是作为一个 Index 和基础表绑定在一起的,物化视图本身对用户不可见,不能直接查询。在查询基础表数据时,能够基于基础表中存在的同步物化视图进行透明加速

alt

然而, StarRocks 的同步物化视图具有一些限制:

  • 不支持复杂表达式,仅能够对基础表中的列进行简单的聚合操作,无论是维度列还是指标列中,都不能包含复杂表达式;
  • 不支持输出列别名;
  • 基础表中的列不能在物化视图中被多次引用;
  • 仅支持少量聚合函数,不支持通用聚合函数;
  • 物化视图数据与基础表强绑定,无法直接查询物化视图数据。

在湖仓一体场景下,对于实时性、性能要求高的场景,我们需要通过实时增量物化视图来进行加速。微信的实时物化视图具有如下一些特点:

  • 大规模,单表数据量大,因此物化视图只能增量更新,不能全量刷新
  • 实时性要求高:需要同步刷新,不能异步刷新
  • 多表指标拼接:多个基础表的物化视图计算指标拼接到同一个物化视图目标表中
  • 在物化视图写入时进行高性能维表关联
  • ...

针对这些特点和要求,我们基于 StarRocks 的物化视图功能,与社区共同在过去的同步物化视图基础上进行了新的探索,以适应这类更加复杂的分析

物化视图增强技术路线: 多流同步物化视图 -> 全局字典关联 -> streaming 物化视图(doing) -> 湖上增量同步物化视图

目前实现到第二阶段,已经可以实现多数 ClickHouse 增量同步物化视图的能力,下边详细介绍:

多流同步物化视图

在新的实时增量物化视图设计中,我们将基础表与存储物化视图结果的目标表进行了解耦,物化视图本身仅用来表达计算逻辑,如下图所示。这样做有多个方面的原因:

  • 在数仓体系中,基础表通常属于 ODS 层,需要保留3~7天,而存储物化视图结果的目标表属于 DWS 层,通常需要保留半年到一年,将这两者解耦之后,我们才能够分别为其定义不同的存储周期。
  • 将物化视图的计算逻辑和计算结果完全解耦,业务不需要关心具体的计算逻辑,直接查询物化视图目标表中存储的指标结果即可,能够极大提高易用性,同时能够将上下游业务逻辑解耦,上游计算逻辑发生变化不会影响下游使用。
  • 最后,只有将两者解耦,我们才能够实现多个基础表的协议关联,通过让多个基础表的物化视图计算结果写同一个目标表,从而完成指标拼接。
alt

基于全局字典的维表关联

在我们的物化视图场景中,另一个比较关联的需求是基于全局字典的维表关联。维表关联是在 BI 场景、流式计算中一个非常通用的问题。在过去,我们需要依赖于 Flink 任务在上游先完成维表关联的工作,得到中间表,然后再将中间表写入物化视图进行查询加速。而基于高性能的全局字典功能,我们能够在数据写入时,通过查询字典表,直接在 OLAP 数据库的内部完成维度表的关联,从而不再需要依赖于繁重的 Flink 任务,同时,字典表也可以用于优化 BI 查询的 JOIN 性能。

alt

未来

当前,我们已经支持多流同步物化视图,同时社区全局字典功能也基本可用。但是,目前的多流同步物化视图仍然存在较多限制:例如,不支持 JOIN,不支持通用聚合函数等。未来,我们希望新的 Stream MV 能够消除上述限制,进一步满足更多的业务场景;更进一步,Stream MV 结合外表物化视图,达到湖上实时增量物化视图,成为更好的湖上建仓方案。

总结与展望

当前,基于 StarRocks 的湖仓一体方案已经在微信的多个业务场景中上线使用,包括视频号直播、微信键盘、微信读书和公众号等,集群规模达到数百台机器,数据接入量近千亿。

在收益方面,我们以一个具体的业务来举例,在直播业务场景中,通过湖上建仓的方案改造,使得数据开发同学需要运维的任务数减半,同时存储成本降低 65% 以上,离线任务产出时间缩短两小时。

未来,我们希望不断探索和完善现有的湖仓一体架构,最终能够达到理想中的湖仓一体:

  • 面向 SQL,用户不再感知底层架构;
  • 接入/查询体验统一,存储统一;
  • 秒级/分钟级延迟架构体验统一,亚秒/分钟级分析统一;
  • 单个/百 QPS 体验统一;
  • SQL 交互标准统一。

致谢:感谢“腾讯大数据团队”提供稳定内部集群和各类技术支持,帮助业务落地;感谢" StarRocks 社区"在功能开发,问题定位解决上的诸多帮忙,祝愿社区发展的越来越好!

本文由 mdnice 多平台发布

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

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

相关文章

时钟偏移与时钟抖动

1、时钟偏移 如下图所示,由于布局布线导致,clk到达三个触发器的时间是不一样的。这个就是时钟偏移,对每个触发器而言,不会改变时钟周期。 2、时钟抖动 如下图所示,指芯片的某一个给定点上时钟周期发生暂时性变化&…

【Spring】15 ApplicationContextAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架提供了许多回调接口,用于在 Bean 的生命周期中执行特定的操作。ApplicationContextAware 接口是其中之一,它允许 Bean 获取对 A…

SM5321 是一款带动态路径管理的开关型单节锂电池充电电路。

SM5321 2.5A.1MHz 带动态路径管理的开关型单节锂电池充电电路 简介: SM5321 是一款带动态路径管理的开关型单节锂电池充电电路。SM5321 可提供 2.5A 的充电电流,特别适合移动电源、平板电脑等配备超大容量锂电池的设备。SM5321 内部集成了大电流同步降压…

SpringBoot 使用Quartz执行定时任务对象时无法注入Bean问题

文章目录 问题描述解决方案结束语 大家好!今天是2023年12月212日 | 农历十一月初九(距离2024年还有一周左右的时间),最近还是比较忙的,忙着搞钱,毕竟马上过年啦。 问题描述 感谢大家对我一直以来的支持与帮助,今天这边…

IDEA 黑色主题很难看到鼠标

“控制面板”—搜索“鼠标”关键字—选择“更改鼠标设置” 参考: IDEA 黑色主题很难看到鼠标

JDBC常见的几种连接池使用(C3PO、Druid、HikariCP 、DBCP)

✨前言✨ 本篇作为主要在于介绍jdbc数据库连接池,以及多种连接池的用法 🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍒博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 文章目…

计算机基础:网络基础

目录 一.网线制作 1.制作所需要工具 网线制作标准 ​编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设置 说明书 设…

智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.…

Python:正则表达式---贪婪匹配

在正则表达式中,贪婪匹配是指匹配尽可能多的字符,而非贪婪匹配(也称为懒惰匹配或最小匹配)则是匹配尽可能少的字符。 .* 表示匹配任意数量的任意字符(除换行符外)。贪婪匹配会将尽可能多的字符都作为匹配结…

macOS 安装 oh-my-zsh 后 node 报错 command not found : node

最近为了让终端中显示 git 分支的名称,安装了 oh-my-zsh ,安装之后呢,我原先安装的 Volta、 node 都没法用了,报错如下: 这时候粗略判断应该是系统变量出了问题,oh-my-zsh 的变量文件是 ~/.zshrc&#xff0…

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现,并在第 2 部分中探索训练过程之后,我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码,请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

Linux(二)常用命令

文章目录 一、文件管理命令1.1 chmod1.2 chown1.3 cat1.4 cp1.5 find1.6 head1.7 tail1.8 less1.9 more1.10 mv1.11 rm1.12 touch1.13 vim1.14 >和>>1.15 scp1.16 ln1.17 怎么用命令查看日志 二、文档管理命令2.1 grep2.2 wc2.3 echo 三、磁盘管理命令3.1 cd3.2 df3.3…

短视频账号矩阵系统3年独立开发正规接口源码搭建部署开发

一、矩阵系统源码主要有三种框架: 短视频账号矩阵源码的框架有很多种,以下列举其中几种: 1. **星图矩阵**:星图矩阵是抖音官方向商家提供的短视频广告推广平台,是抖音官方的赚钱工具。商家可利用星图矩阵进行广告推广…

适用于车载电动升窗器的解决方案

升窗器是指避免车主忘记关窗的自动关窗装置,主要通过电子模块加认组合,利用主机上的芯片里面设定的程序完成检测功能,使自动升窗步骤顺利完成。 ■ 基于ACM32F403系列MCU ■ 高性价比软件控制方案,高算力 ■ MCU内置2路CAN总线&a…

为什么项目管理工具需要项目财务信息?

在讨论项目时,钱是绕不开的话题。 资金是项目管理中最重要的因素之一,与范围和时间并列,三者共同构成了 “三重约束”。例如,如果缩短项目时间,就必须增加成本。 如果无法清楚了解开支及其对项目的影响(反…

Python接口自动化测试:断言封装详解

前言 在进行API接口测试时,断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中,我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中,我们主要会使用两个库:requests和jsonpath…

基于 SOAP 的 Web 服务 是什么服务

基于 SOAP 的 Web 服务是一种网络服务,它使用简单对象访问协议(SOAP)作为通信协议。SOAP 是一种基于 XML 的协议,用于在网络上交换结构化信息。基于 SOAP 的 Web 服务通常用于实现跨网络的远程过程调用(RPC&#xff09…

红队打靶练习:WINTERMUTE: 1

前言 网络扫描(Nmap、netdiscover) HTTP 服务枚举 使用电子邮件日志文件在浏览器中进行目录遍历 利用 SMTP RCPT 选项中的操作系统命令注入 生成 PHP 后门 (Msfvenom) 执行RCPT选项中嵌入的后门 反向连接(Metasploit) 导入 pytho…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出,有很多简单的工具如easypoi,而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景,而我们实际生产中面临的都是客户自定以的一个负责报表导出,这是利用…

嵌入式开发是否会重复Java的结果?

今日话题,嵌入式开发是否会重复Java的结果?嵌入式开发与Java开发在性质和稳定性上有一些不同,因此不太容易出现与Java相似的结果。嵌入式开发通常属于第二产业,主要涉及制造业领域,如电子、机械(汽车&#…