paimon的四种changelog模式(2)-none模式

# 请先了解input模式

环境创建

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

USE CATALOG fs_catalog;

drop table if exists t_changelog_none ;
 
 CREATE TABLE t_changelog_none (
      age BIGINT,
      money BIGINT,
      hh STRING,
      PRIMARY KEY (hh) NOT ENFORCED
)WITH (
    'merge-engine' = 'deduplicate',
    'changelog-producer' = 'none' -- 不写也可以,默认的changelog模式
);

paimon的snapshot和checkpoint之间的关系

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

执行一次插入操作

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

root@wsl0

<think>我们正在讨论Flink中的changelog-mode,它定义了数据源或表能够处理的变更日志类型。根据引用[2],Flink内部定义了三种主要的ChangelogMode: 1. **INSERT_ONLY**:只包含插入操作(RowKind.INSERT)。这种模式适用于仅追加的数据流,没有更新或删除操作。 2. **UPSERT**:包含插入(RowKind.INSERT)、更新后(RowKind.UPDATE_AFTER)和删除(RowKind.DELETE)操作。注意,这种模式不包含更新前(RowKind.UPDATE_BEFORE)的记录。它通常用于有主键的表,其中更新和删除通过主键来操作。 3. **ALL**:包含所有类型的操作,即插入(RowKind.INSERT)、更新前(RowKind.UPDATE_BEFORE)、更新后(RowKind.UPDATE_AFTER)和删除(RowKind.DELETE)。这种模式提供了完整的变更日志,包括更新操作前后的记录。 此外,引用[4]提到了Paimon(一种流式数据湖存储)的changelog模式,其中提到了“none模式。在Paimon中,changelog模式四种:auto、upsert、all和none。虽然问题中只提到了none模式,但我们可以根据Paimon的文档补充说明: 4. **NONE**:在Paimon中,这种模式表示不产生变更日志,即表不会记录任何变更(INSERT、UPDATE、DELETE)。这通常用于批量同步整张表,而不需要流式读取变更。 总结一下,Flink中内置的ChangelogMode主要有三种:INSERT_ONLY、UPSERT和ALL。而Paimon等外部存储系统可能扩展了其他模式,如NONE。 现在,我们根据引用内容详细说明每种模式- **INSERT_ONLY**:只处理插入操作。适用于数据源只追加数据,没有更新或删除的场景。例如,日志数据、传感器数据等。 - **UPSERT**:处理插入、更新后和删除操作。这种模式假设数据源通过主键来标识记录,因此更新和删除操作都是通过主键来定位记录的。它不包含更新前的记录,所以如果下游需要知道更新前的值(比如做差值计算),则这种模式可能不够用。 - **ALL**:处理所有操作,包括插入、更新前、更新后和删除。这种模式提供了完整的变更日志,可以重建整个表的历史状态。它适用于需要完整变更历史的场景,例如需要回放变更日志来重建表的状态。 - **NONE**(Paimon特有):不产生变更日志。这种模式通常用于批量写入,不记录任何变更,因此不支持流式读取变更。适用于一次性全量导入数据的场景。 在Flink SQL中,可以通过DDL中的`'changelog-mode'`选项来指定表的变更日志模式。例如,在创建表时,可以设置: ```sql CREATE TABLE my_table ( ... ) WITH ( 'changelog-mode' = 'upsert', -- 可以是'insert-only', 'upsert', 'all' ... ); ``` 注意:不同的连接器(connector)支持不同的changelog模式。例如,Kafka连接器可能支持所有模式,而文件系统连接器可能只支持insert-only模式。 另外,引用[3]提到,Flink CDC(Change Data Capture)产生的数据是changelog类型,可以被upsert-kafka连接器处理,该连接器能够处理UPDATE/DELETE操作,并输出当前快照数据。 引用[1]则指出,如果输入源没有完整的changelog(比如有重复数据的离线表),那么即使双写一份数据作为changelog,也可能存在同一个主键的重复数据,导致问题。因此,选择正确的changelog模式非常重要。 综上所述,changelog-mode支持的模式主要有: 1. insert-only(仅插入) 2. upsert(插入、更新后、删除) 3. all(插入、更新前、更新后、删除) 4. 部分存储系统(如Paimon)还支持none模式(无变更日志) 在实际应用中,需要根据数据源的特性和业务需求选择合适的changelog模式。</think>### Flink Changelog Mode 模式详解 #### 1. **核心模式类型** 根据 Flink 官方定义和引用[2],Changelog Mode 主要支持三种基本模式: 1. **INSERT_ONLY (仅插入模式)** ```java ChangelogMode.newBuilder() .addContainedKind(RowKind.INSERT) .build(); ``` - **特征**:仅包含 `+I`(插入)操作 - **适用场景**:无主键的追加流(如日志数据) - **数据特征**:不可修改的历史记录 2. **UPSERT (更新插入模式)** ```java ChangelogMode.newBuilder() .addContainedKind(RowKind.INSERT) .addContainedKind(RowKind.UPDATE_AFTER) .addContainedKind(RowKind.DELETE) .build(); ``` - **特征**:包含插入、更新后、删除操作 - **关键机制**:依赖主键进行记录定位(引用[3]) - **输出特性**:输出当前数据快照而非变更历史(引用[3]) 3. **ALL (完整变更模式)** ```java ChangelogMode.newBuilder() .addContainedKind(RowKind.INSERT) .addContainedKind(RowKind.UPDATE_BEFORE) .addContainedKind(RowKind.UPDATE_AFTER) .addContainedKind(RowKind.DELETE) .build(); ``` - **特征**:包含所有变更细节(含更新前值) - **核心价值**:支持完整变更回放 - **实现要求**:需要精确记录变更前后状态 #### 2. **扩展模式Paimon实现)** 引用[4]展示了 Apache Paimon 实现的扩展模式: 1. **NONE (无变更日志模式)** - **特征**:不记录任何变更日志 - **使用场景**: ```sql SELECT * FROM t_changelog_none /*+ OPTIONS('scan.snapshot-id' = '1') */; ``` - **适用场景**:批量数据导入,无需变更追踪 #### 3. **模式对比与选型指南** | 模式 | 包含操作 | 主键要求 | 状态管理 | 典型应用场景 | |--------------|------------------------------|----------|----------|----------------------------| | `INSERT_ONLY`| `+I` | 不需要 | 无状态 | 日志采集,传感器数据 | | `UPSERT` | `+I`, `+U`, `-D` | 必需 | 键值状态 | CDC同步,维度表更新[^3] | | `ALL` | `+I`, `-U`, `+U`, `-D` | 可选 | 完整状态 | 审计追踪,时态表关联 | | `NONE` | 无变更日志 | 不需要 | 无状态 | 批量数据迁移[^4] | #### 4. **关键注意事项** 1. **数据完整性限制** 当输入源缺少完整 Changelog 时(如重复数据的离线表),即使双写也无法保证 Changelog 正确性(引用[1]) 2. **格式兼容性** - Upsert 模式输出的是当前快照数据,需使用常规格式(JSON/CSV) - 不可使用 Debezium-JSON 等变更日志专用格式(引用[3]) 3. **流处理配置** 流式查询需显式配置: ```sql SET 'execution.runtime-mode' = 'streaming'; SET 'execution.checkpointing.interval'='10 s'; SET 'sql-client.execution.result-mode'='changelog'; ``` (引用[4]) #### 5. **典型应用场景** - **INSERT_ONLY**:IoT 设备数据采集 - **UPSERT**:MySQL 分库分表实时合并 - **ALL**:金融交易流水审计 - **NONE**:Hive 历史数据迁移入湖 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值