Pengoptimalan tabel Delta Lake dan V-Order

Format tabel Lakehouse dan Delta Lake berpusat pada Microsoft Fabric, memastikan bahwa tabel dioptimalkan untuk analitik adalah persyaratan utama. Panduan ini mencakup konsep pengoptimalan tabel Delta Lake, konfigurasi, dan cara menerapkannya ke pola penggunaan Big Data yang paling umum.

Apa itu V-Order?

V-Order adalah pengoptimalan waktu tulis ke format file parket yang memungkinkan pembacaan cepat kilat di bawah mesin komputasi Microsoft Fabric, seperti Power BI, SQL, Spark, dan lainnya.

Mesin Power BI dan SQL menggunakan teknologi Microsoft Verti-Scan dan file parket yang diurutkan V untuk mencapai dalam memori seperti waktu akses data. Spark dan mesin komputasi non-Verti-Scan lainnya juga mendapat manfaat dari file V-Ordered dengan rata-rata 10% waktu baca yang lebih cepat, dengan beberapa skenario hingga 50%.

V-Order bekerja dengan menerapkan pengurutan khusus, distribusi grup baris, pengodean kamus, dan kompresi pada file parket, sehingga membutuhkan lebih sedikit sumber daya jaringan, disk, dan CPU di mesin komputasi untuk membacanya, memberikan efisiensi dan performa biaya. Pengurutan V-Order memiliki dampak 15% pada waktu penulisan rata-rata tetapi memberikan kompresi hingga 50% lebih banyak.

Ini sesuai dengan format parket sumber terbuka 100%; semua mesin parket dapat membacanya sebagai file parket biasa. Tabel Delta lebih efisien dari sebelumnya; fitur seperti Z-Order kompatibel dengan V-Order. Properti tabel dan perintah pengoptimalan dapat digunakan pada kontrol V-Order pada partisinya.

V-Order diterapkan pada tingkat file parquet. Tabel delta dan fitur-fiturnya, seperti Z-Order, pemadatan, vakum, perjalanan waktu, dll adalah ortogonal ke V-Order, dengan demikian, kompatibel dan dapat digunakan bersama-sama untuk manfaat tambahan.

Mengontrol penulisan V-Order

V-Order diaktifkan secara default di Microsoft Fabric dan di Apache Spark dikontrol oleh konfigurasi berikut.

Konfigurasi Nilai default Deskripsi
spark.sql.parquet.vorder.enabled benar Mengontrol penulisan V-Order tingkat sesi.
TBLPROPERTIES("delta.parquet.vorder.enabled") salah Mode Urutan-V default pada tabel
Opsi penulis dataframe: parquet.vorder.enabled batalkan set Mengontrol penulisan V-Order menggunakan penulis Dataframe

Gunakan perintah berikut untuk mengontrol penggunaan penulisan V-Order.

Periksa konfigurasi V-Order dalam sesi Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled 

Menonaktifkan penulisan V-Order dalam sesi Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled=FALSE 

Mengaktifkan penulisan V-Order dalam sesi Apache Spark

Penting

Saat diaktifkan di tingkat sesi. Semua penulisan parkquet dibuat dengan V-Order diaktifkan. Ini termasuk tabel parket non-Delta dan tabel Delta dengan properti tabel diatur parquet.vorder.enabled ke true atau false.

%%sql 
SET spark.sql.parquet.vorder.enabled=TRUE 

Mengontrol V-Order menggunakan properti tabel Delta

Aktifkan properti tabel V-Order selama pembuatan tabel:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

Penting

Ketika properti tabel diatur ke benar, PERINTAH INSERT, UPDATE, dan MERGE akan berperilaku seperti yang diharapkan dan melakukan pengoptimalan write-time. Jika konfigurasi sesi V-Order diatur ke true atau spark.write memungkinkannya, maka tulisan akan menjadi V-Order bahkan jika TBLPROPERTIES diatur ke false.

Aktifkan atau nonaktifkan V-Order dengan mengubah properti tabel:

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

Setelah Anda mengaktifkan atau menonaktifkan V-Order menggunakan properti tabel, hanya penulisan mendatang ke tabel yang terpengaruh. File parket menyimpan pengurutan yang digunakan saat dibuat. Untuk mengubah struktur fisik saat ini untuk menerapkan atau menghapus V-Order, baca bagian "Control V-Order saat mengoptimalkan tabel" di bawah ini.

Mengontrol V-Order secara langsung pada operasi tulis

Semua perintah tulis Apache Spark mewarisi pengaturan sesi jika tidak eksplisit. Semua perintah berikut menulis menggunakan V-Order dengan mewarisi konfigurasi sesi secara implisit.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

Penting

V-Order hanya berlaku untuk file yang terpengaruh oleh predikat.

Dalam sesi di mana spark.sql.parquet.vorder.enabled tidak diatur atau diatur ke false, perintah berikut akan menulis menggunakan V-Order:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .option("parquet.vorder.enabled ","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()

Apa itu Optimize Write?

Beban kerja analitis pada mesin pemrosesan Big Data seperti Apache Spark bekerja paling efisien saat menggunakan ukuran file lebih besar yang distandarkan. Hubungan antara ukuran file, jumlah file, jumlah pekerja Spark dan konfigurasinya, memainkan peran penting terhadap performa. Menyerap data ke dalam tabel data lake mungkin memiliki karakteristik warisan dari terus-menerus menulis banyak file kecil; skenario ini umumnya dikenal sebagai "masalah file kecil."

Optimize Write adalah fitur Delta Lake di Microsoft Fabric dan Azure Synapse Analytics di mesin Apache Spark yang mengurangi jumlah file yang ditulis dan bertujuan untuk meningkatkan ukuran file individual data tertulis. Ukuran file target dapat diubah per persyaratan beban kerja menggunakan konfigurasi.

Fitur ini diaktifkan secara default di Microsoft Fabric Runtime untuk Apache Spark. Untuk mempelajari selengkapnya tentang Optimalkan skenario penggunaan Tulis, baca artikel Kebutuhan untuk mengoptimalkan penulisan di Apache Spark.

Pengoptimalan penggabungan

Perintah Delta Lake MERGE memungkinkan pengguna memperbarui tabel delta dengan kondisi tingkat lanjut. Ini dapat memperbarui data dari tabel sumber, tampilan, atau DataFrame ke dalam tabel target dengan menggunakan perintah MERGE. Namun, algoritma saat ini dalam distribusi sumber terbuka Delta Lake tidak sepenuhnya dioptimalkan untuk menangani baris yang tidak dimodifikasi. Tim Microsoft Spark Delta menerapkan pengoptimalan Penggabungan Acak Rendah kustom, baris yang tidak dimodifikasi dikecualikan dari operasi pengacakan mahal yang diperlukan untuk memperbarui baris yang cocok.

Implementasi dikontrol oleh spark.microsoft.delta.merge.lowShuffle.enabled konfigurasi, diaktifkan secara default dalam runtime. Ini tidak memerlukan perubahan kode dan sepenuhnya kompatibel dengan distribusi sumber terbuka Delta Lake. Untuk mempelajari selengkapnya tentang skenario penggunaan Penggabungan Acak Rendah, baca artikel Pengoptimalan Penggabungan Acak Rendah pada tabel Delta.

Pemeliharaan tabel Delta

Saat tabel Delta berubah, performa dan efisiensi biaya penyimpanan cenderung menurup karena alasan berikut:

  • Data baru yang ditambahkan ke tabel mungkin menyimpang data.
  • Tingkat penyerapan data batch dan streaming mungkin membawa banyak file kecil.
  • Operasi pembaruan dan penghapusan akhirnya membuat overhead baca; file parket tidak dapat diubah berdasarkan desain, sehingga tabel Delta menambahkan file parket baru dengan set perubahan, semakin memperkuat masalah yang diberlakukan oleh dua item pertama.
  • Tidak lagi diperlukan file data dan file log yang tersedia di penyimpanan.

Untuk menjaga tabel tetap pada status terbaik untuk performa terbaik, lakukan pemadatan bin, dan operasi vakum dalam tabel Delta. Pemadatan bin dicapai oleh perintah OPTIMIZE ; ini menggabungkan semua perubahan menjadi file parket yang lebih besar dan terkonsolidasi. Pembersihan penyimpanan dereferensi dicapai oleh perintah VACUUM .

Perintah pemeliharaan tabel OPTIMIZE dan VACUUM dapat digunakan dalam notebook dan Definisi Pekerjaan Spark, lalu diorkestrasi menggunakan kemampuan platform. Lakehouse in Fabric menawarkan fungsionalitas untuk menggunakan antarmuka pengguna untuk melakukan pemeliharaan tabel ad-hoc seperti yang dijelaskan dalam artikel pemeliharaan tabel Delta Lake.

Penting

Merancang struktur fisik tabel dengan benar, berdasarkan frekuensi penyerapan dan pola baca yang diharapkan, kemungkinan lebih penting daripada menjalankan perintah pengoptimalan yang dijelaskan di bagian ini.

Mengontrol Urutan V saat mengoptimalkan tabel

Perintah berikut menyusun bin-compact dan menulis ulang semua file yang terpengaruh menggunakan V-Order, terlepas dari pengaturan TBLPROPERTIES atau pengaturan konfigurasi sesi:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

Ketika ZORDER dan VORDER digunakan bersama-sama, Apache Spark melakukan pemadatan bin, ZORDER, VORDER secara berurutan.

Perintah berikut ini membingungkan dan menulis ulang semua file yang terpengaruh menggunakan pengaturan TBLPROPERTIES. Jika TBLPROPERTIES diatur true ke V-Order, semua file yang terpengaruh ditulis sebagai V-Order. Jika TBLPROPERTIES tidak diatur atau diatur ke false ke V-Order, TBLPROPERTIES mewarisi pengaturan sesi; jadi untuk menghapus V-Order dari tabel, atur konfigurasi sesi ke false.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];