Dokumen ini menjelaskan cara menggunakan Spark untuk melakukan maintenance tabel Iceberg, seperti menghapus file yang tidak lagi digunakan (orphan files), menghapus snapshot yang kedaluwarsa, dan menulis ulang file data. Operasi-operasi tersebut membantu mengurangi biaya penyimpanan serta meningkatkan performa kueri.
Prasyarat
Persyaratan versi
Spark 4.7.0 atau versi yang lebih baru.
Lengkapi otorisasi katalog yang diperlukan:
Unduh dependensi
Konfigurasi dependensi
Serverless Spark
Unggah keempat paket JAR dependensi ke Object Storage Service (OSS) dan tambahkan konfigurasi Spark berikut ke sesi Anda.
spark.emr.serverless.excludedModules: Harus diatur keiceberg.spark.emr.serverless.user.defined.jars: Jalur OSS ke file JAR dependensi Anda.spark.sql.extensions: Atur keorg.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions.
spark.emr.serverless.excludedModules iceberg
spark.emr.serverless.user.defined.jars oss://${bucket}/iceberg-spark-runtime-3.5_2.12-1.10.1.jar,oss://${bucket}/iceberg-aws-bundle-1.10.1.jar,oss://${bucket}/bennett-iceberg-plugin-2.8.0.jar,oss://${bucket}/guava-31.1-jre.jar
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsGunakan prosedur Spark
Iceberg menyediakan beberapa prosedur Spark untuk maintenance tabel. Anda dapat menjalankan prosedur ini dalam Spark SQL menggunakan pernyataan CALL.
Saat menggunakan katalog DLF (misalnya, dlfCatalogName) di mesin komputasi, aktifkan mode Iceberg native: dlfCatalogName_iceberg.
Untuk menggunakan klien Iceberg native, tambahkan akhiran _iceberg pada nama katalog Anda. Hal ini memungkinkan Anda memanggil prosedur tersimpan Iceberg, seperti remove_orphan_files dan expire_snapshots.
Hapus file yang tidak lagi digunakan (orphan files)
File yang tidak lagi digunakan adalah file fisik yang tidak lagi dirujuk oleh metadata tabel Iceberg mana pun. Menghapus file-file tersebut secara berkala akan membebaskan ruang penyimpanan.
Pada kode berikut, ganti nilai parameter table dengan nama database dan tabel aktual Anda. Kecuali dinyatakan lain, nilai lain tidak perlu diganti.
-- 1. Dry run
-- Menampilkan daftar file yang akan dihapus tanpa benar-benar menghapusnya.
CALL dlfCatalogName_iceberg.system.remove_orphan_files(
table => 'db.table_name',
prefix_listing => true, -- Gunakan fitur prefix listing. Ini secara signifikan meningkatkan performa pemindaian pada layanan penyimpanan objek seperti OSS dan S3.
dry_run => true -- Menjalankan simulasi penghapusan dan mengembalikan daftar file yang akan dihapus.
);
-- 2. Pembersihan default
-- Menghapus file yang tidak lagi digunakan yang berusia lebih dari tiga hari.
CALL dlfCatalogName_iceberg.system.remove_orphan_files(
table => 'db.table_name',
prefix_listing => true
);
-- 3. Atur waktu dan konkurensi
-- Menghapus file yang tidak lagi digunakan yang lebih lama dari timestamp tertentu dan mengaktifkan penghapusan paralel.
CALL dlfCatalogName_iceberg.system.remove_orphan_files(
table => 'db.table_name',
older_than => TIMESTAMP '2024-01-01 00:00:00', -- Ganti dengan timestamp yang diinginkan.
dry_run => false,
max_concurrent_deletes => 4, -- Jumlah thread penghapusan konkuren.
prefix_listing => true
);Pelajari lebih lanjut tentang prosedur Spark remove_orphan_files dalam dokumentasi Iceberg.
Hapus snapshot yang kedaluwarsa
Iceberg menggunakan snapshot untuk melacak seluruh riwayat perubahan tabel. Seiring waktu, jumlah snapshot yang berlebihan dapat memperbesar metadata dan menghabiskan ruang penyimpanan secara signifikan. Prosedur ini menghapus snapshot lama yang tidak diperlukan beserta file data terkaitnya.
-- 1. Pembersihan berbasis waktu
-- Menghapus snapshot yang lebih lama dari timestamp tertentu.
CALL dlfCatalogName_iceberg.system.expire_snapshots(
table => 'db.table_name',
older_than => TIMESTAMP '2024-01-01 00:00:00' -- Ganti dengan timestamp yang diinginkan.
);
-- 2. Pertahankan snapshot terbaru
-- Mempertahankan N snapshot paling baru, terlepas dari usianya.
CALL dlfCatalogName_iceberg.system.expire_snapshots(
table => 'db.table_name',
retain_last => 5
);
-- 3. Hapus snapshot tertentu
-- Menghapus hanya snapshot yang ditentukan dalam daftar ID.
CALL dlfCatalogName_iceberg.system.expire_snapshots(
table => 'db.table_name',
snapshot_ids => ARRAY(123456789, 987654321) -- Ganti dengan ID snapshot yang diinginkan.
);Pelajari lebih lanjut tentang prosedur Spark expire_snapshots dalam dokumentasi Iceberg.
Berkas Data Kompak
Penulisan batch kecil yang sering dapat menghasilkan banyak file kecil, yang sangat memengaruhi performa baca. Prosedur ini menulis ulang file data dengan mengompaksinya menjadi file yang lebih besar sesuai ukuran target, sehingga mengoptimalkan efisiensi kueri.
-- 1. Penulisan ulang default
-- Menulis ulang file menggunakan strategi binpack default.
CALL dlfCatalogName_iceberg.system.rewrite_data_files('db.table_name');
-- 2. Tentukan strategi Binpack (Mengompaksi file kecil menjadi file yang lebih besar dengan algoritma bin-packing sederhana, yang memberikan overhead terendah dan performa tercepat.)
CALL dlfCatalogName_iceberg.system.rewrite_data_files(
table => 'db.table_name',
strategy => 'binpack'
);
-- 3. Tulis ulang dengan kondisi filter
-- Menulis ulang hanya data yang sesuai dengan partisi atau kondisi tertentu.
CALL dlfCatalogName_iceberg.system.rewrite_data_files(
table => 'db.table_name',
where => 'date >= "2024-01-01"' -- 'date' adalah contoh nama kolom dalam tabel. Sesuaikan kondisi filter sesuai kebutuhan.
);
-- 4. Opsi ukuran file kustom
-- Secara eksplisit mengatur ukuran file target (512 MB) dan ambang batas ukuran file input minimum untuk penulisan ulang (128 MB).
CALL dlfCatalogName_iceberg.system.rewrite_data_files(
table => 'db.table_name',
options => map(
'target-file-size-bytes', '536870912',
'min-file-size-bytes', '134217728'
)
);Pelajari lebih lanjut tentang prosedur Spark rewrite_data_files dalam dokumentasi Iceberg.