今天我们说说Paimon主键表的一些使用上的注意事项。
一、主键表
主键表是Paimon的一种表类型。用户可以插入、更新或删除表中的记录。
说的直白点就是,允许你设置唯一主键,然后覆盖更新。
Bucket选择
无论分区表还是未分区表,Bucket都是最小的读写单元。每个Bucket包含一个LSM树及其变更日志文件。
用户可以通过提供bucket-key选项来指定分桶列。如果未指定bucket-key,那么就根据整条记录的hash值进行数据分布(最新版本中,创建Append Queue表时必须指定bucket-key),如果指定了主键,那么会根据主键进行hash。
Bucket数量会限制处理的最大并行度。但是这个值不是越大越好,一般每个Bucket中的数据量官方推荐的值是200MB-1GB,事实上2G左右也可以,但是总之Bucket中的数量不能过多。
同时Paimon是支持扩容Bucket的,并且提供了Rescale Bucket的功能对历史数据重新分布。
跨分区更新问题
Paimon主键表本身是允许设置分区的。例如你的某一张表设置了天分区,如果你的Primary Key不包含分区键,这时候就会出现跨分区更新的问题。根据你的合并引擎不同,表现不同:
Deduplicate:删除旧分区中的数据,并将新数据插入到新分区中; PartialUpdate & Aggregation:将新数据插入旧分区; FirstRow:如果有旧值,则忽略新数据
数据量较大时,性能下降明显。
所以,强烈建议,如果你要用主键表,那么最好是不带分区,并且配合行级别过期能力进行数据失效。
核心配置就两个:
'record-level.expire-time': 要保留的时间,秒值
'record-level.time-field': 过期字段,INT类型
文件合并
压缩是一个资源密集型过程,会消耗一定的CPU时间和磁盘IO,因此过于频繁的压缩可能会导致写入速度变慢。
Paimon框架本身提供了通用的压缩策略。大多数场景,你不需要做任何事情。但是如果你的任务因为compaction导致lag,那么有两种方案可以考虑:
同步变异步
直接把这两个参数打开,数据写入不会受到文件合并的影响。
num-sorted-run.stop-trigger = 2147483647
sort-spill-threshold = 10
启动专属压缩任务
Paimon给我们提供了Dedicated Compaction压缩策略,这个策略类似Hudi中的Off-line Compaction。
什么意思呢?你可以单独启动一个任务专门进行文件的合并。
例如:
<FLINK_HOME>/bin/flink run \
/path/to/paimon-flink-action-0.8.2.jar \
compact \
--warehouse s3:///path/to/warehouse \
--database test_db \
--table test_table \
--partition dt=20221126,hh=08 \
--partition dt=20221127,hh=09 \
--table_conf sink.parallelism=10 \
--catalog_conf s3.endpoint=https://****.com \
--catalog_conf s3.access-key=***** \
--catalog_conf s3.secret-key=*****