饿了么基于Flink+Paimon+StarRocks的实时湖仓探索

news2024/11/17 5:55:50

摘要:本文整理自饿了么大数据架构师、Apache Flink Contributor 王沛斌老师在8月3日 Streaming Lakehouse Meetup Online(Paimon x StarRocks,共话实时湖仓架构)上的分享。主要分为以下三个内容:

  1. 饿了么实时数仓演进之路
  2. 实时湖仓方案选型与探
  3. 实时湖仓规划及展望

一、饿了么实时数仓演进之路

1. 饿了么典型实时应用场景

以上是饿了么在实时应用中的一些典型场景,和许多公司有相似之处。具体分为以下几个部分:

(1)实时 ETL:包括实时数据入湖入仓、实时数据建模、实时流量归因等。

(2)实时报表应用:包括营销活动直播、商家生意参谋、实时流量大盘、大促实时大屏、实时AB实验等。

(3)实时与在线应用的联动:包括商物流实时联动、实时人群特征及投放、个性化推荐、IOT信息同步、风控实时拦截等。

(4)实时监控与补偿:包括实时数据核对与订正、业务诊断预警、服务器异常监控等。

2. 饿了么数据架构大图

饿了么整体数据架构大图主要由三个层面组成,分别为数据采集层,数据加工层,数据服务层。相关的数据组件依托阿里云组件。整体数据采集使用 DataX 和 DRC 链路来进行数据库 Binlog 的采集。日志采集主要使用内部的 Omni 平台来收集用户行为数据,而应用层的日志通过 SLS 和 TT 来进行相应的日志接入。

数据仓库这一层是一个重点。一个是存储方面可以分为两块:一块是近实时的湖仓,采用 Paimon On OSS 方案来进行存储;而对于实时性要求更高的数据,使用的是 TT 和 SLS。在数仓计算层,使用的是 Dataphin、VVP(实时计算 Flink) 和 Flink 三件套。在数据服务层,主要的数据存储使用 ADB 和 Hologres,最近引入了 StarRocks 来结合湖仓进行落地。在这个存储基础上,通过内部的数据服务应用(包括繁星、方舟、FBI、量子等组件)来提供相应的数据服务。通过以上数据服务,构建了整体的数据产品和数据解决方案。

最核心的两个点是计算和存储。上图右边展示了整体计算变化的情况。右边第一张图显示了我们内部 Blink 和 Flink 的用量曲线。可以观察到,早期更多使用的是 Blink,随着 Flink 的进一步拓展,到2023年左右,开始大规模切换到 Flink。计划在今年将所有 Blink 下线,全部统一切换到 Flink。第二张图显示的是存储层的情况。存储层早期更多使用的是 ADB,现阶段更多使用 Hologres 来支持。未来 Hologres 的用量也会逐步扩大,并引入类似 StarRocks 这样的 OLAP 引擎,以提升团队整体研发效率。

3. 实时数仓1.0

基于上述的两个背景,接下来介绍一下我们内部当前实时数仓建设的情况。

实时数仓的1.0版本中,这是大多数公司早期版本的典型样子。我们通过日志和数据库的 Binlog 进行数据采集,这些数据最终进入 ODS 层。在 1.0 版本的早期阶段,我们投入了大量工作来建设 DWD 层。在 DWD 层,我们对一些共性的维度和逻辑进行了扩展,并屏蔽了多余的场景,建设了完善的 DWD 层群以供下游消费使用。

对于不同的应用场景,我们开发了相对独立的 ADS 层,这一层并未进行公共层的建设。而对于核心业务场景,我们采用了 Lambda 架构将历史数据通过 T+1 的方式导入到 OLAP 引擎中,以保证数据的稳定性。在此过程中会出现几个问题:首先是研发效率较低的问题,会产生较多的重复开发工作。其次,随着业务的变化,这些逻辑往往无法及时同步更新,导致数据一致性缺乏保障。这不仅增加了整体的运维成本,也增加了计存成本。

基于上述情况,我们期望达成以下两个目标:首先是确保数据能够更快、更准、更稳、更一致;其次是提升整体的开发效率和运维效率。具体的解决方案总结为四个要点:

(1)数据产品能力升级,收敛实时需求。

(2)夯实实时的 CDM 资产,收口指标加工逻辑。

(3)实时数仓架构方案升级,获取技术红利,降低研发复杂度。

(4)研发规范化及工具沉淀(流程卡点&实时基线等)。

4. 实时数仓2.0

上述第二点对应的是实时数仓 2.0 的具体方案。具体方案是建设核心的 CDM 层,将常见的共性维度和指标加工成 DWS 资产。这个方案是在去年年初提出的,整体方式是借助 Dataphin 来构建一个流批一体化的系统。

实时的 DWD 和离线的 DWD 通过 Dataphin 的逻辑表进行映射,在 Dataphin 上开发具体的 SQL 任务后, Dataphin 会将其翻译成 Flink 的流任务和批任务。在此基础上,结合 D2 的 Dataworks,根据每一个调度将每天的 T+1 任务触发,最终将数据回写到 OLAP 集群中。通过 OLAP 集群的 Binlog 来驱动下游的实时消费。这样下游的 ADS 层只需进行现有指标的简单统计或行列转化后将数据写入各自的存储以满足不同查询场景的使用和需求。

完成这条链路后,整体的核心资产消费链路和研发效率得到了提升,数据一致性也得到了保障。然而,仍然存在一些问题。例如它主要支持存量的重要业务,对于一些新兴业务这条链路并不适用。另外这链路并未完全实现流批一体化的目标。在 DWD 层数据实际上还是有两份存储,一份在 TT,一份在 ODPS。

此外,实时中间层更多使用的是 TT,但 TT 不支持检索和更新。在研发或数据订正的过程中,这会带来较高的成本。同时,TT 也不支持列裁剪。以流量中间层为例每次消费都会产生大量的带宽费用。再者,OLAP 集群内表存储成本往往比较高。因此,无论是从降低成本还是提升效率的角度来看,我们都希望引入更好的数据架构。因此,我们找到了当前比较热门的解决方案 —— Streaming Lakehouse。

二、实时湖仓方案选型与探索

那么我们想引入 Streaming Lakehouse 要如何实施呢?首先要做的就是具体的选型和探索落地的实践。

1、选型与测评方案

在整个选型过程中,使用了饿了么最核心的交易、营销和流量三个域的明细数据作为测试数据,并将数据写入对应的湖存储格式中。我们当时评测选择了 Paimon + Hudi 这两种湖格式。为了方便整体验证还与现有的 OLAP 集群的内表方案进行对比。

在 OLAP 引擎方面,主要引入了 StarRocks、Trino 引擎进行对比。在存储层,我们主要关注数据写入后的膨胀系数、流读和流写的性能,以及端到端的写入延迟。在 OLAP 部分,我们重点关注查询的耗时和单次查询的开销。

上图左边展示了我们在整个评测中所使用的版本。整体使用的集群规模大约为 200CU。由于规格的原因, StarRocks 的集群总共是 192CU。在这些组件中,大家比较关注的 StarRocks 和 Trino 我们是直接采用了阿里云的 EMR 5.15.1 版本进行部署的。

2、Paimon VS Hudi

Paimon 和 Hudi 哪个更优呢?

图中左上角展示了经过多轮测试后得出的结果,整体排名基本上都是 Paimon 优于 Hudi。同时,Paimon 的性能也接近 OLAP 集群内表方案的查询性能。但是在端到端的时效性方面,OLAP 集群内表方案仍然是最快,可以达到秒级别。Paimon 的时效性测试结果大约在1到5分钟,平均约为3分钟。Hudi 在这一块的延迟一般在10分钟左右。

基于上述测评结果,选择 Paimon 作为后续的湖存储格式。结合前面提到的三个月具体场景,上图可以看到对应的 Paimon 表的创建方式。对于交易和营销数据,由于需要实时更新,因此我们使用了一个PK表,指定了 Bucket 并同时开启了 ZSTD 压缩。在这个过程中,还需要通过 Sequence Field 进行版本控制。流量表则是一个 Append Only 表,基本上设置为 Bucket=-1,以支持自动化扩展。同时为了保障读写的性能平衡,所以每一个文件大概需要控制在一个 GB 范围内。

3、StarRocks VS Trino

在对比 StarRocks、Trino 的性能时,StarRocks 在各个方面都表现比较出色。是什么原因使得 StarRocks 的性能如此出色呢?首先,StarRocks 的 JNI Connector 对 Paimon 进行了良好的适配。其次,StarRocks 支持过滤下推。上图右下展示了饿了么基于 StarRocks 的一个 profile 截图,可以看到 “city_id” 和 “is_valid_order” 这两个字段实现了有效的下推。此外,StarRocks 还具备高效的向量化执行引擎,并且可支持对 Paimon 的 RO 表进行查询。最后,虽然我们目前还没有正式使用物化视图 +SQL 透明改写和 Data Cache 这两个功能,但可以预见一旦投入使用性能将会进一步提升。在这样的背景下,饿了么最终选择使用 StarRocks 和 Paimon 作为湖仓解决方案。

4、实时湖仓落地探索

经过多次探索,我们确定了如上图所示的湖仓建设架构。主要的数据处理链路使用 Flink 进行 Paimon 的流读流写,Paimon 的数据存储在内部 OSS 集群上,并通过 DLF(Data Lake Formation)进行元数据管理。通过 Paimon 的流读流写功能,支持实时数仓的分层建模。在特定场景下,利用 StarRocks 的物化视图进行应用层或汇总层的计算。同时基于明细数据通过 StarRocks 和 Hologres 的数据湖外表查询能力支持自助洞察分析的需求。具体应用场景包括:流量宝洞察分析、实时交易补贴自助分析以及客满的服务大屏等。

5、落地探索-DWD自助分析

接下来主要介绍基于交易和补贴的自助分析场景。首先,数据源提供订单流和补贴流两个实时流。在传统方案中,这两个流在Flink任务中进行双流 Join 处理后写入 OLAP 集群内表,再基于 OLAP 集群内表提供自助分析服务。引入 Paimon 之后,两条流直接写 Paimon 的 Partial-update 表,指定不同流中的 Sequence Group 来进行对应字段的版本控制。在这种情场景下,整体 Flink 的资源开销相比原来的双流 Join 方案减少了大约50%,同时系统的整体稳定性也显著提升。

然后在 StarRocks 这一层,通过 StarRocks 来读 Paimon 外表这块来支持的。上图右上角是整体的 Profile 的结果,可以看到大部分的瓶颈其实还是在 IO 这一层的。所以后续如果做数据湖的加速分析的话,IO 这一层还是优化的重点。

上图右下角展示了整个自助分析的结果示意图。与之前基于 OLAP 集群内表的实时数仓方案相比,这个方案在写入时效性上牺牲了1到5分钟,同时单次查询的耗时增加了约5%。然而,整体存储成本较原有的 OLAP 集群内表减少了约90%,Flink 任务的资源开销也减少了大约50%。

三、实时湖仓规划及展望

1、实时数仓3.0 展望

如果建设了实时湖仓,后续的加工链路可以进一步丰富,从而构建不同场景下的数据解决方案。相比之前的实时数仓2.0版本,DWD 层和 TT 层将逐步替换为数据湖。使用数据湖后,可以针对低频场景构建准实时或实时的物化视图,通过物化视图进行分层建模。同时,还可以利用 Paimon + Flink 的流读流写能力进行分层建模。在数据服务层,可以根据业务需求按需查询对应的 DWD、DWS 或 ADS 层,从而构建多元化的数据交付方案。

具体的交付方案如上图左下角所示,不同场景可以选择不同的交付方案,利用现有的实时数据资产,提升研发效率。然而这边仍会遇到一些问题:OSS 带宽瓶颈在压测过程中已经显现出来需要解决,同时 OSS 上的小文件问题也是亟需解决的。Paimon 的时效性目前为1到5分钟,对于强时效性诉求的业务仍需要保留 TT 链路。虽然 Paimon 和 StarRocks 现有的元数据可以通过 DLF 管理,但与内部原有的元数据管理缺乏打通,需要进一步拓展。此外,目前集群的权限控制相对较弱的,需要进行强化。

右边展示了后续希望重点推进的几个方面。首先是 StarRocks 物化视图,之前进行了轻度测试,因遇到一些问题,暂时未能显著提升研发效率,未来希望重点完善这一方案。此外,在 Flink 写入 Paimon 时,常因 Compaction 问题导致显著抖动,计划采用异步 Compaction 机制,以保障整个实施链路的稳定性。此外,诸如期望引入 Deletion Vector,显著提升查询效率。

目前,Paimon 实时中间层已应用于一些核心链路,未来希望将其推广到更多数据场景。还计划与 DataWorks 和 MaxCompute 进行集成,这属于生态系统建设的一部分。在 OSS 方面,我们希望通过冷热分层能力进一步降低成本。之前尝试结合 Paimon 的 Tag 机制来实现这一目标,但暂时还未找到理想的解决方案。

2、回顾

最后回顾一下饿了么整体实时数仓的建设历程,大致可以分为几个阶段。首先是相对原始的开发阶段,这一阶段主要建设实时的 DWD 层,各个应用层通过 Flink 任务各自生成自己的 ADS 数据。在这一过程中,ADS 层出现了大量数据一致性问题和重复开发的问题。为了解决这些问题,我们构建了实时的 CDM 层,从而解决了共性问题。然而,对于新增业务和场景的支持仍显不足。因此,我们引入了实时湖仓方案。虽然该方案目前仍在探索阶段,但已经在一些具体场景中实现了落地。未来,我们希望在 Paimon 和 StarRocks 上进行更多的探索和应用。

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

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

相关文章

GHOST重装后DEF盘数据救援指南

一、现象解析:GHOST重装后的DEF盘失踪之谜 在计算机维护的日常中,GHOST重装因其快速便捷的特点,成为众多用户解决系统问题的首选方法。然而,这一操作虽能迅速恢复系统至初始状态,却也暗藏风险,尤其是当不慎…

火语言RPA流程组件介绍--单选/复选框

🚩【组件功能】:勾选页面单选/复选框元素 配置预览 配置说明 丨目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath,指定对应网页元素作为操作目标 丨操作 对目标元素进行的勾…

分布式中间件-redis相关概念介绍

文章目录 什么是redis?示意图Redis的主要特点Redis的主要用途Redis的工作原理Redis的持久化与备份 redis 6.x新增特性多线程数据加载客户端缓存新的 RESP 3 协议支持ACL(Access Control List)功能新增数据类型性能改进配置文件的改进其他改进 redis数据…

MySQL:表中的数据类型

数值类型 int类型 int类型包含以下五种: 类型大小tinyint1 bytesmallint2 bytemediumint3 byteint4 bytebigint8 byte 表t1的num列的类型就是tinyint,我们尝试对其插入数据,来测试其范围。tinynt占1 byte,那么就可以表示256个数…

opengl学习6

理解glVertexAttribPointer()函数 OpenGL glVertexAttribPointer()函数解析-CSDN博客 难理解的是最后一个参数。 这个参数指明了,顶点属性的数据从哪里获取。 # 如果是(void*) 0,则表示数据从已绑定的VBO中获取,从…

Flutter Web首次加载时添加动画

前言 现在web上线后首次加载会很慢&#xff0c;要5秒以上&#xff0c;并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;justify-content: center;ali…

使用Ubuntu耳机输出正弦波信号

最近有一个项目想使用喇叭发出一个标准的正弦波测试信号&#xff0c;故记录下操作过程 sudo apt install libasound2-dev 否则有可能会报错&#xff1a; alsaaudio.c:28:10: fatal error: alsa/asoundlib.h: No such file or directory 安装pyalsaaudio&#xff1a; pip …

《 C++ 修炼全景指南:六 》深入探索 C++ 标准库中的 stack 与 queue 容器适配器

1、引言 1.1、容器适配器的概念与应用 容器适配器&#xff08;Container Adapters&#xff09;是 C 标准库提供的一种特殊容器&#xff0c;它不是一种独立的容器&#xff0c;而是对其他标准容器的封装&#xff0c;用来实现特定的数据结构如栈&#xff08;stack&#xff09;和…

【成品论文】2024年华为杯研赛D题成品论文获取入口

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击文末的卡片&#xff0c;那是获取资料的入口! 现分享2023年华为杯研赛D题成品论文&#xff08;部分&#xff09;&#xff0c;供大家学习&#xff1a; 题 目&#xff1a; ____区域双碳目标与路径规划研究 …

MySQL之安装与基础知识

目录 一&#xff1a;在centos7上安装MySQL数据库 1.卸载默认存在的环境 2.配置mysql的yum源 3. 安装MySQL 4.登录mysql 5.设置MySQL的配置文件 二&#xff1a;MySQL基础知识 1.什么是数据库 2.主流数据库 3.服务器&#xff0c;数据库&#xff0c;表关系及使用案例 4…

function uuid_generate_v4()不存在

说明&#xff1a;记录一次使用postgresql函数错误&#xff0c;如下&#xff1a; 项目中的一个SQL用到了uuid_generate_v4()函数生成uuid作为记录的主键&#xff0c;结果报上面这个错误&#xff1b; 分析&排查 首先&#xff0c;我连接上了数据库&#xff0c;在数据库里敲下…

《论网络安全体系设计》写作框架,软考高级系统架构设计师

论文真题 随着社会信息化的普及&#xff0c;计算机网络已经在各行各业得到了广泛的应用。目前&#xff0c;绝大多数业务处理几乎完全依赖计算机和网络执行&#xff0c;各种重要数据如政府文件、工资档案、财务账目和人事档案等均依赖计算机和网络进行存储与传输。另一方面&…

ThreeJs创建圆环

ThreeJs除了创建基本的长方体&#xff0c;球形&#xff0c;圆柱等几何体&#xff0c;也可以创建一些特殊的几何体&#xff0c;比如圆环&#xff0c;多边体&#xff0c;这节就来讲怎么用Threejs绘制出圆环。首先依然是要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&a…

如何理解Configurational entropy

Configurational entropy 是热力学和统计力学中的一个重要概念&#xff0c;它描述的是系统中由于其微观状态排列&#xff08;即配置&#xff09;导致的不确定性或混乱程度。不同于热力学中的热熵&#xff08;thermal entropy&#xff09;&#xff0c;它特指那些与系统中的粒子、…

8.6小波变换(Wavelet Transform)边缘检测

实验原理 由于OpenCV本身并不直接支持小波变换&#xff08;Wavelet Transform&#xff09;&#xff0c;我们需要借助一些技巧来实现它。一种常见的方法是利用离散余弦变换&#xff08;DCT&#xff09;或离散傅立叶变换&#xff08;DFT&#xff09;来近似实现小波变换的功能。但…

Spring的核心思想

目录 一、Spring要解决的问题 二、Spring的核心结构 三、核心思想 3.1.1 什么是IOC 3.1.2 IOC解决的问题&#xff1a;耦合 3.1.3 IOC和DI的区别 3.2.1 什么是AOP 3.2.2 AOP解决的问题&#xff1a;耦合 3.2.3 为什么叫做面向切面编程 一、Spring要解决的问题 问题1&am…

道路检测-目标检测数据集(包括VOC格式、YOLO格式)

道路检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nDwTmZxH_BQrVTj9MzUgDg?pwd3zh7 提取码&#xff1a;3zh7 数据集信息介绍&#xff1a; 共有 3321张图像和一一对应的标注文件 标注文…

Excel 国产化替换新方案

前言 在当前数字化转型和信创&#xff08;信息技术应用创新&#xff09;战略背景下&#xff0c;企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件&#xff0c;SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…

衡石分析平台使用手册-通用配置文档

配置文件​ 配置文件中存放 HENGSHI SENSE 的配置参数&#xff0c;可以通过修改配置文件来改变 HENGSHI SENSE 的服务方式。 配置文件说明​ 配置文件存放在 conf 路径下&#xff0c;包含 hengshi-sense-env.sh 和 engine-segment-hosts 两个文件。其中 engine-segment-host…

Qt与VS打包命令

一 QT 将程序编译生成的可执行文件&#xff08;.exe&#xff09;放到一个干净的文件夹。找到QT安装目录&#xff0c;进入编译版本的bin目录&#xff0c;找到windeployqt.exe&#xff0c;在文件访问路径栏的最前边&#xff0c;添加“cmd ”进入控制台。控制台命令&#xff1a; …