Keep every table healthy without deciding when or how.
Cryo reads your catalogs, plans compaction and cleanup, and admits the work to its native engine when the cluster has headroom — every decision explained.
Cryo in the lakehouseOperators, catalogs and engines you already run sit on the left. Cryo is the control plane in the middle: it scans catalogs, plans work, and admits it to Trino or Spark. Object storage stays on the lake side. Cryo is not a catalog.You already runCryo control planeStores and deployData lakewriteIceberg tablesNo SQL in the plannerA receipt per actionOperatorsCatalogsEnginesMonitorsIceberg RESTApache HiveAWS GlueTrinoSpark on EMRHTTP APIFastAPIScannermetadata onlyPlanneremits no SQLGovernoradmits against loadSchedulerdue presetsWorkersone table at a timePostgreSQLRedisKubernetesHelmAmazon S3object storageIceberg filesengines write hereUnread by scandata files stay put
Follow a 1 TB Iceberg table through a month of streaming writes, then through each Cryo operation in order. Beside it: what is inside the table, and what S3 charges for it.
Monthly bill$23.53Healthy. What this table should cost.
1 TB of events in about 2,000 Parquet files of 512 MB, one partition per day. A dashboard that reads one day opens 66 files. Beside it is the table as Cryo sees it: a core sample, cut open so you can see inside.
What it costs $23.00 a month to store. $0.53 a month in GET requests for 20,000 dashboard queries.
Day 1$23.53→Day 30$110.724.7× the bill for the same rows
A job commits every five minutes, 288 times a day. Each commit adds a few small files and a snapshot. Upserts add delete files instead of rewriting rows, and failed tasks leave files that no snapshot ever recorded. Scroll slowly and watch the day count.
In plain terms S3 charges postage per envelope, not per page. The table still holds 1 TB of rows, but it now arrives in 250,000 envelopes.
What decayed 250,000 files of about 4 MB, 40,000 delete files, 8,640 snapshots, 300 GB of replaced files that old snapshots still hold, and 100 GB of orphans.
What it costs The same rows now cost $110.72 a month. Storage rose to $33.12, but requests rose more: one day of data is about 9,700 files, so the same dashboards make 194 million GETs, $77.60.
The cost that isn't on the bill When 50 dashboards refresh at 9 a.m., they ask this table for 485,000 files at once. S3 supports at least 5,500 GET requests a second per prefix and scales up gradually; while it scales, it answers 503 Slow Down. AWS
Step 1 of 6 · convert_deletes · rewrite_position_deletes
On a merge-on-read table, every read opens the delete files for its partition and filters rows out as it scans. That work is not done once. It is repeated by every one of the 20,000 queries this month.
In plain terms A report with a stack of correction slips. Every reader checks every slip, every time, before trusting a line.
What Cryo doesconvert_deletes writes the deletes into new data files. On Spark, rewrite_position_deletes first merges small position-delete files.
On the bill A one-day query drops from about 9,700 files to 8,333, and requests fall to $66.66. The replaced files stay until their snapshots expire, so storage rises to $35.42.
Every file a query opens costs at least one GET and one round trip to S3. Cryo rewrites each day into 512 MB files, a few partitions per chunk, and only while Trino has headroom. An oversized partition runs alone. This step is the picture in Cryo's logo: small cubes fused into one block.
In plain terms Binding loose pages back into books. The same words, for a fraction of the postage.
On the bill One day of data is 66 files again. Requests drop from $66.66 to $0.53 a month.
Storage went up, not down. Compaction writes new files, and old snapshots still reference the old ones, so S3 now holds both: 2.54 TB, $58.42 a month. Cleanup is what turns compaction into savings.
The cost that isn't on the bill Even a healthy small GET waits tens of milliseconds for S3 to answer. With 64 readers in parallel, 9,700 files is about 150 rounds of that wait before the last file arrives. 66 files is two. AWS
Join plansguessed→Afterfrom real countsSame bill, better plans
Trino chooses join order, and whether to broadcast a table to every node, from table statistics. After a month of writes, the distinct-value counts on this table are missing or stale.
In plain terms A road map with distances. Without one, you drive the roads in the order someone wrote them down.
What Cryo does Collects distinct-value counts into a Puffin statistics file and registers it in the table metadata.
On the bill No change. Joins against this table are planned from counts instead of guesses.
The cost that isn't on the bill Without statistics, Trino stops reordering joins and runs them in the order the SQL lists them. Trino
Manifests per plan640→After1253× less to read first
Before it reads any data, a query reads the manifest list, then every manifest that might match its filter. 288 commits a day leave hundreds of small manifests behind.
In plain terms A library catalogue spread over 640 thin drawers instead of 12 full ones. The same cards, but many more drawers to open before you find a book.
What Cryo does Rewrites them into a few large manifests grouped by partition.
On the bill Planning reads 12 manifests instead of 640. Queries start sooner; the bill barely moves.
Iceberg deletes a data file only when no snapshot references it. Every file that compaction replaced is still sitting in the old layers, and still on the bill.
In plain terms Keeping every saved version of a document. Each one looks free. Together they are now the biggest line on the bill, $33.12, more than the live data.
What Cryo does Keeps 7 days of snapshots by default. For a table that commits 288 times a day and already carries 8,640 snapshots, it shortens retention to 1 day. On Trino, lower the catalog's iceberg.expire-snapshots.min-retention from its 7-day default first, or Trino rejects anything shorter.
On the bill 1.44 TB leaves S3. Storage falls from $58.42 to $25.30 a month, and one day of time travel remains.
The cost that isn't on the bill A row you deleted, for a GDPR request say, still exists in old files until the snapshots holding them expire. And every commit writes a new metadata file that lists every snapshot, so 8,640 of them make that first read of every query longer. Iceberg
Failed writes and retried tasks leave files in the table's S3 prefix that no snapshot ever recorded. Expiring snapshots cannot find them, because nothing points to them, so they stay on the bill for good.
In plain terms Boxes in a storage unit with no label and no inventory entry. Nobody will ever ask for them, and the rent still comes every month.
What Cryo does Lists the table location and deletes files that no metadata references and that are older than 7 days, so writes still in flight are never touched.
On the bill 100 GB gone. Storage is back to $23.00.
Day 30$110.72→After one run$23.5379% less, every month
One run took the table from $110.72 to $23.53 a month. Each step wrote an audit row with the table, operation, engine, status and duration, so the saving can be checked, not just claimed.
Illustrative example: one 1 TB table partitioned by day, a commit every five minutes, and 20,000 dashboard queries a month that each read one day. Prices are S3 Standard in us-east-1: $0.023 per GB-month and $0.0004 per 1,000 GET requests. Request counts assume one GET per file opened, which is a floor. Each step is shown at full effect with no new writes in between. File lifecycle follows the Iceberg maintenance docs. Cryo's scanner reports the real numbers for your tables.