paimon的四种changelog模式(1)-input模式

Paimon的input模式changelog分析

环境创建

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

USE CATALOG fs_catalog;

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

paimon的snapshot和checkpoint之间的关系

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

执行一次插入操作

insert into t_changelog_input values(10,1000,'1');

root@wsl01:/data/soft/paimon/catalog/default.db/t_changelog_input/bucket-0# ll
total 8
-rw-r–r-- 1 root root 1217 Nov 27 13:40 changelog-aa32a677-6df6-40fa-83bd-3b7a6d38c84a-0.parquet
-rw-r–r-- 1 root root 1217 Nov 27 13:40 data-aa32a677-6df6-40fa-83bd-3b7a6d38c84a-1.parquet

changelog文件
在这里插入图片描述

data文件
在这里插入图片描述

相同主键,再执行一次插入操作

insert into t_changelog_input values(10,2000,'1');

root@wsl01:/data/soft/paimon/catalog/default.db/t_changelog_input/bucket-0# ll
total 16
-rw-r–r-- 1 root root 1217 Nov 27 13:40 changelog-aa32a677-6df6-40fa-83bd-3b7a6d38c84a-0.parquet
-rw-r–r-- 1 root root 1217 Nov 27 13:43 changelog-abee540c-f29d-4d18-8578-2d173d43452b-0.parquet
-rw-r–r-- 1 root root 1217 Nov 27 13:40 data-aa32a677-6df6-40fa-83bd-3b7a6d38c84a-1.parquet
-rw-r–r-- 1 root root 1217 Nov 27 13:43 data-abee540c-f29d-4d18-8578-2d173d43452b-1.parquet

changelog文件
在这里插入图片描述
data文件
在这里插入图片描述

sqlclient 流式查询

-- Flink SQL
SET 'execution.runtime-mode' = 'streaming';

--设置检查点的间隔为10秒
SET 'execution.checkpointing.interval'='10 s';
set parallelism.default=1;

-- 使用changelog,展示op,操作类型
SET 'sql-client.execution.result-mode'='changelog';

-- 从当前快照开始,读取变化情况 
SELECT * FROM t_changelog_input;

在这里插入图片描述

-- 从ID=1的快照开始,读取变化情况 
SELECT * FROM t_changelog_input  /*+ OPTIONS('scan.snapshot-id' = '1') */;

在这里插入图片描述

sqlclient 批查询

Flink SQL> SET 'sql-client.execution.result-mode'='tableau';
[INFO] Execute statement succeed.

Flink SQL> SET 'execution.runtime-mode' = 'batch';
[INFO] Execute statement succeed.

Flink SQL> SELECT * FROM t_changelog_input;
+-----+-------+----+
| age | money | hh |
+-----+-------+----+
|  10 |  2000 |  1 |
+-----+-------+----+
1 row in set

Flink SQL> SELECT * FROM t_changelog_input  /*+ OPTIONS('scan.snapshot-id' = '1') */;
+-----+-------+----+
| age | money | hh |
+-----+-------+----+
|  10 |  1000 |  1 |
+-----+-------+----+
1 row in set

Flink SQL> SELECT * FROM t_changelog_input  /*+ OPTIONS('scan.snapshot-id' = '2') */;
+-----+-------+----+
| age | money | hh |
+-----+-------+----+
|  10 |  2000 |  1 |
+-----+-------+----+
1 row in set

执行cdc采集

使用方法
https://paimon.apache.org/docs/0.9/flink/cdc-ingestion/mysql-cdc/

适配情况
https://nightlies.apache.org/flink/flink-cdc-docs-release-3.1/docs/connectors/flink-sources/overview/

MYSQL数据源
https://nightlies.apache.org/flink/flink-cdc-docs-release-3.1/docs/connectors/flink-sources/mysql-cdc/

下载地址
https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-mysql-cdc/3.1.0/flink-sql-connector-mysql-cdc-3.1.0.jar

bin/flink run \
lib/paimon-flink-action-0.9.0.jar \
mysql_sync_table \
--warehouse 'file:/data/soft/paimon/catalog' \
--database 'default' \
--table 't_changelog_input' \
--mysql_conf hostname=wsl \
--mysql_conf username=root \
--mysql_conf password=root \
--mysql_conf database-name='test' \
--mysql_conf table-name='t_changelog_input' \
--table_conf changelog-producer=input \
--table_conf sink.parallelism=1 

mysql新增一条数据,然后再修改

changelog文件,新增数据时,和data数据一样。
修改mysql数据时,paimon同步到数据后发现,changelog和data不一样了,这次是两条,而data只有一条

data文件
在这里插入图片描述
changelog文件
在这里插入图片描述
流式消费的结果也是正确的
在这里插入图片描述

结论

  • changelog=input的情况下,一次checkpoint产生一个data文件的同时,也会产生一个changelog文件
  • changelog文件内容和data文件内容完全一致
  • input 情况下,如果你的操作不完整,那么流式读取的结果也是不对的
    • 上述操作insert2次相同主键,按照主键表的逻辑,应该是会出现-D +I 或者 -U +U 的场景,但是由于input模式,不会额外的处理changelog,你insert两次,我的changelog就写两次insert,你流式读取,那我就重放我的changelog,你写的changelog不对,流处理结果也就不对了,要想对,那就需要先insert,然后delete,再insert,或者执行update操作,总之不能利用主键表根据主键更新的特性来更新数据
    • 但是批处理的结果是正确的,因为批处理不管changelog
  • changelog=input就是为流处理设计的,但是数据处理操作必须要标准,必须要有-U +U -D +I的操作,而CDC任务接到的数据就是标准的,因此他两个一般是绑定的,cdc采集任务的表,如果需要流处理消费,最好使用changelog=input

应用场景

  • 用于cdc采集的表
  • and
  • 后期要进行流式处理的表
<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 的实时计算能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值