基于 Flink SQL 和 Paimon 构建流式湖仓新方案

news2024/11/15 23:21:41

本文整理自阿里云智能开源表存储负责人,Founder of Paimon,Flink PMC 成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为四部分:

  • 数据分析架构演进
  • 介绍 Apache Paimon
  • Flink + Paimon 流式湖仓
  • 流式湖仓Demo演示

数据分析架构演进

图片

目前,数据分析架构正在从Hive到Lakehouse的演变。传统数仓包括Hive、Hadoop正在往湖、Lakehouse 架构上演进,Lakehouse 架构包括Presto、Spark、OSS,湖格式 (Delta、Hudi、Iceberg) 等等架构,这是现在比较大的趋势。Lakehouse 架构包含了诸多新能力。

首先OSS比起传统的HDFS有了更加弹性、更加计算存储分离的能力。而且OSS还有热冷存储分离能力,数据可以归档到冷存,你会发现它的冷存储非常便宜,给了你存储的灵活性。

再往上会发现这些湖格式有着一些好处。具体是哪些好处呢?

第一点操作方便,湖格式有ACID、Time Travel、Schema Evolution,这些可以让你有更好的管控能力。

第二个可能查询更快,比如说plan阶段会耗时更短,Hive在超大数据量、超多文件的时候会有一些查询的问题。所以湖格式在这方面也会解决得更好。

上面的两个好处不一定能打动公司的决策人,其实也不是每家公司都在升级或者都已经升级,其中一个大的原因就是大家虽然说Hive老了,但它还是能再战一战的,因为前面这两个好处不一定对于每家公司都是刚需。大量的公司都还是继续用Hive,也许底下的存储换成OSS (或者OSS-HDFS) ,但还是老的Hive那套。

举例来说,现在已经有了运行稳定的火车,现在可以把它升级一下,增加餐车,装潢一遍,切分成更多节更灵活,但是需要升级为新的一套架构,你愿意冒着风险升级吗?但是如果能升级成高铁动车呢?

所以我要介绍左边第三个好处。Lakehouse可以做到时效性更好。

时效性更好不一定是所有业务都需要更好的时效性,都要从天到达分钟级,而是你可以选择其中某些数据进行实时化升级,还可以选择某些时间进行实时化,主流数据仍然是离线状态。

时效性更好可能会给你的一些业务带来真正的改变,甚至说对于你的架构能带来大幅的简化,让整个数仓更稳定。

图片

时效性在计算领域的领头羊是Apache Flink。刚才说提升时效性是Lakehouse下一步的发展重点,现在要做的就是把Streaming计算标准技术也就是Apache Flink带到Lakehouse架构当中。

所以前几年我们也做有很多相关的探索,包括在Iceberg和Hudi上的投入,都成功地把Flink和Iceberg的对接、和Hudi的对接打磨出来。但是可能打磨得效果也没有那么好,如果大家用过Flink + Iceberg或者Flink + Hudi可能也有一些吐槽。关键问题在于,Iceberg 和 Hudi 都是面向 Spark、面向离线而生的数据湖技术,与实时和 Flink 有着不太好的匹配。

所以我们研发了新型数据湖格式 Apache Paimon,它是一个流式数据湖格式。我们分析一下数据湖四剑客有什么样的历史和初衷。

图片

Apache Iceberg 和 Delta Lake,他们其实是对传统Hive格式的一种升级。本质上还是面向Append数据的处理,在离线数仓T+1的分析上比起Hive更有优势和更方便的使用,更多还是面向传统的离线处理。

Apache Hudi其实是在Hive的基础上提供增量更新的能力,这是它的初衷。它的基础架构还是面向全增量合并的方式,Flink 的集成不如 Spark,一些功能只在Spark有,Flink没有。

Apache Paimon是从Flink社区中孵化出来的,面向流设计的数据湖,目的就是支持大规模更新和真正的流读。

流和湖的结合难点其实在更新。如果大家对Flink比较熟悉,Flink SQL 成功的原因之一是它真正对Changelog做出了原生的处理,这个changelog本身就是一种更新。

Iceberg、Hudi、Delta是因为他们都是面向批处理、Spark的增量 + 全量的方式。一旦需要涉及到合并就是增量数据和全量数据的一次超大合并。相当有全量10 TB,增量哪怕1 GB也可能会涉及到所有文件的合并,这10个TB的数据要全部重写一次,然后合并才算完成,合并的代价非常大。

图片

右边是面向更新的技术,LSM,全名是Log Structured Merge-Tree,这种格式在实时领域已经被大量的各种数据库应用起来,包括 RocksDB、Clickhouse、Doris、StarRocks 等等。

LSM带来的变化是每次合并都可能是局部的。每次合并只用按照一定的策略来merge数据即可,这种格式能真正在成本、新鲜度和查询延时的三角trade-off中可以做到更强,而且在三角当中可以根据不同的参数做不一样的trade-off的选择。

介绍 Apache Paimon

我们刚刚介绍了演进的过程,需要Flink + 湖存储来做Flink Lakehouse,也介绍了难点。第二部分就介绍一下Apache Paimon。

图片

Apache Paimon是什么样的东西?你可以简单认为基础的架构就是湖存储+ LSM的结合,对于湖存储来说基本的能力是写和读。Apache Paimon在这个基础上和Flink做了更深度的集成,各种 CDC 数据可以通过Flink CDC做到 Schema Evolution 和整库同步地把数据同步到Paimon中。

也可以通过Flink、Spark、Hive、宽表合并的方式或者通过批写覆盖的方式写到Paimon中,这是基本的 Lakehouse能力。也可以在后面批读,通过Flink、Spark、StrarRocks、Trino做一些分析,也可以这里通过Flink来流读Paimon里面的数据,流读生成的 Changelog,流读方面的特性,后面我也会介绍。

图片

这是Paimon的架构图,这主要是Paimon流式一体实时数据湖大致的发展历程。最开始在2022年初发现了开源社区技术上的一块缺失,所以在Flink社区提出了Flink Table Store。直到2023年1月发布了第一个稳定的版本0.3,3月份进入Apache孵化器。今年9月份发布了Paimon 0.5版本,这是Paimon全面成熟的版本,包括CDC入湖和Append数据处理。

图片

我们也在阿里云上测试Apache Paimon和Hudi的性能,测试湖存储的 MergeOnRead 的更新性能,可以看到左边是大致是5亿条数据入湖,按照类似的配置、相同的索引来入湖,我们来评估5亿条入湖需要多少时间。经过测试发现Paimon入湖的过程中,吞吐或者耗时能达到Hudi的4倍,但是查询相同的数据,发现Paimon的查询性能是Hudi的10倍甚至20倍,Hudi 还会碰到因内存变小而无法读取的情况。

为什么呢?我们分析到,Hudi MOR是纯Append,虽然后台有compaction,但是完全不等Compaction。所以在测试中Hudi的Compaction只做了一点点,读取的时候性能特别差。

基于这点,我们也做了右边的benchmark,就是1亿条数据的CopyOnWrite,来测试合并性能,测试CopyOnWrite情况下的 compaction 性能。测试的结果是发现不管是2分钟、1分钟还是30秒,Paimon性能都是大幅领先的,是12倍的性能差距。在30秒的时候,Hudi跑不出来,Paimon还是能比较正常地跑出来。

图片

所以回过头来,我希望通过这三句话的关键词来描述Paimon能做到什么。

第一,低延时、低成本的流式数据湖。如果你有用过Hudi,我们希望你替换到Paimon之后以1/3的资源来运行它。

第二,使用简单、入湖简单、开发效率高。可以轻松地把数据库的数据以CDC的方式同步到数据湖Paimon中。

与Flink集成强大,数据流起来。

Flink + Paimon 流式湖仓

第一部分讲了数据架构演进,就是我们为什么要做Paimon,第二部分介绍Paimon能干什么,有哪些集成、优势,性能上表现如何。接下来第三部分就是Flink + Paimon怎么构建流式湖仓。

图片

首先我们看一个大致的图,其实流式湖仓本质还是一个湖仓,湖仓能干什么?最基本的就是批写、批读,能比起传统的Hive数仓有更好的优势。在这个基础上要提供一个强大的流式数据更新入湖以及流式数据增量数据的流读,达到全链路的实时化、流批一体化,难点就是流式更新和流读。

图片

一个最典型的流式湖仓能解决的场景,Hive上CDC数据,也就是从MySQL、传统数据库的数据、CDC数据能流到仓或者湖中的链路。这是一个比较陈旧,但是也是大量在企业中被应用的架构图。

你可能在第一次运行的时候或者按需通过全量同步的方式同步到Hive全量分区表中,成为一个分区。接下来每天要通过增量同步的方式同步到kafka中,通过定时回流的方式把增量的CDC数据同步成Hive中的一个增量表。每天晚上同步完后,大概0点10分的时候就可以做一个增量表和全量表的合并,合并之后形成新的分区就是MySQL新一天的全量。

通过这样的技术可以看到它的产出时延是非常高的,至少需要T+1,并且还要等增量数据和全量数据合并。而且全量增量是割裂的,存储也非常浪费。你可以看到Hive全量表每个分区就是一个全量的数据,你要存100天的数据就至少是100倍的存储。

第三也是链路非常长,非常复杂,涉及到各种各样好几个技术,在真实的业务场景中非常容易遇到的就是这个产出,哪个组件有问题,数据产出不了,导致后面一系列的离线作业跑不了。所以这里描述的就是三高,时延高、成本高、链路复杂度高。

图片

切到Flink+Paimon的流式CDC更新,我们希望把架构做得非常简单,不用Hive的分区表,只要定义Paimon的主键表,不分区。它的定义就非常像MySQL表的定义。

通过Flink CDC、Flink作业把CDC数据全增量一体到Paimon中就够了,就可以实时看到这张表的状态,并且实时地查到这张表。数据被实时的同步,但是离线数仓是需要每天的view,Paimon要提供Tag技术。今天打了一个Tag就记住了今天的状态,每次读到这个Tag都是相同的数据,这个状态是不可变的。所以通过Tag技术能等同取代Hive全量表分区的作用,Flink、Spark可以通过Time Travel的语法访问到Tag的数据。

传统的Hive表那是分区表,Hive SQL也没有Time Travel的语义,怎么办?在Paimon中也提供了Tag映射成Hive分区表的能力,还是可以在Hive SQL中通过分区查询,查询多天的数据。Hive SQL是完全兼容一行不改的状态来查询到Paimon的组件表,所以经过这样的架构改造之后,你可以看到整个数据分钟级实时可见,各整个全增量一体化,存储是复用,比较简单稳定而且一键同步,这里不管是存储成本还是计算成本都可以大幅降低。

存储成本通过Paimon的文件复用机制,你会发现打十天的Tag其实存储成本只有一两天的全量成本,所以保留100天的分区,最后存储成本可以达到50倍的节省。

在计算成本上虽然需要维护24小时都在跑的流作业,但是你可以通过Paimon的异步compaction的方式,尽可能地缩小同步的资源消耗,甚至Paimon也提供整库同步的类似功能给到你,可以通过一个作业同步上百张或者几百张表。所以整个链路能做到三低:时延低、成本低和链路复杂度低。

接下来介绍两个流读。大家可能觉得Paimon是为实时而生的,更好地流读,其实没有什么实感。包括Hudi、Iceberg也能流读,我在这里通过两个机制来说明Paimon在数据流读上做了大量的工作。

图片

Consumer机制。如果没有这个能力,经常流读的时候碰到非常头疼的东西就是FileNotFoundException,这个机制是什么样的呢?因为我们在数据产出过程当中,需要不断地产生Snapshot。太多的Snapshot会导致大量的文件、导致数据存储非常地冗余,所以需要有Snapshot的清理机制。但是另外流读的作业可不知道这些,万一我正在流读的Snapshot被Snapshot Expiration给删了,那不就会出现FileNotFoundException,怎么办?而且更为严重的是,流读作业可能会failover,万一它挂了2个小时,重新恢复后,它正在流读的 snapshot 已经被删除了,再也恢复不了。

所以Paimon在这里提出了consumer机制。consumer机制就是在Paimon里用了这个机制之后,会在文件系统中记一个进度,当我再读这个Snapshot,Expiration就不会删这个Snapshot,它能保证这个流读的安全,也能做到像类似 kafka group id 流读进度的保存。重启一个作业无状态恢复还是这个进度。所以consumer机制可以说是流读的基本机制。

图片

第二,Changelog生成。假设有这样一张Paimon的PK表,key是名字,Value是count,上游在不断地流写,下游在不断地流读。流写可能会同一个组件写相同的数据,比如说先前写的jason是1,后面又写一个jason是2。你会发现流读的作业在做一个正确流处理的时候,比如说做一个sum,sum结果应该是2还是3,如果没有这个changelog的生成就不知道这是同一个主键,我要先把jason -> 1给retract掉,再写jason -> 2。所以这里也对我们湖存储本身要表现得像一个数据库生成binlog的方式,下游的流读计算才能更好、更准确。

changelog生成有哪些技术呢?在Flink实时流计算中,大家如果写过作业的话,也可能写过大量用State的方式来去重。但是这样的方式state的成本比较高,而且数据会存储多份,一致性也很难保障。或者你可以通过全量合并的方式,比如说Delta、Hudi、Paimon都提供了这样的方式,可以在全量合并的时候生成对应的changelog,这个可以,但是每次生成changelog都需要全量合并,这个代价也会非常大。

第三,Paimon这边独有的方式,它有chagelog-producer=lookup,因为它是LSM。LSM是有点查的能力,所以你可以配置这样一个点查的方式在写入的时候能通过批量高效率的点查生成对应的chanelog让下游的流处理能够正确地流处理。

上面两个部分就是Paimon的更新和流读。流式湖仓面向流批一体的Flink的流批一体。之前是流批一体的计算,现在有了存储以后是流批一体的计算 + 流批一体的存储。

但是,有同学在用阿里云 Serverless Flink发现没有批的基本能力:调度和工作流?

流式湖仓不仅要解决流的能力,还需要解决批的离线处理能力,批是湖仓的基础,流只是在这个流式湖仓中真正的流可能只有10%、20%,并不是整个湖仓的全部。所以Flink的流批一体离不开Flink的真正批处理。

图片

大家也可以看到流式湖仓的图里,可能需要4个步骤来处理数据。

第一步是一键入湖,通过Flink CTAS/CDAS一键入湖。

第二步里面Pipeline全链路实时化是流起来的,所以需要我对存储有流读流写的能力。

第三步就是这些数据全都是可以通过开放分析引擎来分析到数据。

第四步就是湖仓本质的东西批读批写,在产品上需要的东西基本上就是调度、工作流。

大家期待已久,阿里云 Serverless Flink也正式迎来了产品上的调度和工作流的能力,能让你在Serverless Flink达到真正的完整批处理链路的能力。

接下来我就想通过一个准实时流式湖仓的案例,是电商的数据分析。通过Flink实时入湖入到ODS层Paimon表,通过流式流起来流到DWD,再流到DWM,再到DWS,这样一整套完整的流式湖仓。

图片

流式湖仓Demo演示

Demo演示观看地址:

https://yunqi.aliyun.com/2023/subforum/YQ-Club-0044

开源大数据专场回放视频 01:52:42 - 01:59:00 时间段

Serverless Flink不只有流ETL的能力,现在也有一个比较完善的批处理方式,以前可能是流在一个开发平台,批在一个开发平台,非常地割裂,现在能做到的是整个开发平台都可以在Serverless Flink上,整个计算引擎可以是 Flink Unified的,而且底下的存储都是Unified的一套Paimon存储,完成离线处理以及实时处理或者准实时处理的能力,能达到从开发到计算和存储的完整Unified方案。批处理的版本即将发布,大家有需要可以联系我们提前试用。

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

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

相关文章

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道,指针变量也是变量,它也有自己的地址,使用什…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题,定义let that this 解决

【外贸商机篇】黑色星期五来啦,跨境电商必备手册!

黑色星期五是每年11月的第四个星期五,三天后是网络星期一。这两个购物日是美国一年中最繁忙的购物日之一,仅在2021年的感恩节周末,电子商务收入估计就达到196亿美元。 在一项Statista调查中,美国消费者被问及他们计划购买哪些商品…

自由飞翔之小鸟

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类(运行游戏) package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier(障…

Python基础:生成器(Generators)和生成器表达式(Generator Expressions)详解

生成器(Generators)和 生成器表达式(Generator Expressions)是 Python 中用于处理迭代器和序列数据的强大工具。它们允许你按需生成值,而不是一次性生成所有值,从而节省内存和提高性能。 1. 生成器&#x…

前缀和——724. 寻找数组的中心下标

文章目录 🍓1. 题目🫒2. 算法原理🦄解法一:暴力枚举🦄解法二:前缀和 🥔3. 代码实现 🍓1. 题目 题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode&#xff0…

【一文搞定】在Docker中搭建centos7远程桌面环境(Xfce、Gnome两种方式)

目录 前言一、基于GNOME构建远程桌面二、基于Xfce构建远程桌面(轻量级) 前言 本文提供两种安装方式,均自己测试过,最后还是选择了Xfce,因为它比较轻量级,占用资源较少。大家也可以都试试,比较感…

idea 26 个天花板技巧

1、 查看代码历史版本;2、 调整idea的虚拟内存:;3、 idea设置成eclipse的快捷键;4、 设置提示词忽略大小写;5、 关闭代码检查;6、 设置文档注释模板;7、 显示方法分隔符;8、 设置多行…

【大神支招】3步,打造一张BI报表

随着BI报表的高效直观、灵活分析的特点越来越被大家所熟知,很多BI零基础的用户可积极尝试制作BI报表,以达到灵活自助分析、高效智能分析的效果。那么BI报表零基础的小白们该怎么做BI报表,才能又快又好地做出来? 大神支招&#xf…

Authing 入选《 2023 年央国企信创应用与实践研究报告》优秀服务商

11 月 21 日,Authing 身份云作为国内唯一事件驱动云原生身份平台入选《 2023 年央国企信创应用与实践研究报告》优秀服务商,该报告由第一新声研究院合伙人、Gartner 前高管合伙人/副总裁李长华牵头指导,第一新声创始人兼 CEO 组织&#xff0c…

畅捷通T6 客户端登录提示 运行时错误 372 加载控件cfloatmenu失败

客户单win10电脑, T6版本是 V7.1 不知道操作了什么每个电脑提示 运行时错误372: 从加载控件CFloatMenu失败。您的版本可能已过期。确认您使用的控件版本是同您的应用程序一起提供的。 ******* 解决办法: 找个其他电脑复制mscomctl.ocx 到操作系统目录里面注册一下,即可. …

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置: Function.c及Function.h: #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

【Unity】 UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

1. 什么是PhysicsRaycaster组件? PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。 2. PhysicsRaycaster的工作原理 PhysicsRaycast…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点,通过工频滤波、基线滤波和肌电滤波等处理,能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接,实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

Python函数式编程:让你的代码更优雅更简洁

概要 函数式编程(Functional Programming)是一种编程范式,它将计算视为函数的求值,并且避免使用可变状态和循环。 函数式编程强调的是函数的计算,而不是它的副作用。 在函数式编程中,函数是第一类公民&a…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见,经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别,oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多,这就导致数据…

springboot使用redis缓存乱码(key或者 value 乱码)一招解决

如果查看redis中的值是这样 创建一个配置类就可以解决 package com.deka.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; i…

2024年的云趋势:云计算的前景如何?

本文讨论了2024年云计算的发展趋势。 适应复杂的生态系统、提供实时功能、优先考虑安全性和确保可持续性的需求正在引领云计算之船。多样化的工作负载允许探索通用的公共云基础设施范例之外的选项。由于需要降低成本、提高灵活性和降低风险,混合云和多云系统越来越受…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…

机器学习之危险品车辆目标检测

危险品的运输涉及从离开仓库到由车辆运输到目的地的风险。监控事故、车辆运动动态以及车辆通过特定区域的频率对于监督车辆运输危险品的过程至关重要。 在线工具推荐: 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数…