All Products
Search
Document Center

Data Lake Formation:Tata Kelola tabel Iceberg dengan EMR Serverless Spark

Last Updated:Jul 17, 2026

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

rewrite_data_files

Menggabungkan file kecil menjadi ukuran file target untuk meningkatkan performa baca.

Expire snapshot

expire_snapshots

Menghapus snapshot yang telah kedaluwarsa beserta file data yang dimilikinya secara eksklusif untuk mengurangi beban metadata.

Hapus file sisa

remove_orphan_files

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.jar

  • failureaccess-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.IcebergSparkSessionExtensions

Lakukan operasi tata kelola storage

Iceberg menyediakan beberapa prosedur Spark untuk pemeliharaan tabel. Anda dapat menjalankan prosedur ini dalam Spark SQL menggunakan pernyataan CALL.

Catatan
  • Saat menggunakan katalog DLF di mesin komputasi, tambahkan akhiran _iceberg pada nama katalog. Misalnya, dlfCatalogName menjadi dlfCatalogName_iceberg.

  • Penggunaan client Iceberg native memberi Anda akses ke seluruh set prosedur tersimpan Iceberg, seperti remove_orphan_files dan expire_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.

Catatan

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.