Prompt dan konteks
Lakehouse Anda menggunakan Spark dan Trino, dan tim menginginkan logical view bersama dengan rollback yang aman. Berdasarkan Apache Iceberg View Spec, rancang publikasi metadata, representasi lintas engine, pembaruan konkuren, rollback, dan validasi kompatibilitas.
Iceberg View Spec memisahkan definisi view dari format metastore khusus engine. Sebuah view tidak berisi data; definisinya berjalan saat direferensikan. Metadata view mencatat skema, versi, representasi SQL, dan log versi. Wawancara ini menguji kontrak lintas engine dan konsistensi publikasi, bukan hanya sintaks CREATE VIEW.
Hal yang dievaluasi pewawancara
Pewawancara mencari batasan antara view dan tabel, penggantian metadata atomik, versi immutable, dan commit optimis. Jawaban yang kuat menjelaskan view-uuid, format-version, current-version-id, versions, dan version-log; menangani perbedaan dialek Spark/Trino, pengeditan konkuren, rollback, evolusi skema, penyegaran cache, dan izin eksekusi.
Pertanyaan klarifikasi
Target berbagi dan eksekusi
Tanyakan engine mana yang harus membaca atau menulis view, apakah pengeditan bersifat dua arah, apakah dialek SQL dapat diterjemahkan, dan seberapa cepat pembaca harus melihat versi baru.
Kebijakan versi dan rollback
Klarifikasi berapa banyak riwayat yang harus disimpan, apakah rollback hanya mengubah pointer saat ini, apakah persetujuan dan audit diperlukan, dan apakah view lama tetap dapat dieksekusi setelah perubahan skema tabel dasar (base table).
Batasan konsistensi dan keamanan
Konfirmasikan bahwa metadata store dan katalog mendukung swap pointer atomik, deteksi konflik, isolasi izin, dan visibilitas regional. Metadata view bersama tidak secara otomatis membagikan akses ke data yang mendasarinya.
Jawaban 30 detik
“Saya akan menulis setiap perubahan view ke file metadata baru yang mandiri (self-contained) dan mengganti lokasi metadata katalog secara atomik. File tersebut menyimpan view-uuid yang stabil, versi format, skema, versions yang immutable, dan version-log yang menjelaskan perubahan pointer saat ini. Setiap versi membawa representasi SQL yang terikat pada dialek engine; Spark dan Trino memublikasikannya hanya setelah pemeriksaan kesetaraan semantik. Writer menggunakan konkurensi optimis dan menghitung ulang dari basis baru setelah terjadi konflik. Rollback mengarahkan current-version-id ke versi yang ada, dengan izin, penyegaran cache, dan kompatibilitas skema dasar diaudit.”
Solusi langkah demi langkah
Langkah 1: Tentukan model metadata view
Buat view-uuid yang stabil, tetapkan format-version ke nilai 1 yang diwajibkan, dan catat lokasi dasar, skema, versi, current-version-id, serta version-log. Gunakan properti untuk komentar atau pengaturan pemeliharaan, bukan untuk state bisnis arbitrer.
Langkah 2: Publikasikan dengan mengganti file secara utuh
Setiap pembaruan membuat file metadata yang lengkap. Lakukan commit dengan menukar pointer katalog secara atomik dari lokasi lama ke lokasi baru. Pembaca terus menggunakan versi yang telah mereka muat hingga mereka menyegarkan lokasinya, sehingga tidak ada kueri yang melihat definisi yang tertulis setengah jalan.
Langkah 3: Jadikan versi immutable dan aman untuk rollback
Sebuah versi berisi ID versi, ID skema, timestamp pembuatan, ringkasan, representasi, dan namespace default. Setelah dibuat, versi tersebut bersifat immutable; setiap perubahan SQL atau representasi akan membuat versi baru. Log versi mencatat perubahan pada current-version-id, sehingga rollback mengarah ke versi lama alih-alih menulis ulang riwayat.
Langkah 4: Tangani representasi SQL lintas engine
Sebuah versi dapat berisi beberapa representasi SQL, tetapi hanya satu per dialek, dan semuanya harus mengekspresikan definisi dasar yang sama. Publisher harus mem-parse, membandingkan tipe kolom, dan membandingkan set hasil representatif untuk Spark, Trino, dan engine lainnya. Engine tanpa representasi yang setara harus menolak eksekusi atau mengikuti fallback eksplisit.
Langkah 5: Tangani konkurensi dan cache
Writer membangun berdasarkan lokasi metadata yang mereka baca; kegagalan swap atomik berarti basis telah berubah. Klien melakukan penyegaran saat ada perubahan pointer katalog atau lokasi metadata alih-alih hanya mengandalkan TTL tetap. Batasi percobaan ulang konflik agar publisher otomatis tidak terus-menerus saling menimpa data.
Langkah 6: Hubungkan evolusi skema dan izin
Skema view adalah bagian dari versinya. Saat kolom dasar dihapus, diganti namanya, atau diubah tipenya, kompilasi dan jalankan kueri representatif di setiap engine target. Audit izin untuk definisi view, tabel dasar, dan katalog secara terpisah; akses baca ke view tidak boleh memberikan akses tulis ke data mentah.
Langkah 7: Validasi, lakukan rollback, dan observasi
Sebelum memublikasikan, jalankan perbandingan semantik lintas engine, pemeriksaan skema hasil, pengujian izin, dan latihan rollback tingkat snapshot. Catat pembuat, versi engine, dialek, konflik commit, keterlambatan penyegaran, kegagalan eksekusi, dan alasan rollback. Batasi riwayat yang disimpan dengan pengaturan pemeliharaan seperti version.history.num-entries dan pantau pertumbuhan metadata.
Jawaban model
Saya akan memperlakukan view sebagai objek logis bersama yang memiliki versi. Pembuatannya menghasilkan view-uuid yang stabil dan versi format 1. Setiap perubahan membuat file metadata lengkap yang berisi skema, versi, representasi, dan log versi, lalu menukar lokasi metadata katalog secara atomik. Versi bersifat immutable; rollback hanya mengarahkan current-version-id ke versi yang ada. Spark dan Trino memublikasikan representasi SQL khusus dialek setelah pemeriksaan parser, tipe kolom, dan kumpulan hasil membuktikan kesetaraan semantik. Writer menggunakan konkurensi optimis dan mencoba kembali dari file baru setelah terjadi konflik. Validasi rilis juga mencakup evolusi skema dasar, penyegaran cache, isolasi izin, auditabilitas, dan eksekusi lintas engine setelah rollback.
Kesalahan umum
- Kesalahan: Menyimpan definisi hanya di metastore satu engine saja. → Alasan gagal: Engine lain tidak dapat membaca atau memodifikasinya secara andal. → Perbaikan: Gunakan metadata view Iceberg bersama dan representasi dialek yang eksplisit.
- Kesalahan: Mengedit file metadata saat ini langsung di tempat (in place). → Alasan gagal: Pembaca mungkin melihat status parsial dan rollback kehilangan batasan yang aman. → Perbaikan: Tulis file baru yang lengkap dan tukar pointer katalog secara atomik.
- Kesalahan: Memperlakukan log versi sebagai timestamp pembuatan. → Alasan gagal: Ini mencatat perubahan current-version-id dan dapat mencakup rollback. → Perbaikan: Pisahkan waktu pembuatan versi dari riwayat pointer.
- Kesalahan: Menulis ulang representasi secara bebas di dalam satu versi. → Alasan gagal: Representasi harus mengekspresikan definisi yang sama dan versi bersifat immutable. → Perbaikan: Buat versi baru dan jalankan pengujian semantik dialek.
Pertanyaan lanjutan dan tanggapan
Mengapa metadata view harus bersifat mandiri (self-contained)?
Pembaca dapat mem-parse skema, versi, dan representasi dari satu lokasi serta melakukan rollback dalam riwayat yang disimpan tanpa bergantung pada side table yang tidak dapat dilacak.
Bagaimana jika dua engine memublikasikan secara bersamaan?
Writer menyertakan lokasi metadata yang mereka baca. Swap atomik menolak satu commit ketika basis telah berubah; writer tersebut membaca ulang, menggabungkan, dan menjalankan ulang validasi lintas engine alih-alih menimpa versi lain secara diam-diam.
Apakah rollback menghancurkan riwayat?
Tidak. Rollback menambahkan perubahan pointer log versi yang menyetel current-version-id ke versi sebelumnya. Versi lama dan entri log sebelumnya tetap dapat diaudit.
Bagaimana jika tabel dasar menghapus sebuah kolom?
Perlakukan itu sebagai gerbang kompatibilitas sebelum memublikasikan versi view baru. Kompilasi dan jalankan kueri representatif di setiap dialek yang didukung. Blokir publikasi atau tandai engine sebagai tidak didukung alih-alih menemukan kerusakan di lingkungan produksi.