Praktik terbaik: Delta Lake
Artikel ini menjelaskan praktik terbaik saat menggunakan Delta Lake.
Databricks merekomendasikan penggunaan pengoptimalan prediktif. Lihat pengoptimalan prediktif untuk Unity Catalogtablesterkelola .
Saat menghapus dan membuat ulang table di lokasi yang sama, Anda harus selalu menggunakan pernyataan CREATE OR REPLACE TABLE
. Lihat Hapus atau ganti Delta table.
Remove konfigurasi lama Delta
Databricks merekomendasikan untuk menghapus sebagian besar konfigurasi Delta lama yang eksplisit dari konfigurasi Spark dan properti table saat meningkatkan ke versi Runtime Databricks baru. Konfigurasi lama dapat mencegah pengoptimalan baru dan values default yang diperkenalkan oleh Databricks untuk diterapkan pada beban kerja yang telah dimigrasikan.
Menggunakan pengklusteran cairan untuk melewatkan data yang dioptimalkan
Databricks merekomendasikan penggunaan pengklusteran cair daripada pemartisian, urutan Z, atau strategi organisasi data lainnya untuk optimize tata letak data untuk melewatkan data. Lihat Menggunakan pengklusteran cairan untuk Delta tables.
File ringkas
Pengoptimalan prediktif secara otomatis menjalankan perintah OPTIMIZE
dan VACUUM
pada Unity Catalog terkelola tables. Lihat pengoptimalan prediktif untuk Unity terkelola Catalogtables.
Databricks merekomendasikan untuk sering menjalankan perintah OPTIMIZE untuk memampatkan file kecil.
Catatan
Operasi ini tidak melakukan remove pada berkas lama. Untuk remove, jalankan perintah VACUUM.
Mengganti konten atau schematable
Terkadang Anda mungkin ingin mengganti Delta table. Contohnya:
- Anda menemukan data di table salah dan ingin mengganti konten.
- Anda ingin menulis ulang seluruh table untuk melakukan perubahan schema yang tidak kompatibel (seperti mengubah jenis column).
Meskipun Anda dapat menghapus seluruh direktori table Delta dan membuat table baru di jalur yang sama, tidak direkomendasikan karena:
- Menghapus direktori tidak efisien. Direktori yang berisi file yang sangat besar dapat memakan waktu berjam-jam atau bahkan berhari-hari untuk dihapus.
- Anda kehilangan semua konten dalam file yang dihapus; sulit untuk pulih jika Anda menghapus tableyang salah.
- Penghapusan direktori bukan atom. Saat Anda menghapus table, kueri yang bersamaan membaca table bisa gagal atau mengalami tableyang parsial.
Jika Anda tidak perlu mengubah tableschema, Anda dapat menghapus data dari table Delta dan insert data baru Anda, atau updatetable untuk memperbaiki valuesyang salah.
Jika Anda ingin mengubah tableschema, Anda dapat mengganti seluruh table secara atomik. Contohnya:
Python
dataframe.write \
.mode("overwrite") \
.option("overwriteSchema", "true") \
.saveAsTable("<your-table>") # Managed table
dataframe.write \
.mode("overwrite") \
.option("overwriteSchema", "true") \
.option("path", "<your-table-path>") \
.saveAsTable("<your-table>") # External table
SQL
REPLACE TABLE <your-table> AS SELECT ... -- Managed table
REPLACE TABLE <your-table> LOCATION "<your-table-path>" AS SELECT ... -- External table
Scala
dataframe.write
.mode("overwrite")
.option("overwriteSchema", "true")
.saveAsTable("<your-table>") // Managed table
dataframe.write
.mode("overwrite")
.option("overwriteSchema", "true")
.option("path", "<your-table-path>")
.saveAsTable("<your-table>") // External table
Ada banyak manfaat dengan pendekatan ini:
- Menimpa table jauh lebih cepat karena tidak perlu melakukan list pada direktori secara rekursif atau menghapus file apa pun.
- Versi lama table masih ada. Jika Anda menghapus table yang salah, Anda dapat mengambil kembali data lama dengan mudah menggunakan perjalanan waktu. Lihat Bekerja dengan riwayat Delta Lake table.
- Ini adalah operasi atom. Pertanyaan yang dilakukan secara bersamaan masih dapat membaca table sementara Anda menghapus table.
- Karena jaminan transaksi Delta Lake ACID, jika penggantian table gagal, table akan kembali ke keadaan sebelumnya.
Selain itu, jika Anda ingin menghapus file lama agar bisa menghemat biaya penyimpanan setelah menimpa table, Anda dapat menggunakan VACUUM untuk menghapus file tersebut. Ini dioptimalkan untuk penghapusan file dan biasanya lebih cepat daripada menghapus seluruh direktori.
Penembolokan Spark
Databricks tidak menyarankan Anda untuk menggunakan penembolokan Spark untuk alasan berikut:
- Anda kehilangan data yang melompat-lompat yang dapat berasal dari filter tambahan yang ditambahkan di atas cache
DataFrame
. - Data yang di-cache mungkin tidak diperbarui jika table diakses menggunakan identifieryang berbeda.
Perbedaan antara Delta Lake dan Parquet di Apache Spark
Delta Lake menangani operasi berikut secara otomatis. Anda tidak boleh melakukan operasi ini secara manual:
-
REFRESH TABLE
: Delta tables selalu mengembalikan informasi up-to-date yang paling up-to, sehingga tidak perlu memanggilREFRESH TABLE
secara manual setelah perubahan. -
Tambah dan remove partisi: Delta Lake secara otomatis melacak jumlah set partisi yang ada dalam table dan memperbarui list saat data ditambahkan atau dihapus. Sehingga, tidak perlu menjalankan
ALTER TABLE [ADD|DROP] PARTITION
atauMSCK
. -
Memuat satu partition: Membaca partisi secara langsung tidak diperlukan. Misalnya, Anda tidak perlu menjalankan
spark.read.format("parquet").load("/data/date=2017-01-01")
. Sebagai gantinya, gunakan klausulWHERE
untuk melewatkan data, sepertispark.read.table("<table-name>").where("date = '2017-01-01'")
. - Jangan memodifikasi file data secara manual: Delta Lake menggunakan log transaksi untuk menerapkan perubahan pada table secara atomik. Jangan langsung mengubah, menambahkan, atau menghapus file data Parquet di Delta table, karena ini dapat menyebabkan kehilangan data atau table kerusakan.
Meningkatkan performa untuk penggabungan Delta Lake
Anda dapat mengurangi waktu yang diperlukan untuk menggabungkan dengan menggunakan pendekatan berikut:
Kurangi ruang pencarian untuk kecocokan: Secara default, operasi
merge
mencari seluruh table Delta untuk menemukan kecocokan di sumber table. Salah satu cara untuk mempercepatmerge
adalah dengan mengurangi ruang pencarian dengan menambahkan batasan yang diketahui dalam kondisi pencocokan. Misalnya, Anda memiliki table yang dipartisi olehcountry
dandate
dan Anda ingin menggunakanmerge
untuk update informasi untuk hari terakhir dan negara tertentu. Menambahkan kondisi berikut membuat kueri lebih cepat, karena hanya mencari kecocokan di partisi yang relevan:events.date = current_date() AND events.country = 'USA'
Selain itu, kueri ini juga mengurangi kemungkinan konflik dengan operasi bersamaan lainnya. Lihat Tingkat isolasi dan tulis konflik di Azure Databricks untuk detail selengkapnya.
File ringkas: Jika data disimpan dalam banyak file kecil, proses membaca data untuk mencari kecocokan bisa menjadi lambat. Anda dapat meringkas file berukuran kecil ke dalam file yang berukuran lebih besar untuk meningkatkan throughput baca. Lihat tata letak file data Optimize untuk detailnya.
Mengontrol partisi acak untuk menulis: Operasi
merge
mengacak data beberapa kali untuk melakukan komputasi dan menulis data yang telah diperbarui. Jumlah tugas yang digunakan untuk mengacak dikontrol oleh konfigurasispark.sql.shuffle.partitions
sesi Spark. Mengatur parameter ini tidak hanya mengontrol paralelisme, tetapi juga menentukan jumlah file output. Meningkatkan nilai turut meningkatkan paralelisme, tetapi juga menghasilkan sejumlah besar file data yang lebih kecil.Aktifkanpenulisan yang dioptimalkan: Untuk tablesyang dipartisi,
merge
dapat menghasilkan sejumlah besar file kecil daripada jumlah partisi acak. Hal ini terjadi karena setiap tugas acak dapat menulis beberapa file di beberapa partisi, dan dapat menjadi penyempitan performa. Anda dapat mengurangi jumlah file dengan mengaktifkan penulisan yang dioptimalkan. Lihat Penulisan yang dioptimalkan untuk Delta Lake di Azure Databricks.Menyesuaikan ukuran file dalam table: Azure Databricks dapat secara otomatis mendeteksi apakah Delta table sering melakukan operasi
merge
dan mungkin memilih untuk mengurangi ukuran file yang telah ditulis ulang dalam rangka mengantisipasi penulisan ulang file di masa yang akan datang. Lihat bagian mengenai penyetelan ukuran file untuk detailnya.Penggabungan Acak Rendah: Penggabungan Acak Rendah menyediakan implementasi
MERGE
yang dioptimalkan yang memberikan performa yang lebih baik untuk sebagian besar beban kerja umum. Selain itu, penggabungan dengan tingkat acak yang rendah mempertahankan pengoptimalan tata letak data yang sudah ada seperti pengurutan Z pada data yang tidak dimodifikasi.
Mengelola kebaruan data
Di awal setiap kueri, Delta tablesupdate diperbarui secara otomatis ke versi terbaru table. Proses ini dapat diamati di notebook saat status perintah melaporkan: Updating the Delta table's state
. Namun, saat menjalankan analisis historis pada table, Anda mungkin belum tentu memerlukan data up-toterkini, terutama karena data streaming tableswhere sering diolah. Dalam kasus ini, kueri dapat dijalankan pada cuplikan usang Delta Anda table. Hal ini dapat menurunkan latensi dalam mendapatkan hasil dari kueri.
Anda dapat mengonfigurasi toleransi untuk data kedaluarsa dengan mengatur konfigurasi spark.databricks.delta.stalenessLimit
sesi Spark dengan nilai string waktu seperti 1h
atau 15m
(masing-masing selama 1 jam atau 15 menit). Konfigurasi ini spesifik untuk sesi, dan tidak memengaruhi klien lain yang mengakses table. Jika status table diperbarui dalam keadaan limitkedaluwarsa, kueri terhadap table mengembalikan hasil tanpa harus menunggu pembaruan tableupdateterbaru. Pengaturan ini tidak pernah mencegah table Anda diperbarui, dan ketika data basi dikembalikan, proses update di latar belakang. Jika tableupdate terakhir lebih lama dari limitkedaluarsa , kueri tidak mengembalikan hasil hingga status tableupdate selesai.
Titik pemeriksaan yang disempurnakan untuk kueri latensi rendah
Delta Lake menghasilkan titik pemeriksaan sebagai kondisi agregat dari table Delta pada frekuensi yang telah dioptimalkan. Titik pemeriksaan ini berfungsi sebagai titik awal untuk menghitung status terbaru table. Tanpa titik pemeriksaan, Delta Lake harus membaca sekumpulan besar file JSON (file "delta") yang mewakili komit ke log transaksi untuk menghitung keadaan table. Selain itu, statistik tingkat columnyang digunakan Delta Lake untuk melakukan melewatkan data disimpan di titik pemeriksaan.
Penting
Titik pemeriksaan Delta Lake berbeda dari titik pemeriksaan Streaming Terstruktur. Lihat Titik pemeriksaan Streaming Terstruktur.
Column-level statistics disimpan sebagai struct dan JSON (untuk kompatibilitas ke belakang). Format struktur membuat Delta Lake membaca lebih cepat, karena:
- Delta Lake tidak melakukan penguraian JSON yang mahal untuk mendapatkan statistik tingkat column.
- Kemampuan pemangkasan Parquet column secara signifikan mengurangi input/output yang diperlukan untuk membaca statistik column.
Format struktur memungkinkan kumpulan pengoptimalan yang mengurangi overhead operasi baca Delta Lake dari detik menjadi puluhan milidetik, yang secara signifikan mengurangi latensi untuk kueri pendek.
Mengelola statistik tingkat columndi titik pemeriksaan
Anda mengelola penulisan statistik pada titik pemeriksaan menggunakan properti tabledelta.checkpoint.writeStatsAsJson
dan delta.checkpoint.writeStatsAsStruct
. Jika kedua properti tablefalse
, Delta Lake tidak dapat melakukan lompatan data.
- Penulisan batch menulis statistik dalam kedua format JSON dan struktur.
delta.checkpoint.writeStatsAsJson
adalahtrue
. -
delta.checkpoint.writeStatsAsStruct
tidak didefinisikan secara default. - Pembaca menggunakan struct column saat tersedia dan sebaliknya akan beralih untuk menggunakan JSON column.
Penting
Titik pemeriksaan yang ditingkatkan tidak merusak kompatibilitas dengan pembaca Delta Lake sumber terbuka. Namun, pengaturan delta.checkpoint.writeStatsAsJson
ke false
mungkin memiliki implikasi pada pembaca Delta Lake yang eksklusif. Hubungi vendor Anda untuk mempelajari lebih lanjut tentang implikasi kinerja.
Mengaktifkan titik pemeriksaan yang ditingkatkan untuk kueri Streaming Terstruktur
Jika beban kerja Streaming Terstruktur tidak memiliki persyaratan latensi rendah (latensi submenit), Anda bisa mengaktifkan pemeriksaan yang disempurnakan dengan menjalankan perintah SQL berikut ini:
ALTER TABLE <table-name> SET TBLPROPERTIES
('delta.checkpoint.writeStatsAsStruct' = 'true')
Anda juga dapat meningkatkan latensi tulis titik pemeriksaan dengan mengatur properti table berikut:
ALTER TABLE <table-name> SET TBLPROPERTIES
(
'delta.checkpoint.writeStatsAsStruct' = 'true',
'delta.checkpoint.writeStatsAsJson' = 'false'
)
Jika melewatkan data tidak berguna dalam aplikasi Anda, Anda dapat set kedua properti ke false. Kemudian tidak ada statistik yang dikumpulkan atau ditulis. Databricks tidak merekomendasikan konfigurasi ini.