Repository navigation
Where a tiering round spends its time: measurements of the Iceberg and Paimon lake writers (and a GPU writer experiment) #5227
mikepapadim
started this conversation in
Ideas
Replies: 1 comment
|
Follow-up: the #4048 author pointed to apache/parquet-java#3734, an
|
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
I measured what a tiering round spends its time on for an append-only ARROW log table, on Fluss main (1.1-SNAPSHOT). I'm sharing the numbers because they point to the lake writer rather than fetch or commit. They come from one machine, and the limits are listed at the end. Proposals that follow from them: #5222 / #5223 (a lake declares record batch support) and #5226 (a pluggable Arrow file writer for Iceberg tiering).
Setup
lineitem-like, 16 columns (3 BIGINT, 1 INT, 4 DOUBLE, 3 DATE, 5 STRING), 138 Arrow bytes per row. Sizes below are Arrow bytes per round (8 MB = 49K rows, 512 MB = 3.9M rows). Output: ZSTD Parquet (the default for both lakes).TieringSplitReaderdriven as the Flink tiering source drives it, against an in-process cluster (one tablet server, one bucket). The rows are appended first (not timed), then one log split covers them. The lake writer is wrapped with timers, so the round splits into writer (write+complete) and other (fetch, Arrow decode, row conversion). The commit is timed separately.IcebergLakeWriter/PaimonLakeWriter, so that encode cost is measured alone.A tiering round
Writer-only: CPU vs a GPU writer
As an experiment, I wrote the same rows (with Fluss's
__bucket/__offset/__timestampcolumns) as one ZSTD Parquet file with libcudf on an RTX 4090. I called it from Java through TornadoVM, and the timing includes the copy out of Arrow-layout buffers and the transfer to the device. I checked the output with Spark: row count, sums and string lengths all match.Small rounds gain little (fixed costs dominate at 8 MB). From ~32 MB up, encode time and CPU drop by an order of magnitude. Tiering runs one writer per bucket in parallel, though, so on a 32-thread host the CPU writers together outrun one GPU. What the GPU really offers is CPU seconds freed per GB tiered, not a faster round on an idle machine.
None of this needs a GPU dependency in Fluss. #5226 proposes a device-neutral extension point so that alternative Parquet writers (an Arrow-native CPU writer once arrow-java#904 lands, or a GPU writer) can live outside the tree.
Limits
I'm happy to share the harness, for example as a
fluss-jmhbenchmark if that would be useful, and to rerun with a different schema or on object storage. I'd welcome pointers to real tiering workloads to measure.All reactions