Skip to content

Shared Paimon compaction release diagnostic

Measured on 2026-11-05 on an Apple M4 (10 CPUs, 16 GiB RAM), JDK 17, with Flink 1.18.1, released Java Paimon 1.0.0 and the shared crates.io paimon 0.4.0 backend. These are file-worker measurements, including Java selection, writer construction, JNI, decoding/merging/encoding, metadata, commit preparation and writer close. They do not measure complete-job latency or peak RSS. The 120 raw trials retain the warmup, rotating engine order, output row counts and complete-row SHA-256 fingerprints. Each engine uses the same stock-written input files and settings. Every native trial asserts positive native groups, zero fallback and native encoder footer witnesses. Stock Java readers verify physical PK rows including stored sequences/kinds, or complete append rows, outside timing.

One warmup and three measured trials per engine; 400k input changes and one bucket. Unique keys interleave four runs. Versions write each key four times with 20% winning deletes. Wide adds a nullable string and integer array containing a null. Append shapes retain every insert. Seed, validation and removal of uncommitted output are outside timing. Stock and previous use Java compaction; previous retains the existing StreamFusion format shim. Native installs the production provider. The test agent controls only baseline format selection and records work.

Parquet uses a 256 MiB sort-spill buffer. The ORC run uses 1 GiB for every engine, because the conservative footer preflight declines the four-run nested PK shape at 256 MiB. The declined run was a failed admission diagnostic, not a native timing, and is excluded from the result table. The production budget gate is unchanged. All runs use a 256 MiB write buffer, an 8 GiB JVM maximum heap, release/mimalloc native libraries, default compression and 128 MiB file target.

Seconds: repeated median (range). Ratios compare medians.

Format Shape Stock Previous Native Stock/native Previous/native
parquet unique 0.201 (0.197–0.221) 0.200 (0.191–0.246) 0.158 (0.139–0.177) 1.27× 1.26×
parquet versions 0.097 (0.092–0.098) 0.097 (0.092–0.101) 0.067 (0.063–0.067) 1.46× 1.45×
parquet wide 0.213 (0.205–0.232) 0.214 (0.193–0.279) 0.113 (0.103–0.129) 1.89× 1.89×
parquet append 0.075 (0.071–0.079) 0.076 (0.074–0.085) 0.043 (0.043–0.049) 1.73× 1.77×
parquet append-wide 0.244 (0.240–0.248) 0.242 (0.242–0.249) 0.120 (0.120–0.127) 2.04× 2.02×
orc unique 0.463 (0.456–0.466) 0.465 (0.458–0.489) 0.323 (0.318–0.386) 1.43× 1.44×
orc versions 0.238 (0.238–0.248) 0.241 (0.240–0.246) 0.143 (0.143–0.146) 1.67× 1.69×
orc wide 0.369 (0.367–0.373) 0.381 (0.372–0.386) 0.291 (0.276–0.291) 1.27× 1.31×
orc append 0.122 (0.121–0.127) 0.130 (0.128–0.131) 0.088 (0.088–0.091) 1.38× 1.47×
orc append-wide 0.457 (0.455–0.464) 0.454 (0.451–0.467) 0.348 (0.343–0.354) 1.31× 1.30×

The results establish this released 1.0 worker path only; other host/release combinations need their own measurements. Startup and individual trials vary; the raw warmups are retained.

Run PaimonCompactionBenchmark through Maven's bench profile and the test agent as described on the compaction optimization page. For this adapter use -Pflink-1.18,paimon1,bench -pl streamfusion-paimon1 -am. SF_PAIMON_FILE_FORMAT selects parquet/orc, SF_PAIMON_COMPACTION_SORT_BUFFER sets the shared sort-spill budget, and SF_PAIMON_COMPACTION_SHAPES=unique,versions,wide,append,append-wide selects these workloads. Enable SF_PAIMON_COMPACTION_BENCHMARK=true, set SF_PAIMON_COMPACTION_ROWS=400000 and SF_PAIMON_COMPACTION_REPEATS=3.