paimon中的主键表与append-only 以与merge-engine 和 changelog-producer 关系

在 Apache Paimon 中,主键表Append-Only 表 是两种核心表类型,其行为与 merge-enginechangelog-producer 的配置密切相关。以下是它们的核心关系与作用机制:


一、主键表(Primary Key Table)

1. 特点
  • 主键约束:通过 PRIMARY KEY 定义唯一标识符,支持按主键更新(UPSERT)和删除(DELETE)操作。
  • 数据合并:依赖 merge-engine 决定相同主键记录的合并策略(如去重、部分更新、聚合)。
  • 变更日志生成:通过 changelog-producer 生成完整的变更记录(+I/-U/+U/-D),供流式消费。
2. 与 merge-engine 的关系
  • 功能控制merge-engine 定义主键冲突时的合并逻辑,直接影响数据写入和查询行为。
    • deduplicate:仅保留最新记录,丢弃旧数据。
    • partial-update:支持多流按字段更新,逐步构建完整记录。
    • aggregation:对非主键字段预聚合(如 SUM/MAX)。
  • 依赖关系:主键表必须指定 merge-engine,Append-Only 表无此配置。
3. 与 changelog-producer 的关系
  • 变更日志生成模式changelog-producer 控制如何生成变更记录:
    • none:不生成完整变更日志(依赖下游补全)。
    • input:直接存储输入源的变更事件(如 CDC 的 DELETE 事件)。
    • lookup:通过查询旧值生成 -U 事件(适合非 CDC 场景)。
    • full-compaction:全量合并时生成变更日志(高延迟)。
  • 必要性:若需流式消费完整变更日志(如 Flink 实时处理),主键表需配置 changelog-producer
4. 典型配置
CREATE TABLE user_behavior (
    user_id STRING PRIMARY KEY,
    action STRING,
    event_time TIMESTAMP
) WITH (
    'merge-engine' = 'deduplicate',       -- 去重合并
    'changelog-producer' = 'input',       -- 接收 CDC 的完整变更日志
    'bucket' = '4'                        -- 分桶优化
);

二、Append-Only 表

1. 特点
  • 无主键:仅支持追加写入,无更新或删除操作。
  • 无合并逻辑:每条记录独立存储,天然保留全量明细数据。
  • 无变更日志:数据按写入顺序追加,无 -U/-D 事件。
2. 典型配置
CREATE TABLE logs (
    log_id STRING,
    message STRING,
    timestamp TIMESTAMP
) WITH (
    'bucket' = '4',                     -- 分桶优化
    'bucket-key' = 'log_id'              -- 分桶键(非主键)
);

三、核心对比与关系总结

维度 主键表 Append-Only 表
主键 必须定义,支持更新/删除 无主键,仅追加写入
数据合并 merge-engine 控制 无合并逻辑
变更日志 changelog-producer 生成 不支持变更日志
适用场景 CDC 同步、实时更新、状态管理 日志存储、无更新需求的明细数据
流式消费 支持(依赖完整 Changelog) 仅支持追加流(无 -U/-D 事件)

四、配置组合与典型场景

1. 主键表 + deduplicate + input
  • 场景:MySQL CDC 同步,需保留完整变更历史。
  • 行为
    • CDC 的 DELETE 事件直接写入 Paimon。
    • 流式读取时获取 +I/-U/+U/-D 事件。
2. 主键表 + partial-update + lookup
  • 场景:多流合并构建宽表(如用户画像)。
  • 行为
    • 不同流更新不同字段,通过 sequence-group 解决乱序。
    • Compaction 时生成 -U 事件,确保变更日志完整。
3. Append-Only 表
  • 场景:日志数据存储,无需更新或删除。
  • 行为
    • 直接追加数据,无合并或变更日志。
    • 通过时间旅行查询历史快照。

五、注意事项

  1. 主键表必须包含分区键:所有分区键字段需包含在主键中(如 PRIMARY KEY (id, dt),分区键为 dt)。
  2. 流批一致性:主键表的 changelog-producer 需与下游引擎兼容(如 Flink 需启用 ChangelogNormalize)。
  3. 存储优化
    • 主键表:通过 bucketcompaction.async.enabled 优化写入性能。
    • Append-Only 表:通过 snapshot.time-retained 管理历史数据。

六、总结

  • 主键表:面向 动态数据(更新/删除),依赖 merge-enginechangelog-producer 实现高效合并与流式同步。
  • Append-Only 表:面向 静态数据(仅追加),无需复杂配置,适合海量明细存储。
  • 选型原则
    • 需要更新或删除 → 主键表 + 合理配置 merge-enginechangelog-producer
    • 纯追加无变更 → Append-Only 表 + 分区/分桶优化。