paimon的四种changelog模式(4)-full-compaction模式

请先了解lookup模式,然后再看full-compaction模式

环境创建

CREATE CATALOG fs_catalog WITH (
    'type'='paimon',
    'warehouse'='file:/data/soft/paimon/catalog'
);

USE CATALOG fs_catalog;

drop table if exists t_changelog_fullcompaction;
 
CREATE TABLE t_changelog_fullcompaction(
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
)WITH (
    'merge-engine' = 'deduplicate',
    'changelog-producer' = 'full-compaction'
);

paimon的snapshot和checkpoint之间的关系

  • 一次snapshot会产生一个data文件
  • 一次checkpoint会产生1-2个snapshot文件,要看这次checkpoint是否触发compaction,触发了就是2个data文件(一个是合并后的数据,一个本次checkpoint写入数据),否则只有一个(本次checkpoint写入数据)
  • paimon 流式写入根据checkpoint间隔,定期生成snapshot
  • 批写(手动执行sql脚本)每一个sql会立即生成snapshot,不管checkpoint间隔配置

lookup模式,一次checkpoint会产生一个chagelog,而full-compaction会等待若干次checkpoint后才产生一个chagelog,这取决于参数
在这里插入图片描述
如果配置 full-compaction.delta-commits = 2 ,意思就是说,在流式处理场景中checkpoint2次,产生2个snapshot后才会生成一个changelog

在批处理场景下,一次sql就会产生一个check

流式写入验证(1)

CREATE TEMPORARY TABLE t_auto_generated_data (
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
) WITH (
    'connector' = 'datagen', -- 使用datagen连接器自动生成数据
    '
<think>好的,用户现在问的是Flink集成Paimon时是否读取changelog,需要详细解释。首先,我需要回顾之前关于Paimonchangelog-producer的讨论。用户之前了解了lookup和input模式的区别,现在可能想进一步了解Flink如何与Paimon交互,特别是changelog的处理。 用户可能是在实际项目中使用Flink和Paimon,需要了解数据流动的机制。他们可能想知道Flink读取的是原始数据还是处理后的changelog,这对于他们的流处理逻辑可能有影响。比如,是否需要在Flink中处理CDC数据,或者Paimon已经帮他们处理好了。 接下来,我需要确定Paimon和Flink集成的机制。Paimon作为数据湖存储,支持流批一体,而Flink作为计算引擎,可能通过Table API或DataStream API读取Paimon表。关键点在于Paimon表的changelog是如何被Flink消费的。 根据之前的回答,Paimonchangelog-producer会影响changelog的生成方式。当Flink读取Paimon表时,尤其是作为流源时,是否会直接读取这些changelog?是的,Paimon表会提供changelog流,Flink可以实时消费这些变更。 需要分情况讨论:批处理和流处理的不同。在批处理下,Flink可能读取快照数据,而流处理下会持续读取changelog。同时,要解释changelog的结构,比如+I、-U、+U、-D等操作类型,以及Flink如何处理这些记录。 用户可能关心的是,如果使用lookup模式生成的changelog,Flink是否能正确识别这些变更事件,并进行相应的处理,比如状态更新或计算。此外,可能还需要提到分区表和主键表的影响,以及如何配置Paimon表以便Flink正确读取。 还需要对比其他数据源,比如Kafka中的CDC数据,说明Paimon作为中间存储的优势,比如自动合并小文件、ACID支持等。用户可能希望了解集成后的性能、准确性和可靠性,以及如何优化配置。 最后,总结Flink读取Paimonchangelog的流程,强调不同模式下的行为差异,以及适用场景。确保用户能够根据自身的数据源和需求选择合适的changelog-producer模式,并正确配置Flink作业。</think>在 Apache Flink 集成 Apache Paimon 的场景中,Flink **可以直接读取 Paimon 表的变更日志(Changelog)**,但具体行为取决于表的配置(如是否启用 `changelog-producer`)以及 Flink 作业的模式(流式或批式)。以下详细说明这一过程: --- ### **1. Paimon 表的变更日志(Changelog)** Paimon 作为流批一体的数据湖存储,其表可以记录完整的变更历史(插入、更新、删除),类似于数据库的 CDC(Change Data Capture)日志。 - **变更日志生成方式**:由表的 `changelog-producer` 参数决定(如 `lookup` 或 `input` 模式,如前文所述)。 - **存储形式**:变更日志以文件形式(如 `log` 或 `manifest` 文件)存储在 Paimon 表的目录中,记录每条数据的操作类型(`+I`/`-U`/`+U`/`-D`)。 --- ### **2. Flink 如何读取 Paimon 表的变更日志** Flink 通过 **Paimon 的 Table Source 或 DataStream Source** 读取表数据,具体行为分为两种模式: #### **2.1 批处理模式(Batch Mode)** - **行为**:读取表的 **当前快照(Snapshot)数据**,即某一时刻的全量数据,**不包含变更历史**。 - **适用场景**:离线分析、全量数据导出等。 - **示例 SQL**: ```sql -- 批处理模式(默认) SELECT * FROM paimon_table; ``` #### **2.2 流处理模式(Streaming Mode)** - **行为**:以流式方式持续读取表的 **变更日志(Changelog)**,包括所有插入、更新和删除操作。 - **触发条件**:需要显式启用流式读取(如通过 `STREAMING_MODE` 参数或 Flink SQL 的 `/*+ OPTIONS() */` 提示)。 - **示例 SQL**: ```sql -- 流处理模式(读取变更日志) SELECT * FROM paimon_table /*+ OPTIONS('log.scan'='latest') */; ``` --- ### **3. Flink 读取变更日志的具体机制** #### **3.1 变更日志的流式消费** 当 Flink 以流模式读取 Paimon 表时,会 **逐条消费变更日志**: - **变更日志内容**:包含每条数据的操作类型(`+I`/`-U`/`+U`/`-D`)和具体值。 - **数据一致性**:Paimon 保证变更日志的完整性和顺序性,确保 Flink 能正确处理事件时间(Event Time)和状态计算。 #### **3.2 变更日志的格式** Flink 读取的每条记录会包含以下信息(以 Flink RowData 格式为例): ```plaintext Row(kind=INSERT, fields=(1001, Alice, 北京)) -- +I Row(kind=UPDATE_BEFORE, fields=(1001, Alice, 北京)) -- -U Row(kind=UPDATE_AFTER, fields=(1001, Bob, 上海)) -- +U Row(kind=DELETE, fields=(1001, Bob, 上海)) -- -D ``` --- ### **4. 关键配置与行为** #### **4.1 Paimon 表的配置** - **`changelog-producer`**:决定变更日志的生成方式(`lookup` 或 `input`)。 - 若设置为 `lookup`:Paimon 自动生成准确的变更日志(即使输入数据不规范)。 - 若设置为 `input`:依赖输入数据的变更标记(需确保输入数据规范)。 - **`log.system`**:指定变更日志的存储系统(如 `kafka` 或内置的 `log` 文件)。 #### **4.2 Flink 作业的配置** - **流式读取模式**:需在 Flink SQL 或 DataStream API 中启用流式读取。 ```sql CREATE TABLE paimon_stream ( ... ) WITH ( 'connector' = 'paimon', 'path' = 'file:///path/to/paimon/table', 'log.scan' = 'latest' -- 流式读取最新变更 ); ``` - **时间语义**:可结合 Flink 的 Watermark 和 Event Time 处理实时变更。 #### **4.3 分区表与主键表** - **分区表**:Flink 可以按分区增量读取变更日志,减少数据扫描量。 - **主键表**:Paimon 的主键约束确保变更日志的幂等性,Flink 可基于主键进行高效的状态更新(如 `GROUP BY` 或窗口聚合)。 --- ### **5. 与其他数据源的对比** #### **5.1 对比 Kafka CDC 数据流** - **Kafka**:需额外工具(如 Debezium)生成 CDC 数据流,数据可能无序或重复。 - **Paimon**:内置变更日志生成与存储,保证顺序和一致性,简化流处理链路。 #### **5.2 对比传统数据库** - **数据库 CDC**:需通过 Binlog 导出变更数据,侵入性较强。 - **Paimon**:作为数据湖存储,直接提供变更日志,无侵入且支持大规模数据。 --- ### **6. 示例场景** #### **场景描述** 假设 Paimon 表 `user_actions` 记录用户行为,主键为 `user_id`,启用 `changelog-producer='lookup'`。 Flink 作业以流模式读取该表,实时统计用户活跃次数。 #### **Flink SQL 逻辑** ```sql CREATE TABLE user_actions ( user_id INT, action STRING, ts TIMESTAMP(3), PRIMARY KEY (user_id) NOT ENFORCED ) WITH ( 'connector' = 'paimon', 'path' = 'file:///path/to/user_actions', 'log.scan' = 'latest' ); -- 实时统计每个用户的活跃次数 SELECT user_id, COUNT(*) AS action_count FROM user_actions GROUP BY user_id; ``` #### **执行过程** 1. **变更日志生成**:Paimon 表根据写入数据自动生成 `+I`/`+U`/`-D` 变更日志。 2. **流式读取**:Flink 持续消费变更日志,触发增量计算。 3. **状态更新**:Flink 基于主键 `user_id` 维护每个用户的计数状态,确保结果准确。 --- ### **7. 总结** - **Flink 可以读取 Paimon 的变更日志**:在流处理模式下,Flink 直接消费 Paimon 表生成的变更日志(`+I`/`+U`/`-D`),实现实时数据处理。 - **依赖 Paimon 的 `changelog-producer`**: - 若配置为 `lookup`,Paimon 会主动生成正确的变更日志(不依赖输入数据规范性)。 - 若配置为 `input`,需确保输入数据自身携带正确的变更标记。 - **适用场景**:实时数仓、CDC 数据聚合、流式 ETL 等需要严格保证数据一致性和实时性的场景。 通过 Flink + Paimon 的深度集成,开发者可以构建高效、可靠的流批一体数据处理管道,同时利用 Paimon 的 ACID 特性和 Flink 的实时计算能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值