本文档旨在帮助用户系统性理解 Paimon 的写入性能调优技巧,并提供常见的优化建议,以提升写入吞吐量和稳定性。
Paimon 的写入性能与 Flink 的检查点机制密切相关。以下是一些常见的优化手段:
write-buffer-size
来提升单次写入的数据量。write-buffer-spillable
,允许缓冲区在内存不足时将数据溢写到磁盘,避免 OOM。changelog-producer
可以设置为 lookup
或 full-compaction
,但这两个选项会对写入性能产生较大影响。
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ( -- 开启异步 Compaction 'num-sorted-run.stop-trigger' = '2147483647', 'sort-spill-threshold' = '10', 'changelog-producer.lookup-wait' = 'false', ... );
Paimon 的写入并行度与桶数量密切相关,建议遵循以下原则:
sink.parallelism
来调整 Sink 的并行度。例如:CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('sink.parallelism' = '16', ...);
如果作业存在 主键数据倾斜 问题(例如 AGG 表统计网站页面浏览量时,某些热门页面的访问量远高于其他页面),可以通过以下方式优化:
local-merge-buffer-size
,在数据按桶分区之前对输入记录进行缓冲和合并。注意:本地合并目前不支持 CDC 数据同步。
Paimon 支持多种文件格式,不同格式在写入性能和查询性能之间存在权衡。
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('file.format' = 'avro', 'metadata.stats-mode' = 'none', ...);
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('file.format.per.level' = '0:avro,1:avro', ...);
Paimon 默认使用 zstd 压缩算法(级别为 1),可以通过以下方式优化压缩性能:
file.compression.zstd-level
以提高压缩率,但会降低读写速度。例如:CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('file.compression.zstd-level' = '3', ...);
write-manifest-cache
来缓存读取的清单数据,从而加速初始化。Paimon 写入过程中主要占用内存的地方包括:
write-buffer-size
调整。num-sorted-run.compaction-trigger
调整合并的排序运行数量。read.batch-size
减少单次读取的数据量。orc.write.batch-size
调整 ORC 写入的批次大小。CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('parquet.enable.dictionary' = 'false', ...);
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('orc.dictionary.key.threshold' = '0', 'orc.column.encoding.direct' = 'field1,field2');
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('sink.use-managed-memory-allocator' = 'true', ...);
如果写入数据量特别大,提交节点(Committer)可能会消耗大量内存。可以通过以下方式优化:
CREATE TABLE IF NOT EXISTS catalog_test.db_test.table_test (...) WITH ('sink.committer-memory' = '300m');
通过合理调整 Flink 配置、并行度、文件格式、压缩算法和内存参数,可以显著提升 Paimon 的写入性能和稳定性。建议根据实际业务场景和数据特点,逐步尝试上述优化手段,以达到最佳性能。
最后给出以下在大规模写入场景下,常见的写入性能优化建议配置项:
CREATE TABLE IF NOT EXISTS `${catalog_name}`.`${db_name}`.`${table_name}` ( word varchar, -- 示例字段 cnt bigint, PRIMARY KEY (word) NOT ENFORCED ) WITH ( 'bucket' = 'N', -- 建议使用固定分层桶,可适当调大分桶数量,单个 bucket 推荐存储 1GB 左右数据 'sink.parallelism' = 'N', -- 在追数阶段,建议 sink 并行度保持和 bucket 数量一致 -- 开启异步 Compaction 'num-sorted-run.stop-trigger' = '2147483647', 'sort-spill-threshold' = '10', 'changelog-producer.lookup-wait' = 'false', -- changelog-producer 为 none 的时候这个参数可以忽略 -- 开启写入缓存 spill 到磁盘,避免 OOM 失败 'write-buffer-spillable' = 'true', 'changelog-producer' = 'none' -- 如果下游不依赖 changelog,或者在全量同步阶段,则可以设置为 none );