使用 Append 表作为 ods 层表。
日志入湖
merge-engine
为 partial-update
partial-update
不能接收和处理 DELETE 消息,为了避免接收到 DELETE 消息报错,需要通过配置 'partial-update.ignore-delete' = 'true'
忽略 DELETE 消息。优点:在没有存储支持 partial update,从而可以在存储系统实现打宽宽表时,需要通过 flink 多流 join 来打宽,消耗大量资源存储 state。在存储层通过 partial update 打宽,flink 任务直接写入即可,节省资源。
结果表字段由多个数据源提供组成,可使用 Union All 的方式进行逻辑拼接。这里所说的多个 Flink 流任务并不是指多个 Flink Job 并发写同一张 Paimon 表,这样需要拆分 Compaction 任务,就不能在每个 Job 的 Writer 端做 Compaction, 需要一个独立的 Compaction 任务,比较麻烦。目前推荐将多条 Flink 流任务 UNION ALL 起来,启动一个 Job 写 Paimon 表
数据写入
dim 维表 sql
dwd 入湖:
DWD 层也采用 Paimon 的 PK 表,ODS 层的表数据经由 Flink SQL 做 ETL 清洗,并通过 Retry Lookup Join 关联维表拉宽后写入到 DWD 层对应的 Paimon 表里,由于维表数据可能晚于事实数据到达湖仓,存在 Join 不上的情况,所以这里需要增加重试机制
DWS 层主要是分主题进行数仓建模,目前主要采用 Paimon 的 Agg 表进行一些预聚合模型及大宽表的建设
aggregation:如果用户建表时指定 'merge-engine' = 'aggregation',此时使用聚合表引擎,可以通过聚合函数做一些预聚合,每个除主键以外的列都可以指定一个聚合函数,相同主键的数据就可以按照列字段指定的聚合函数进行相应的预聚合,如果不指定则默认为 last-non-null value ,空值不会覆盖。Agg 表引擎也需要结合 Lookup 或者 full-compaction 的 Changelog Producer 一起使用,需要注意的是除了 SUM 函数,其他的 Agg 函数都不支持 Retraction,为了避免接收到 DELETE 和 UPDATEBEFORE 消息报错,需要通过给指定字段配置 'fields.${field_name}.ignore-retract'='true' 忽略。
必须设置 bucket-key
。因为无主键
如果不指定则不会在写入 Paimon 表的时候生成 Changelog,那么下游任务需要在流读时生成一个物化节点来产生 Changelog。这种方式的成本相对较高,同时官方不建议这样使用,因为下游任务在 State 中存储一份全量的数据,即每条数据以及其变更记录都需要保存在状态中。
Paimon 支持的 Changelog Produer 包括:
参考文档: