Mengoptimalkan kinerja tulis - AWS Panduan Preskriptif

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengoptimalkan kinerja tulis

Bagian ini membahas properti tabel yang dapat Anda atur untuk mengoptimalkan kinerja tulis pada tabel Iceberg, terlepas dari mesin.

Mengatur modus distribusi tabel

Iceberg menawarkan beberapa mode distribusi tulis yang menentukan bagaimana data tulis didistribusikan di seluruh tugas Spark. Untuk gambaran umum tentang mode yang tersedia, lihat Menulis Mode Distribusi dalam dokumentasi Gunung Es.

Untuk kasus penggunaan yang memprioritaskan kecepatan tulis, terutama dalam beban kerja streaming, atur ke. write.distribution-mode none Ini memastikan bahwa Iceberg tidak meminta pengocokan Spark tambahan dan data tersebut ditulis saat tersedia dalam tugas Spark. Mode ini sangat cocok untuk aplikasi Streaming Terstruktur Spark.

catatan

Mengatur mode distribusi tulis none cenderung menghasilkan banyak file kecil, yang menurunkan kinerja baca. Kami merekomendasikan pemadatan reguler untuk mengkonsolidasikan file-file kecil ini ke dalam file berukuran benar untuk kinerja kueri.

Pilih strategi pembaruan yang tepat

Gunakan merge-on-read strategi untuk mengoptimalkan kinerja penulisan, ketika operasi baca yang lebih lambat pada data terbaru dapat diterima untuk kasus penggunaan Anda.

Saat Anda menggunakan merge-on-read, Iceberg menulis pembaruan dan menghapus ke penyimpanan sebagai file kecil yang terpisah. Saat tabel dibaca, pembaca harus menggabungkan perubahan ini dengan file dasar untuk mengembalikan tampilan data terbaru. Ini menghasilkan penalti kinerja untuk operasi baca, tetapi mempercepat penulisan pembaruan dan penghapusan. Biasanya, merge-on-read sangat ideal untuk streaming beban kerja dengan pembaruan atau pekerjaan dengan beberapa pembaruan yang tersebar di banyak partisi tabel.

Anda dapat mengatur merge-on-read konfigurasi (write.update.mode,write.delete.mode, danwrite.merge.mode) di tingkat tabel atau secara independen di sisi aplikasi.

Menggunakan merge-on-read membutuhkan menjalankan pemadatan reguler untuk mencegah kinerja baca menurun dari waktu ke waktu. Pemadatan merekonsiliasi pembaruan dan penghapusan dengan file data yang ada untuk membuat kumpulan file data baru, sehingga menghilangkan penalti kinerja yang terjadi di sisi baca. Secara default, pemadatan Iceberg tidak menggabungkan file hapus kecuali Anda mengubah default delete-file-threshold properti ke nilai yang lebih kecil (lihat dokumentasi Iceberg). Untuk mempelajari lebih lanjut tentang pemadatan, lihat bagian Pemadatan gunung es nanti di panduan ini.

Pilih format file yang tepat

Iceberg mendukung penulisan data dalam format Parket, ORC, dan Avro. Parket adalah format default. Parket dan ORC adalah format kolom yang menawarkan kinerja baca yang unggul tetapi umumnya lebih lambat untuk ditulis. Ini mewakili trade-off khas antara kinerja baca dan tulis.

Jika kecepatan tulis penting untuk kasus penggunaan Anda, seperti dalam beban kerja streaming, pertimbangkan untuk menulis dalam format Avro dengan menyetel write-format ke Avro opsi penulis. Karena Avro adalah format berbasis baris, Avro memberikan waktu tulis yang lebih cepat dengan mengorbankan kinerja baca yang lebih lambat.

Untuk meningkatkan kinerja baca, jalankan pemadatan reguler untuk menggabungkan dan mengubah file Avro kecil menjadi file Parket yang lebih besar. Hasil dari proses pemadatan diatur oleh pengaturan write.format.default tabel. Format default untuk Iceberg adalah Parquet, jadi jika Anda menulis di Avro dan kemudian menjalankan pemadatan, Iceberg akan mengubah file Avro menjadi file Parket. Inilah contohnya:

spark.sql(f""" CREATE TABLE IF NOT EXISTS glue_catalog.{DB_NAME}.{TABLE_NAME} ( Col_1 float, <<<…other columns…>> ts timestamp) USING iceberg PARTITIONED BY (days(ts)) OPTIONS ( 'format-version'='2', write.format.default'=parquet) """) query = df \ .writeStream \ .format("iceberg") \ .option("write-format", "avro") \ .outputMode("append") \ .trigger(processingTime='60 seconds') \ .option("path", f"glue_catalog.{DB_NAME}.{TABLE_NAME}") \ .option("checkpointLocation", f"s3://{BUCKET_NAME}/checkpoints/iceberg/") .start()