订阅更新

Paimon 主键表的 merge-engine 和 changelog-producer 怎么选?

面试问 352 约 3 分钟读完

随机一题
本文目录
  1. 面试怎么回答
  2. merge-engine:同一主键的多条数据怎么合并
  3. changelog-producer:下游的变更日志从哪来
  4. 怎么组合

面试怎么回答

merge-engine 决定同一主键多条数据怎么合并:默认 deduplicate 保留最新,partial-update 只更新非空列用来拼宽表,aggregation 按列聚合做预聚合,first-row 保留首条。changelog-producer 决定下游流式读取时的变更日志来源:上游已是完整 CDC 用 input;部分更新或聚合表要生成准确的更新前后值,就用 lookup 或 full-compaction,前者延迟低但写入更重,后者开销小但延迟跟着 Compaction 走。我会先按业务语义选 merge-engine,再按下游对延迟和准确性的要求选 changelog-producer。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

用 Paimon 建主键表,面试官常追问两个配置:

同一个主键来了多条数据,最后保留哪条?下游要流式读这张表,变更日志从哪来?

这两个问题分别对应 merge-engine 和 changelog-producer。

merge-engine:同一主键的多条数据怎么合并

  • deduplicate(默认):保留最新的一条,相当于 upsert。适合 CDC 同步、维表。
  • partial-update:每条数据只更新非空的列。多个来源各自写宽表的一部分字段,用它可以省掉多流 JOIN,是拼宽表的常用办法。要注意多个来源的先后顺序,必要时配合序列字段(sequence group)控制每组字段谁新谁旧。
  • aggregation:对每列按指定的聚合函数合并,比如 sum、max、last_non_null_value。适合在湖上直接做按主键的预聚合。
  • first-row:只保留第一条,后续同主键数据被忽略。适合按主键去重、取首次事件。

选择的依据是业务语义:要「最新状态」用 deduplicate,要「拼字段」用 partial-update,要「累计」用 aggregation,要「首次」用 first-row。

changelog-producer:下游的变更日志从哪来

流式读取一张主键表时,下游需要知道每条记录是新增、更新前、更新后还是删除。

  • none:不额外生成,下游只能拿到写入的数据本身,适合不需要完整变更语义的场景。
  • input:把写入的原始数据直接作为 changelog。前提是上游本身就是完整的变更流,比如 CDC。
  • lookup:在写入提交前,通过查找旧值生成完整的 changelog,延迟低但会增加写入开销。
  • full-compaction:在全量 Compaction 时对比新旧数据生成 changelog,开销小但延迟取决于 Compaction 间隔。

怎么组合

CDC 入湖、下游要流式消费:deduplicate + input。

多流拼宽表、下游要流式消费:partial-update + lookup(或 full-compaction,取决于能接受的延迟)。

湖上预聚合:aggregation,下游如果要读到准确的增量,同样需要 lookup 或 full-compaction 生成更新前后的值。

这道题在刷题路线里:湖仓与 OLAP