本文基于 Apache Flink 1.16 和 Apache Paimon 1.0.1,详细介绍如何配置 Paimon 环境、创建和使用追加表(Append-Only Table)与主键表(Primary-Key IDEA 环境准备下载官方paimon-1.0.1版本,本地编译选择对应的flink版本把对应的jar包安装到本地仓库:mvn install:install-file -DgroupId=org.apache.paimon -DartifactId=paimon-flink-1.16 -Dversion=1.0.1 -Dpackaging=jar -Dfile=paimon-flink-1.16-1.0.1.jar在工程里引用对应的依赖 <dependency> <groupId>org.apache.paimon</groupId> <artifactId>paimon-flink " 'type'='paimon',\n" + " 'warehouse'='file:///tmp/paimon'\n" +
前言Paimon的前身是Flink-Table-Store,希望提供流批一体的存储,提供一定的OLAP查询能力(基于列式存储),做到毫秒级别的实时流式读取。 如果我们希望深度使用Paimon,并充分利用Paimon的特性,那么了解Flilnk写入Paimon的过程十分重要,本文希望通过源码分析的方式带大家充分了解Flink写入Paimon的完整过程。2. Flink写入Paimon的完整流程Paimon表的写入是通过FlinkTableSink实现DynamicTableSink接口来写入数据,核心逻辑位于getSinkRuntimeProvider方法中 最后本文通过跟读源码的方式对Flink写入Paimon的核心流程进行了解析,相信通过对Flink写入Paimon流程细节的梳理,对理解Paimon的特性及性能优化都是有极大的助力。 当然,本文由于篇幅有限,没有对Flink和Paimon架构和概念进行详细的介绍,同时对Flink写入Paimon的Compact过程及性能优化也没有涉及,后续会加上这些方面的解析。
从Demo入手,了解Paimon/Flink项目搭建的全过程。记录下采坑之旅。 创建Flink项目 在IDEA中创建Flink项目,由于没有Flink的archetype,因此需要手动创建一下。 的webui 高版本的Flink中已经没有bat脚本,可参考 flink新版本无bat启动文件的解决办法 补充缺失的依赖 Flink的框架搭建好之后,参考 新一代数据湖存储技术Apache Paimon 入门Demo 写一个简单的Paimon程序。 flink-table-api-java-bridge</artifactId> <version>1.18.0</version> </dependency> <dependency> <groupId>org.apache.paimon </groupId> <artifactId>paimon-flink-1.18</artifactId> <version>0.6.0-incubating</version> </dependency
翻译自 Apache Paimon官方文档 概览 概述 Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力 Paimon提供以下核心功能: 统一批处理和流式处理:Paimon支持批量写入和批量读取,以及流式写入更改和流式读取表change log。 数据湖:Paimon作为数据湖存储,具有成本低、可靠性高、元数据可扩展等优点。 Merge Engines:Paimon支持丰富的合并引擎(Merge Engines)。 Paimon 文件以分层方式组织。 下图说明了文件布局。 从snapshot文件开始,Paimon reader可以递归地访问表中的所有记录。 目前,Paimon 支持使用 orc(默认)、parquet 和 avro 作为数据文件格式。 LSM-Trees Paimon 采用 LSM 树(日志结构合并树)作为文件存储的数据结构。
还可以通过 paimon 中的 flink 操作在 flink 中启动压缩作业,并通过 set write-only 禁用所有其他压缩。 另外,写入失败会引入孤儿文件,这无疑增加了维护paimon的成本。 我们需要尽可能避免这个问题。 当使用此kafka源写入Paimon表时,Paimon表的快照将生成相应的watermark,以便流式读取此Paimon表时可以使用有界watermark的功能。 a bounded streaming job to read paimon_table SELECT * FROM paimon_table /*+ OPTIONS('scan.bounded.watermark 的 Append 表处理 Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座
catalog CREATE CATALOG paimon WITH ( 'type' = 'paimon', 'metastore' = 'hive', 'uri' = 'thrift ://localhost:9083', 'warehouse' = 'hdfs://paimon', 'table.type' = 'EXTERNAL' ); --创建Partial update结果表 CREATE TABLE if not EXISTS paimon.dw.order_detail ( `order_id` string, `product_type /*+ OPTIONS ('scan.mode'='latest') */ ; 完整的Changlog Paimon中的表被多流填充数据且打宽维度后,支持流读、批读的方式提供完整的Changelog Changelog-Producer Paimon通过Changelog-Producer支持生成changelog,并支持下游以流读、批读的形式读取changelog。
Paimon可以解决什么问题 目前看来Paimon基于Iceberg的场景上,去支持流读流写(这块后续会做源码分析),甚至还支持了点查和预聚合。 无论如何都不好做到实时场景: Paimon的CDC根据不同的模式,会有不同的新鲜度。发出完整CDC的模式要选择Lookup。 Paimon支持的是秒级点查。 但现实中真正需要实时类场景的业务有多少呢?因为数据的新鲜度往往和业务决策周期有关系。 但结合上文,Paimon具有一定的随机读写能力。 Paimon允许在配置中自由设置LSM的高度,以便获取读与写之前的权衡。 内幕鸟瞰 前面说到过,计算部分是依赖于计算引擎实现的,本身Paimon没有提供计算能力。
引入Paimon 和其它数据湖不同的是,Paimon 是从流世界里面诞生的数据湖,所以它在对接流写流读、对接 Flink 方面都要比其它数据湖做得更好。 Flink 结合 Paimon 打造的入湖架构如下: 步骤如下: 通过 Flink CDC 一键全增量一体入湖到 Paimon,此任务可以配置 Tag 的自动创建,然后通过 Paimon 的能力 也会同步到下游 Paimon 表里:详见 https://paimon.apache.org/docs/master/cdc-ingestion/overview/ 它的好处是: 架构链路复杂度低,不再因为各种组件的问题导致链路延时 可能有用户会担心,常驻的流作业会消耗更多的资源,对 Paimon 来说,你可以打开纯异步 Compaction 的机制,以 Paimon 优异的性能表现,只用少量的资源即可完成同步,Paimon 另有整库同步等能力帮助你节省资源 参考 Flink + Paimon 数据 CDC 入湖最佳实践 Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座
以下是表格式的核心价值:ACID 事务支持,保证数据一致性和可靠性; 支持 Schema 演化;增量更新和删除; 数据裁剪,更高的查询性能;时间旅行和版本控制;而本文要剖析的元数据,我认为是 Paimon Paimon 文件以分层风格组织。下图说明了文件布局。从快照文件开始,Paimon 阅读器可以递归访问表中的所有记录。 本地测试代码用例,用于 paimon append 表的写入,每隔 10s 做一次 checkpoint。 "'type'='paimon', " + "'warehouse'='file:///tmp/paimon'" + 目前,Paimon 支持使用 parquet(默认)、orc 和 avro 作为数据文件的格式。Bucket 桶是 Paimon 表读写操作的最小单元。
Apache Paimon是一个流数据湖平台,具有高速数据摄取、变更日志跟踪和高效的实时分析的能力。 1)读/写:Paimon 支持多种读/写数据和执行 OLAP 查询的方式。 5)丰富的表类型 除了主键表之外,Apache Paimon还支持append-only表,提供有序的流式读取来替代消息队列。 6)模式演化 Apache Paimon 支持完整的模式演化。 Paimon 文件以分层方式组织。下图说明了文件布局。从快照文件开始,Paimon 读者可以递归地访问表中的所有记录。 目前,Paimon 支持使用 orc(默认)、parquet 和 avro 作为数据文件格式。 Paimon 目前采用了类似于 Rocksdb 通用压缩的Compaction策略。 默认情况下,当Paimon将记录追加到LSM树时,它也会根据需要执行Compaction。
本文依旧使用 Flink-1.16 + Paimon-1.0.1 版本,通过 Flink SQL 进行读写演示。一. WITH ( 'type' = 'paimon', 'warehouse' = 'file:///tmp/paimon');USE CATALOG paimon;create WITH ( 'type' = 'paimon', 'warehouse' = 'file:///tmp/paimon');SET 'execution.runtime-mode Lookup功能:设置 'changelog-producer' = 'lookup',Paimon 在提交数据写入前通过查找(lookup)生成变更日志。 后面的文章会深入分析 Paimon 是如何基于 LSM 进行高效的流式更新。更多大数据干货,欢迎关注我的微信公众号—BigData共享
Apache Paimon是一个流数据湖平台,具有高速数据摄取、变更日志跟踪和高效的实时分析的能力。 读/写:Paimon 支持多种读/写数据和执行 OLAP 查询的方式。 5)丰富的表类型 除了主键表之外,Apache Paimon还支持append-only表,提供有序的流式读取来替代消息队列。 6)模式演化 Apache Paimon 支持完整的模式演化。 Paimon 文件以分层方式组织。下图说明了文件布局。从快照文件开始,Paimon 读者可以递归地访问表中的所有记录。 下面简单介绍文件布局。 Paimon 目前采用了类似于 Rocksdb 通用压缩的Compaction策略。 默认情况下,当Paimon将记录追加到LSM树时,它也会根据需要执行Compaction。 默认情况下,Paimon支持对不同分区的并发写入。推荐的方式是streaming job将记录写入Paimon的最新分区;同时批处理作业(覆盖)将记录写入历史分区。
Apache Paimon 是一种高性能的流批一体数据湖存储引擎,广泛用于实时和离线数据处理场景。 Paimon 通过其表结构(如Append表和主键表)管理数据文件,并依赖HDFS的NameNode(NN)进行元数据的管理和文件操作(如create、delete、rename)。 由于Paimon的高频写入、Checkpoint机制和分区更新特性,可能会在HDFS中生成大量小文件,导致NN的元数据请求压力增加。 因此,优化Paimon的参数配置和操作策略对减轻HDFS NameNode的负担至关重要。 较少的层级数可降低Compact操作频率,Paimon在合并过程中会删除已被合并的小文件,仅保留合并后的大文件,显著减轻NN负担。
虽然Paimon的merge会高效,但是还是赶不上普通的AppendOnly表。 2.9.3 多Writer并发写入 Paimon的快照管理支持向多个writer写入。 默认情况下,Paimon支持对不同分区的并发写入。 然而,标记的数据文件并没有真正被删除,因为Paimon还支持时间旅行到更早的快照。它们仅在快照过期时被删除。 目前,Paimon Writer在提交新更改时会自动执行过期操作。 WITH ( ‘type’ = ‘paimon’, ‘warehouse’ = ‘file:///tmp/paimon’ ); USE CATALOG paimon; CREATE TABLE T ( (2)Paimon Sink将数据写入桶级别的Paimon表中。其中的CompactManager将异步触发Compaction。
CREATE TABLE test_ctl LIKE test; 5)表属性 用户可以指定表属性来启用Paimon的功能或提高Paimon的性能。 Paimon 外部表可以在任何Catalog中使用。如果您不想创建Paimon Catalog而只想读/写表,则可以考虑外部表。 2.8 CDC集成 Paimon 支持多种通过模式演化将数据提取到 Paimon 表中的方法。这意味着添加的列会实时同步到Paimon表中,并且不会为此重新启动同步作业。 –database Paimon Catalog中的数据库名称。 –table Paimon 表名称。 –partition-keys Paimon 表的分区键。 –database Paimon Catalog中的数据库名称。 –table Paimon 表名称。 –partition-keys Paimon 表的分区键。
Apache Paimon 的核心优势在于它对于大数据生态系统中流式处理的支持,尤其是在高并发和低延迟方面表现出色。 其Github地址为:https://github.com/apache/incubator-paimon 官网地址为:https://paimon.apache.org/ 目前Paimon在蓬勃发展中 Paimon 创新的结合了 湖存储 + LSM + 列式格式 (ORC, Parquet),为湖存储带来大规模实时更新能力。 随着技术的不断发展和应用场景的拓展,Apache Paimon 及类似的流式湖仓解决方案将会在数据处理领域扮演越来越重要的角色。 鉴于此,大数据流动社群决定成立Apache Paimon流式湖仓学习交流社群,也希望更多对Apache Paimon感兴趣的同学加入进来。
前言在《Paimon系列:IDEA环境读写Paimon表》一文中,详细介绍了如何创建和使用追加表与主键表,其中主键表是核心表类型,通过主键保证数据唯一性,支持高效的插入、更新和删除操作。 本文依旧使用 Flink-1.16 + Paimon-1.0.1 版本,通过 Flink SQL 进行读写演示 (需要把 paimon-flink-1.16-1.2.0.jar 放到 Flink lib 主键表和 merge-engine当 Paimon 的 Sink 接收到多条具有相同主键的记录时,它会根据配置的 merge-engine 属性将这些记录合并为一条,以确保主键的唯一性。 Paimon 提供了以下几种主要的合并引擎:一. deduplicate (去重,默认)功能:保留同一主键下最新的记录,丢弃其他具有相同主键的记录; 如果最新的记录是 DELETE 记录,则所有具有相同主键的记录都会被删除 WITH ( 'type' = 'paimon', 'warehouse' = 'file:///tmp/paimon');USE CATALOG paimon
最近Apche Paimon发布了最新版本0.7.0,在这个版本中,Paimon对一些新特性进行了增强。 在一些企业的分享中,利用Paimon进行维度表关联,是一个比较常见的方式或者是未来的规划。 CDC能力 大家要特别注意的是,CDC能力分两个部分: 第一,CDC入Paimon 这个能力是一个基础能力,Paimon在新的CDC接入支持上越来越完善,这个是各类型湖表都在持续完善的能力。 第二,Paimon CDC能力 这个能力未来是否具备,大家可以持续关注,一旦Paimon具备的CDC能力,未来在技术架构上会有巨大的改变。 总之,大家持续关注Paimon社区的发展,未来在生产环境会有更广泛和深入的应用。
今天听Spark团队说Hudi好,明天听Flink团队说Paimon牛,后天又看到Iceberg的官方博客写得天花乱坠。 结果就是什么技术都想用,最后搞成一个四不像的怪物。 Paimon适合什么?适合Flink技术栈的实时场景。 Doris适合什么?适合AI+高并发实时分析需求。 如果你不清楚自己要解决什么问题,技术选型就是赌博。 我建议他们用Paimon替代Hudi。 原因很简单:Flink原生支持,CDC实时入湖延迟可以控制在毫秒级,而Hudi在Flink场景下性能明显不足。 我们设计了分层架构:实时链路用Paimon存储最近7天数据,离线链路用Spark批量写入Iceberg历史数据,然后通过Doris提供统一查询服务。 从Hudi到Iceberg,从Paimon到Doris,每个技术都有它的闪光点和适用场景。关键是你的业务需要什么,你的团队能驾驭什么,你的运维体系能支撑什么。
北京时间 2024 年 4 月 16日,开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache Paimon 毕业成为 Apache 顶级项目(TLP 经过社区的共同努力和持续创新,Apache Paimon 在构建实时数据湖与流批处理技术领域取得了重大突破,数据湖步入实时新篇章! 恭喜Paimon进入一个新的篇章,这篇文章也是我个人结合当前整个湖仓领域的发展和实践写的一个总结性质的文章。 本文对湖仓方向的核心几个框架没有做对比,Hudi、Paimon、Iceberg、Delta在各个公司都有非常成熟的应用,无丝毫拉踩之意。 我们随便举几个例子: 我们可以基于Hudi/Paimon的表直接进行分析,在流读场景取代Kafka的部分能力,解决Kafka对查询分析能力的弱支持; 基于OLAP成本过高,通过挂在外部表实现存储、计算分离