Topik ini menjelaskan cara menggunakan EMR Serverless Spark untuk melakukan tata kelola penyimpanan pada tabel Apache Iceberg di DLF. Tata kelola penyimpanan membantu mengurangi biaya penyimpanan dan meningkatkan performa kueri. Operasi tata kelola dijalankan secara manual menggunakan prosedur CALL Spark SQL native Iceberg: compacting file kecil, expire snapshot, dan menghapus file orphan.
Ikhtisar
Operasi | Prosedur | Deskripsi |
Compact file kecil |
| Menggabungkan file kecil menjadi ukuran file target untuk meningkatkan performa baca. |
Expire snapshot |
| Menghapus snapshot yang telah kedaluwarsa beserta file data yang dimilikinya secara eksklusif untuk mengurangi beban metadata. |
Hapus file sisa |
| Membersihkan file fisik yang tidak lagi dirujuk oleh metadata tabel, seperti file sisa dari tugas ETL yang gagal atau penghapusan tabel. |
Prasyarat
Ruang kerja EMR Serverless Spark dengan versi engine esr-4.9.1 atau lebih baru (Spark 3.5.2, Scala 2.12) telah dibuat, dan ruang kerja tersebut berada di wilayah yang sama dengan instans DLF Anda.
Katalog DLF target telah diikat ke direktori data ruang kerja, dan otorisasi katalog telah selesai. Untuk DLF User, pilih
AliyunECSInstanceForEMRRole, dan untuk Predefined Permission Type, pilih Data Editor. Untuk informasi selengkapnya, lihat Akses DLF dari Serverless Spark.Akun Anda harus memiliki izin untuk membuat, menulis, dan menghapus tabel pada database target. Jika Anda menggunakan RAM user untuk menjalankan operasi ini, konfigurasikan kebijakan izin RAM tingkat API dan izin DLF tingkat data. Untuk informasi selengkapnya, lihat Konfigurasi izin.
Dependencies dan Konfigurasi
Untuk menggunakan prosedur tersimpan native Iceberg di EMR Serverless Spark, unggah paket dependensi berikut (keduanya tersedia di Maven Central) ke OSS, lalu tambahkan parameter yang sesuai ke konfigurasi pekerjaan Spark Anda.
guava-31.1-jre.jarfailureaccess-1.0.1.jar
Konfigurasi Spark:
spark.emr.serverless.user.defined.jars oss://<bucket>/<path>/guava-31.1-jre.jar,oss://<bucket>/<path>/failureaccess-1.0.1.jar
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsLakukan operasi tata kelola storage
Iceberg menyediakan beberapa prosedur Spark untuk pemeliharaan tabel. Anda dapat menjalankan prosedur ini dalam Spark SQL menggunakan pernyataan CALL.
Saat menggunakan katalog DLF di mesin komputasi, tambahkan akhiran
_icebergpada nama katalog. Misalnya,dlfCatalogNamemenjadidlfCatalogName_iceberg.Penggunaan client Iceberg native memberi Anda akses ke seluruh set prosedur tersimpan Iceberg, seperti
remove_orphan_filesdanexpire_snapshots.
Compact file data
Penulisan batch kecil yang sering dapat menghasilkan banyak file kecil, yang sangat memengaruhi performa baca. Prosedur ini menulis ulang file data dengan mengompaksi file-file tersebut menjadi file yang lebih besar sesuai ukuran target, sehingga mengoptimalkan efisiensi kueri.
-- Penggunaan dasar (mengompaksi file kecil pada tabel yang ditentukan):
CALL dlfCatalogName_iceberg.system.rewrite_data_files('db.table_name');
-- Tentukan strategi kompaksi, kondisi filter, dan ukuran file target:
CALL dlfCatalogName_iceberg.system.rewrite_data_files(
table => 'db.table_name',
strategy => 'binpack',
where => 'date >= "2024-01-01"',
options => map(
'target-file-size-bytes', '536870912',
'min-file-size-bytes', '134217728'
)
);strategy => 'binpack' adalah algoritma bin-packing default (overhead terendah). Gunakan where untuk memfilter berdasarkan partisi atau kondisi, dan options untuk menentukan ukuran file target dalam byte.
Pelajari lebih lanjut tentang prosedur Spark rewrite_data_files dalam dokumentasi Iceberg.
Kedaluwarsakan Snapshot
Iceberg menggunakan snapshot untuk melacak seluruh riwayat perubahan tabel. Seiring waktu, jumlah snapshot yang berlebihan dapat memperbesar metadata dan mengonsumsi ruang penyimpanan yang signifikan. Prosedur ini menghapus snapshot lama yang tidak diperlukan beserta file data terkaitnya.
Saat older_than tidak ditentukan, snapshot yang lebih tua dari 5 hari akan kedaluwarsa secara default.
-- Expire snapshot berdasarkan waktu dan jumlah snapshot yang dipertahankan:
CALL dlfCatalogName_iceberg.system.expire_snapshots(
table => 'db.table_name',
older_than => TIMESTAMP '2024-01-01 00:00:00',
retain_last => 5
);
-- Atau expire snapshot tertentu berdasarkan ID:
CALL dlfCatalogName_iceberg.system.expire_snapshots(
table => 'db.table_name',
snapshot_ids => ARRAY(123456789, 987654321)
);Pelajari lebih lanjut tentang prosedur Spark expire_snapshots dalam dokumentasi Iceberg.
Hapus file orphan
File orphan adalah file fisik yang tidak lagi dirujuk oleh metadata tabel Iceberg mana pun. Menghapus file orphan secara berkala membebaskan ruang penyimpanan.
-- Dry run (menampilkan daftar file tanpa menghapusnya):
CALL dlfCatalogName_iceberg.system.remove_orphan_files(
table => 'db.table_name',
prefix_listing => true,
dry_run => true
);
-- Pembersihan aktual (menentukan waktu dan konkurensi):
CALL dlfCatalogName_iceberg.system.remove_orphan_files(
table => 'db.table_name',
older_than => TIMESTAMP '2024-01-01 00:00:00',
dry_run => false,
max_concurrent_deletes => 4,
prefix_listing => true
);Saat older_than tidak ditentukan, hanya file orphan yang lebih tua dari 3 hari yang dihapus secara default. Kami menyarankan menjalankan dry run (dry_run => true) terlebih dahulu untuk meninjau file yang akan dihapus.
Pelajari lebih lanjut tentang prosedur Spark remove-orphan-files dalam dokumentasi Iceberg.