Apache Iceberg: Format Tabel Lintas-Engine untuk Lakehouse
Apache Iceberg adalah format tabel terbuka yang mengubah sekumpulan file Parquet (atau ORC/Avro) di object storage menjadi tabel sungguhan dengan snapshot, evolusi skema, dan penulisan konkuren yang aman. Yang membedakannya dari format lakehouse lain adalah desain yang berpusat pada katalog serta hidden partitioning: tabel didefinisikan oleh penunjuk katalog ke sebuah pohon metadata, dan partisi merupakan properti tabel, bukan sesuatu yang harus disebutkan setiap kueri. Tutorial ini membahas Iceberg dari dasar dengan PyIceberg sebagai jalur utama praktik, lalu menunjukkan tabel yang sama dari Spark SQL serta catatan bagaimana DuckDB dan Trino membacanya.
Apa Itu Iceberg dan Mengapa Format Tabel Penting
Data lake biasa hanyalah file di dalam bucket. Parquet memberi penyimpanan kolumnar yang efisien, tetapi sebuah folder berisi file Parquet bukanlah tabel: tidak ada commit atomik, tidak ada skema yang disepakati, tidak ada cara mengetahui file mana yang aktif, dan tidak ada cara aman bagi dua job untuk menulis bersamaan. Pembaca yang memindai direktori saat penulis sedang bekerja bisa mengambil data yang setengah jadi.
Sebuah format tabel menyelesaikan ini dengan menambahkan lapisan metadata di atas file data. Metadata itu menjawab tiga pertanyaan secara presisi:
- File mana saja yang membentuk tabel saat ini (dan pada titik waktu mana pun di masa lalu)?
- Apa skemanya, dan bagaimana skema itu berubah?
- Bagaimana tata letak data agar kueri bisa melewati file yang tidak diperlukan?
Jawaban Iceberg adalah pohon file metadata yang bersifat immutable ditambah sebuah katalog yang menyimpan satu penunjuk ke puncak pohon tersebut. Menukar penunjuk itu secara atomik adalah inti dari sebuah commit. Karena setiap file metadata immutable, pembaca selalu melihat snapshot yang konsisten dan tidak pernah menjumpai tulisan yang separuh jadi.
Bagaimana Iceberg Berbeda dari Delta Lake dan Hudi
Ketiganya adalah format tabel terbuka di atas file kolumnar, tetapi pilihan desainnya berbeda:
- Iceberg melacak status melalui penunjuk katalog dan pohon file metadata/manifest. Partisi bersifat hidden — dideklarasikan pada tabel dan diterapkan otomatis — dan Iceberg secara eksplisit lintas-engine, dengan spesifikasi stabil yang diimplementasikan oleh Spark, Flink, Trino, DuckDB, Snowflake, dan PyIceberg murni-Python.
- Delta Lake melacak status melalui log transaksi JSON terurut (
deltalog) yang menyatu dengan data. Partisi mengikuti tata letak direktori fisik, dan ekosistemnya secara historis berpusat di Spark (meskidelta-rsmemperluasnya). - Hudi berfokus pada upsert cepat dan aliran inkremental, dengan timeline commit serta model record-key/primary-key yang kuat. Cocok untuk beban kerja CDC yang berat.
Intinya secara praktis: pilih Iceberg ketika Anda ingin banyak engine membaca dan menulis tabel yang sama melalui katalog bersama, dan ketika Anda ingin perubahan partisi serta skema menjadi operasi metadata, bukan penulisan ulang data.
Arsitektur Iceberg
Tabel Iceberg adalah pohon berlapis. Dari atas ke bawah:
Catalog (menunjuk ke metadata file aktif per tabel)
└─ metadata.json (skema tabel, partition spec, daftar snapshot, id snapshot aktif)
└─ manifest list (satu file Avro per snapshot; mendaftar manifest dalam snapshot itu)
└─ manifest files (Avro; tiap file mendaftar data file + statistik & nilai partisi)
└─ data files (Parquet / ORC / Avro yang menampung baris sebenarnya)
Dibaca dari atas ke bawah: