Tim Berglund
Apache Iceberg and Tableflow
unifying the operational and analytical estates
https://linkedin.com/in/tlberglund
@tlberglund
…but how did we get here?
Iceberg is a format for expressing tabular
data with ACID semantics at scale.
T
The Data Swamp
The Cloud Data Warehouse
❌ Schema
❌ ACID
Let
’
s Build Apache Iceberg
Parquet files
✅ Columnar
✅ Row groups
✅ Integrated metadata
❌ Not a database
Parquet files in a folder
🪣:/lakehouse
orders
2024
2025
01
02
✅ Similar files stored together
✅ Better than nothing
✅ Really quite scalable
❌ Still not a database
Parquet files in a folder
🪣:/lakehouse
orders
2024
2025
01
02
❌ No atomicity
❌ No isolation
❌ No consistency
❌ No actual schema
Parquet files in a folder
🪣:/lakehouse
orders
2024
2025
01
02
❌ No atomicity
❌ No isolation
❌ No consistency
❌ No actual schema
No one will stop this ⬆
Parquet files in a folder
🪣:/lakehouse
orders
2024
2025
01
02
❌ The “table
”
is just whatever
files live in the folder at the
moment.
Manifest File
MANIFEST FILE
✅ JSON file
✅ Column-level stats
✅ List of data files with arbitrary paths
MANIFEST FILE
❌ Doesn
’
t handle multiple ingest events
✅ New definition of my “table
”
Manifest List
MANIFEST FILE
✅ JSON file
✅ Collection of Manifest Files, partitioning information
MANIFEST FILE
✅ Really new definition of my “table
”
MANIFEST LIST
Metadata File
MANIFEST FILE
✅ Another JSON file
✅ Collection of Manifest Lists, various metadata, and snapshots
MANIFEST FILE
✅ This is it. This is what a table is.
MANIFEST LIST
METADATA FILE
SNAPSHOT 0
Full Structure
MANIFEST FILE MANIFEST FILE
MANIFEST LIST
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1 SNAPSHOT 0
Full Structure
MANIFEST FILE MANIFEST FILE
MANIFEST LIST
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1 SNAPSHOT 0
CATALOG
✅ Catalog maps table name
to metadata file snapshot
table “orders“
Iceberg Catalog
CATALOG
✅ JDBC
✅ Any atomic datastore will do
✅ Maps table name to
metadata file snapshot
✅ AWS Glue
✅ Hive Metastore
✅ Nessie
✅ REST Catalog
Write Path
MANIFEST FILE MANIFEST FILE
MANIFEST LIST
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1 SNAPSHOT 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Write Path
MANIFEST FILE MANIFEST FILE
MANIFEST LIST
MANIFEST FILE
MANIFEST LIST
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
QUERY ENGINE
1⃣ Inbound write 2⃣ Get current metadata file
3⃣ Write data files
4⃣ Write manifest file
5⃣ Write manifest list
METADATA FILE
SNAPSHOT 0
METADATA FILE
SNAPSHOT 0
SNAPSHOT 1
6⃣ Write metadata file
with new snapshot
Write Path
MANIFEST FILE MANIFEST FILE
MANIFEST LIST
MANIFEST FILE
MANIFEST LIST
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
QUERY ENGINE
1⃣ Inbound write 2⃣ Get current metadata file
3⃣ Write data files
4⃣ Write manifest file
5⃣ Write manifest list
7⃣ Update/commit catalog
METADATA FILE
SNAPSHOT 0
METADATA FILE
SNAPSHOT 0
SNAPSHOT 1
6⃣ Write metadata file
with new snapshot
Read Path
MANIFEST FILE
MANIFEST LIST
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
QUERY ENGINE
1⃣ Inbound SELECT 2⃣ Get current metadata file
3⃣ Read metadata file
4⃣ Read manifest list
5⃣ Read manifest file
METADATA FILE
SNAPSHOT 0
SNAPSHOT 1
6⃣ Read data file(s)
Copy on Write
1:❤
2:🔥
3:💩
4:🪣
5:🌱
6:🇦🇺
7:🏀
8:😳
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 0
SNAPSHOT 1
❌ But we like updates
✅ Data files are immutable
✅ Suppose we have eight rows
✅ And we update row 5
Copy on Write
1:❤
2:🔥
3:💩
4:🪣
5:🌱
6:🇦🇺
7:🏀
8:😳
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1
SNAPSHOT 2
❌ But we like updates
✅ Data files are immutable
✅ Suppose we have eight rows
✅ And we update row 5
5:😍
6:🇦🇺
Copy on Write (incl. snapshot 1
)
1:❤
2:🔥
3:💩
4:🪣
5:🌱
6:🇦🇺
7:🏀
8:😳
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1
SNAPSHOT 2
❌ But we like updates
✅ Data files are immutable
✅ Suppose we have eight rows
✅ And we update row 5
5:😍
6:🇦🇺
MANIFEST FILE
MANIFEST LIST
Merge on Read
1:❤
2:🔥
3:💩
4:🪣
5:🌱
6:🇦🇺
7:🏀
8:😳
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 0
SNAPSHOT 1
❌ But we like updates
✅ Data files are immutable
❌ No, seriously, we like updates
✅ And we update row 5 again
Merge on Read
1:❤
2:🔥
3:💩
4:🪣
5:🌱
6:🇦🇺
7:🏀
8:😳
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAPSHOT 1
SNAPSHOT 2
DEL
5
5:😍
❌ But we like updates
✅ Data files are immutable
❌ No, seriously, we like updates
✅ And we update row 5 again
✅ We write a delete file, then
the delta
Compute Engines
✅ Flink
✅ Spark
✅ Dremio
✅ Databricks
✅ Snowflake
Tableflow
Kafka
Cluster
Kafka
Cluster
Kafka
Cluster
Traditional Data Lake Ingest
Kafka
Cluster
Kafka
Connect
App
App
App
Kafka
Cluster
Kafka
Cluster
Kafka
Cluster
Traditional Data Lake Ingest
Kafka
Cluster
Kafka
Connect
App
App
App
THE OLD WAY
Separated for generations
Serve the needs of applications
to transact with customers in
real-time
Support after-the-fact business
analysis and reporting for various
stakeholders
OPERATIONAL ESTATE ANALYTICAL ESTATE
Streaming to data lakes is complicated
STREAM INGEST PREP
Type
conversions
Schema
management
Sync metadata to
catalog
Table
maintenance
Ingest Workflow
Silver & Gold
Tables
Business-specific
rules and logic
CDC
materialization
Deduplication
Filtering
Bronze (raw) Tables
Object
Storage
S3
GCS
ABS
Operational Data Analytical Data
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
Tableflow
MANIFEST FILE
MANIFEST LIST
METADATA FILE
SNAP 0
CATALOG
LAYER
CATALOG
METADATA
LAYER
DATA
LAYER
MANIFEST FILE
MANIFEST LIST
SNAP 1
MANIFEST FILE
MANIFEST LIST
SNAP 2
Give Confluent Cloud a try
cnfl.io/cloudmeetupgift
Get $400 worth of free credits for your
first 30 Days.
SKIP THE PAYWALL
CONFLUENTDEV1
Promo Code
Because you’re here
+ another $25 in Credits!

Introduction to Apache Iceberg™ & Tableflow