Menerapkan pengklusteran cairan pada tabel Delta

Pengklusteran cairan adalah strategi tata letak data yang fleksibel untuk tabel Delta dalam Microsoft Fabric. Ini menggantikan partisi statis ala Hive dan pemeliharaan Z-Order manual dengan pengelompokan deklaratif yang lebih fleksibel terhadap perubahan. Anda menentukan kolom mana yang akan diklusterkan, dan Fabric Spark Runtime menangani tata letak data fisik secara otomatis.

Gunakan artikel ini untuk:

  • Pahami cara kerja pengklusteran cairan dan kapan menggunakannya.
  • Bandingkan pengklusteran cairan dengan partisi dan Z-Order.
  • Konfigurasikan pengklusteran pada tabel Anda.
  • Memahami pengklusteran cairan inkremental (Runtime 2.0+).
  • Mengevaluasi kualitas pengelompokan.
  • Sesuaikan perilaku klasterisasi dengan konfigurasi sesi.

Apa itu pengklusteran cairan?

Pengklusteran cairan mengatur data dalam file tabel Delta sehingga baris dengan nilai serupa dalam kolom pengklusteran dikolokasi. Tata letak ini memungkinkan pengabaian file yang lebih efektif selama eksekusi kueri: ketika kueri memfilter kolom klaster, mesin hanya membaca file yang rentang nilainya sesuai dengan predikat, dan melewati sisanya.

Tidak seperti partisi, pengklusteran cairan:

  • Tidak membuat struktur direktori fisik per nilai kolom.
  • Tidak mengharuskan Anda memilih kolom pengklusteran pada waktu pembuatan tabel (kolom tersebut dapat diubah nanti).
  • Menangani kolom berkardinalitas tinggi tanpa menimbulkan potensi masalah file-file kecil akibat ribuan partisi kecil.
  • Menerapkan pengoptimalan tata letak selama OPTIMIZE, bukan saat penulisan.

Keunggulan dibandingkan dengan partisi dan Z-Order

Liquid clustering menawarkan keuntungan yang signifikan dibandingkan dengan partisi bergaya Hive dan Z-Order dari segi fleksibilitas, pemeliharaan, dan penanganan pola data yang terus berkembang.

Dibandingkan dengan pemartisian bergaya Hive

Aspek Pemartisian Gaya Hive Pengklusteran cairan
Granularity Satu direktori per nilai yang berbeda (atau kombinasi) Rentang nilai pada tingkat file, tanpa direktori
Kardinalitas tinggi Membuat ribuan file/direktori kecil Menanganinya secara alami; mengelompokkan data ke dalam file dengan ukuran yang tepat
Perubahan kolom Memerlukan penulisan ulang tabel lengkap ALTER TABLE ... CLUSTER BY berlaku pada berikutnya OPTIMIZE
Menulis jalur Kolom partisi harus diketahui pada waktu tulis Kolom apa pun dapat diklusterkan setelahnya
Masalah file kecil Lazim pada streaming atau penyisipan yang sering Dikelola oleh pemadatan OPTIMIZE

Dibandingkan dengan Z-Order

Aspek Z-Order Pengklusteran cairan
Perubahan kolom Harus menjalankan ulang OPTIMIZE ZORDER BY (...) dengan kolom baru ALTER TABLE ... CLUSTER BY mempertahankan definisi
Dukungan inkremental Tidak ada mode inkremental; gunakan WHERE untuk membatasi cakupan secara manual Mode inkremental (Runtime 2.0+) hanya memproses file baru, diubah, atau tidak sehat secara otomatis
Metadata Tidak ada definisi kolom persisten Kolom pengklusteran yang disimpan dalam metadata tabel
Tata letak multi-kolom Kurva Z-Order diterapkan pada waktu pengoptimalan Z-Order untuk satu kolom pengklusteran; Kurva Hilbert untuk 2+ kolom, menyediakan lokalitas data yang dioptimalkan

Pengklusteran cairan menggunakan Z-Order untuk tata letak kolom tunggal dan kurva Hilbert untuk 2+ kolom—peningkatan atas Z-Order, yang hanya menerapkan kurva Z-Order untuk pengklusteran multidimensi. Pengelompokan liquid membungkus kedua algoritme dalam kerangka kerja inkremental yang memahami metadata, sehingga mengurangi biaya pemeliharaan berkelanjutan.

Membuat tabel berkluster cair

Tentukan kolom pengklusteran menggunakan CLUSTER BY klausa pada pembuatan tabel:

-- Create a new clustered table
CREATE TABLE dbo.sales (
    order_id BIGINT,
    order_date DATE,
    region STRING,
    amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);

-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;

-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);

Mengubah kolom pengklusteran

Tidak seperti partisi, Anda dapat mengubah kolom pengklusteran kapan saja tanpa menulis ulang data:

-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);

-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;

Setelah mengubah kolom pengklusteran, tata letak baru berlaku pada eksekusi berikutnya OPTIMIZE . File yang ada mempertahankan tata letak sebelumnya hingga direkluster.

Menerapkan pengklusteran dengan OPTIMIZE

Klasterisasi diterapkan selama perintah OPTIMIZE. Tidak perlu menentukan kolom dalam OPTIMIZE pernyataan karena definisi pengklusteran disimpan dalam metadata tabel:

-- Cluster the table using the defined clustering columns
OPTIMIZE sales;

-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;

Gunakan OPTIMIZE FULL saat Anda mengubah kunci pengklusteran dan ingin membangun kembali Z-Cubes yang tidak mematuhi strategi pengklusteran saat ini. Z-Cube adalah unit logis yang digunakan pengklasteran cair untuk mengelompokkan file yang memiliki kolom pengklasteran yang sama. Data diklusterkan ke dalam satu Z-Cube hingga kunci kluster berubah atau jumlah data melebihi 100 GB.

Tip

Mulai Fabric Runtime 2.0, mesin eksekusi Native mendukung performa OPTIMIZE pada tabel berkluster cair, memberikan 30-50% performa pengklusteran multidimensi yang lebih cepat. Runtime versi sebelumnya akan menggunakan eksekusi Spark biasa tanpa akselerasi.

Cara kerja pengklusteran cairan

Saat Anda menjalankan OPTIMIZE pada tabel berkluster cair, hal berikut ini terjadi:

  1. Pemilihan file: Mesin memilih file yang memerlukan pengklusteran.
    • Dalam Runtime 2.0+ (strategi pengklusteran inkremental), hanya file yang belum terkluster, tidak sehat, berukuran kecil, atau file vektor penghapusan yang dipilih.
    • Di Runtime 1.3, semua file dalam setiap Z-Cube yang lebih kecil dari 100 GB dipilih, terlepas dari apakah file tersebut sudah terkluster dengan baik.
  2. Bin packing: File yang dipilih dikelompokkan ke dalam beberapa bin dengan target ukuran file keluaran yang optimal.
  3. Pemartisian ulang: Data dalam setiap bin dipartisi ulang menggunakan kurva pengisian spasi (kurva Hilbert untuk multi-kolom, Z-Order untuk kolom tunggal).
  4. Penulisan file: Data yang dipartisi ulang ditulis sebagai file baru dengan rentang nilai yang ketat pada kolom pengklusteran.
  5. Pembaruan metadata: Delta log mencatat penggantian file, menandai file baru dengan metadata klasterisasi.

Hasilnya adalah berkas dengan rentang nilai yang tidak saling tumpang tindih (atau hampir tidak tumpang tindih) pada kolom klaster, sehingga mesin dapat melewati berkas yang tidak sesuai dengan predikat kueri.

Caution

Fabric Runtime 1.3 (Delta 3.2): gunakan pengklusteran cairan dengan hati-hati. Dalam lingkungan runtime ini, klasterisasi cair menggunakan strategi penulisan ulang penuh Z-Cube—setiap file dalam Z-Cube ditulis ulang setiap kali dijalankan. Z-Cube dipertahankan (dilewati) hanya ketika ukurannya melebihi 100 GB. Untuk tabel yang lebih kecil dari 100 GB, penulisan ulang penuh berarti setiap eksekusi OPTIMIZE menulis ulang semua data tabel, bahkan ketika data sudah terkelompok dengan baik. Hal ini menyebabkan amplifikasi penulisan yang sangat tinggi.

  • Jangan gunakan kompaksi otomatis dengan liquid clustering di Runtime 1.3. Setiap pemicu pemadatan otomatis dapat menyebabkan penulisan ulang tabel lengkap alih-alih hanya mengklusterkan data baru/yang diubah.
  • Hindari menjalankan OPTIMIZE setelah setiap operasi penulisan. Di Runtime 1.3, batasi klasterisasi hanya untuk eksekusi yang strategis dan disengaja, serta terima tingkat kesegaran klasterisasi yang lebih rendah di antara eksekusi tersebut.

Klaster cair inkremental, yang menghilangkan amplifikasi penulisan ini, hanya tersedia sejak Fabric Runtime 2.0.

Pengelompokan cairan inkremental

Dimulai dengan Fabric Runtime 2.0 (Delta 4.1), pengklusteran cairan menggunakan strategi pengklusteran inkremental secara default. Strategi inkremental adalah peningkatan yang signifikan atas perilaku pengklusteran standar.

Important

Klustering likuid inkremental hanya tersedia di Fabric Runtime 2.0 atau yang lebih baru. Dalam runtime sebelumnya, OPTIMIZE menggunakan perilaku standar (penulisan ulang penuh) di mana semua file dalam Z-Cube ditulis ulang pada setiap proses.

Mengapa strategi pengklusteran inkremental penting

Algoritma pengklusteran standar menulis ulang semua file dalam Z-Cube (hingga 100 GB) pada setiap OPTIMIZE eksekusi, terlepas dari apakah file tersebut sudah terkluster dengan baik. Untuk tabel yang menerima tambahan kecil, biaya pengklusteran tumbuh secara linier dengan ukuran tabel, bukan dengan jumlah data baru.

Mode inkremental memecahkan masalah penulisan ulang penuh dengan hanya memilih file yang benar-benar membutuhkan pengklusteran:

  • File yang tidak dikluster: Data yang baru ditulis tanpa pengklusteran metadata
  • File kecil: File di bawah ambang ukuran file target
  • File-file dengan vektor penghapusan: File-file dengan penghapusan yang terakumulasi melebihi ambang batas pembersihan

File yang sudah terkluster dengan baik dan berukuran sesuai dilewati sepenuhnya.

Pengelompokan ulang otomatis

Pengelompokan likuid inkremental mencakup deteksi tumpang tindih otomatis, yang dikenal sebagai auto reclustering, untuk menjaga kualitas pengelompokan seiring waktu. Saat data baru tiba, kedatangannya dapat menyebabkan tumpang tindih antarrentang nilai file, sehingga mengurangi efektivitas pengabaian data. Pengelompokan ulang otomatis mendeteksi rentang nilai yang tumpang tindih antarfile dan secara selektif hanya mengelompokkan ulang file yang terdampak.

Auto reclustering berjalan otomatis sebagai bagian dari OPTIMIZE setiap kali ada data baru atau data yang diubah untuk dikelompokkan. Tidak diperlukan intervensi manual atau rekluster penuh terjadwal. Strategi pengklusteran inkremental mempertahankan kualitas pengklusteran yang hampir optimal seiring berkembangnya data.

Kembali ke perilaku penulisan ulang penuh

Jika Anda perlu menonaktifkan strategi pengklusteran inkremental dan menggunakan perilaku penulisan ulang penuh, atur konfigurasi berikut:

SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;

OPTIMIZE sales;

Atau, gunakan OPTIMIZE FULL untuk rekluster penuh satu kali tanpa mengubah pengaturan sesi:

OPTIMIZE sales FULL;

Note

Strategi klasterisasi inkremental sengaja memungkinkan penyimpangan kecil dari tata letak yang optimal secara teoretis untuk mencapai pengurangan amplifikasi penulisan yang signifikan. Menjalankan OPTIMIZE FULL menutup kesenjangan itu dengan membangun ulang sepenuhnya Z-Cubes hingga mencapai optimum teoretis, tetapi dengan biaya penulisan yang lebih tinggi.

Mengevaluasi kualitas pengelompokan

Dimulai dengan Fabric Runtime 2.0, gunakan metode Scala clusteringQuality() untuk mengevaluasi tata letak fisik tabel Delta berkluster cair. Metode ini mengembalikan DataFrame dengan satu baris untuk setiap kolom pengklusteran.

Important

Metode clusteringQuality() ini tidak tersedia di Fabric Runtimes sebelum 2.0.

import io.delta.tables.DeltaTable

val deltaTable = DeltaTable.forName(spark, "dbo.clustered_table")
val quality_df = deltaTable.clusteringQuality()
display(quality_df)

Hasilnya berisi metrik berikut:

Metrik Description Arah yang disukai
column_name Kolom klastering yang dievaluasi oleh metode. Tidak dapat diterapkan.
status Status evaluasi. ok berarti metrik dihitung. no_stats berarti bahwa kolom tidak memiliki statistik file yang dapat digunakan. ok.
num_files Jumlah total file dalam rekam jepret tabel. Tidak dapat diterapkan.
num_files_with_stats Jumlah file dengan statistik yang dapat digunakan untuk kolom. File tanpa statistik tidak dapat dilewati menggunakan melewati file. Dekat dengan num_files.
avg_coverage_pct Persentase rata-rata dari rentang nilai kolom yang dicakup oleh setiap file. Nilai yang lebih rendah lebih baik.
avg_depth Jumlah rata-rata file yang diakses oleh kueri titik. 1.0 sangat ideal.
max_depth Jumlah maksimum file yang diakses oleh kueri titik. Nilai yang lebih rendah lebih baik.
overlap_ratio Tumpang tindih ternormalisasi antara rentang nilai dalam file. 0 berarti tidak ada tumpang tindih dan ideal.
skipping_effectiveness Perkiraan fraksi file yang dapat dilewati oleh kueri titik. 1 berarti 100% semua file yang tidak cocok dapat dilewati. Saat jumlah kolom pengelompokan yang dipilih meningkat, kemungkinan maksimum skipping_effectiveness berkurang.

Bandingkan metrik ini sebelum dan sesudah OPTIMIZE untuk mengevaluasi apakah pengklusteran meningkatkan tata letak. Menafsirkan hasil dengan distribusi data tabel dan predikat kueri. Metrik ini memperkirakan potensi pengabaian file berdasarkan statistik file; metrik ini tidak mengukur kinerja kueri tertentu.

Referensi konfigurasi

Konfigurasi sesi berikut mengontrol perilaku pengklusteran cair di Fabric Runtime 2.0+.

Klasterisasi inkremental

Konfigurasi Tipe Default Description
spark.microsoft.delta.optimize.clustering.strategy.incremental Boolean true Sakelar utama untuk klasterisasi inkremental. Saat true, OPTIMIZE hanya memproses file yang tidak terklaster, tidak sehat, berukuran kecil, dan file vektor penghapusan. Ketika false, semua file untuk Z-Cubes berukuran di bawah 100 GB ditulis ulang (perilaku standar).
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster Boolean true Memungkinkan deteksi otomatis dan pencadangan file dengan rentang data yang tumpang tindih. Hanya berlaku ketika pengklusteran inkremental diaktifkan.

Penyetelan rekluster otomatis

Konfigurasi ini mengontrol sensitivitas dan cakupan reklustering otomatis. Pengaturan bawaan tersebut cocok untuk sebagian besar beban kerja. Sesuaikan parameter tersebut hanya jika Anda perlu mengubah kompromi antara kualitas pengklusteran dan amplifikasi penulisan.

Konfigurasi Tipe Default Description
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles Int 4 Jumlah minimum berkas yang tumpang tindih yang diperlukan untuk memicu pengklasteran ulang. Nilai yang lebih rendah akan diklaster ulang lebih cepat (performa kueri yang lebih baik, biaya penulisan yang lebih tinggi). Harus ≥ 2.
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold Double 0.75 Ambang batas skor tumpang tindih dimensi klasterisasi. Pasangan file yang memiliki skor di atas nilai ini dianggap saling tumpang tindih. Harus dalam rentang (0,25, 1,0]. Nilai yang lebih rendah akan lebih agresif.

Memilih kolom pengklusteran

Untuk hasil terbaik, pilih kolom pengklusteran berdasarkan pola filter kueri yang paling umum:

  • Pilih 1 hingga 4 kolom yang sering muncul dalam WHERE klausa. Semakin banyak kolom, semakin berkurang efektivitas pengabaian file per kolom dari kurva pengisi ruang, dan semakin lama waktu yang diperlukan untuk mengelompokkan data.
  • Pertimbangkan kardinalitas kolom. Kolom kardinalitas rendah menghasilkan lebih sedikit rentang nilai yang berbeda, yang mengurangi manfaat lompati file ketika dikombinasikan dengan kunci pengklusteran kardinalitas tinggi.
  • Urutan kolom tidak berdampak pada pengklusteran. Urutan kolom yang ditentukan setelah CLUSTER BY tidak berdampak pada pengklusteran multi-dimensi yang dihasilkan.

Jenis kolom yang didukung

Tidak semua jenis kolom dapat digunakan sebagai kunci pengklusteran. Mesin mengevaluasi jenis data setiap kolom untuk menentukan kelayakan.

Selalu memenuhi syarat (jenis atom):

  • NumericType(ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, ) DecimalType
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

Memenuhi syarat secara kondisional:

Note

Jenis berikut dapat diaktifkan mulai dari Fabric Spark Runtime 2.0 (Delta 4.1)

  • StructType: ketika spark.microsoft.delta.clusteredTable.complexTypes.enabled diaktifkan, dan semua bidang daun adalah jenis yang memenuhi syarat.
  • ArrayType: ketika spark.microsoft.delta.clusteredTable.complexTypes.enabled diaktifkan, dan jenis elemen memenuhi syarat.
  • MapType: ketika spark.microsoft.delta.clusteredTable.complexTypes.enabled diaktifkan, dan jenis kunci dan nilai dapat diurutkan dan memenuhi syarat.

Tidak memenuhi syarat:

  • BinaryType
  • BooleanType
  • NullType

Untuk jenis yang memenuhi syarat yang setara yang digunakan dalam statistik tingkat file, lihat Lompati file—Jenis data yang memenuhi syarat.

Interaksi dengan fitur lain

Fitur Behavior
Partitioning Tidak kompatibel. Untuk tujuan lompati file, pengklusteran cairan direkomendasikan melalui pemartisian.
Z-Order Tidak kompatibel. Untuk keperluan pengabaian file, klasterisasi liquid lebih direkomendasikan daripada Z-Order.
Pengoptimalan cepat Kompatibel mulai dari Runtime 2.0. Pada runtime sebelumnya, pengoptimalan cepat tidak berpengaruh pada tabel berkluster cair. Selama OPTIMIZE, lewati pengklusteran ketika tidak ada cukup file kecil atau data yang tidak cukup untuk menghasilkan file output berukuran sehat.
Ukuran file target adaptif Kompatibel. Ukuran file target yang ditetapkan oleh evaluasi adaptif digunakan sebagai ukuran target untuk pengklusteran.
Optimalkan penulisan Kompatibel. Menghasilkan file konsolidasi saat menulis yang kemudian diklusterkan selama OPTIMIZE.
Pemadatan otomatis Jangan gunakan bersama liquid clustering di Runtime 1.3 atau versi yang lebih lama. Dalam lingkungan runtime tersebut, setiap pemicu pemadatan otomatis menulis ulang semua data di Z-Cubes yang berukuran lebih kecil dari 100 GB, sehingga menyebabkan amplifikasi penulisan yang parah. Di Runtime 2.0+, pemadatan otomatis kompatibel: pengklusteran inkremental memastikan hanya file baru atau tidak sehat yang ditulis ulang. Pemadatan otomatis menangani konsolidasi file kecil; OPTIMIZE menangani tata letak pengklusteran.
Vektor penghapusan File yang melebihi ambang batas baris yang dihapus dipilih untuk pengklusteran, terlepas dari status pengklusterannya.
Orde V Kompatibel. V-order dan klaster cair beroperasi pada sumbu yang berbeda (tata letak internal file vs. rentang nilai lintas file). Keduanya dapat diterapkan bersama-sama.

Praktik terbaik

  • Jalankan OPTIMIZE secara teratur setelah penulisan batch atau berdasarkan jadwal untuk tabel streaming—tetapi hanya di Runtime 2.0+, di mana strategi pengklusteran inkremental membuat eksekusi yang sering menjadi hemat biaya. Dalam Runtime 1.3 dan versi sebelumnya, setiap OPTIMIZE run menulis ulang semua data dalam Z-Cubes yang berukuran di bawah 100 GB, sehingga run harus dilakukan secara sengaja dan tidak sering.
  • Gunakan OPTIMIZE FULL dengan hemat. Simpan itu untuk digunakan setelah Anda mengubah kolom klasterisasi atau saat memerlukan pengaturan ulang kualitas satu kali.
  • Pantau kualitas klasterisasi dengan clusteringQuality(), dan verifikasi hasilnya terhadap metrik file yang dipindai di Spark UI atau paket kueri.
  • Gabungkan dengan penulisan yang dioptimalkan untuk beban kerja streaming agar setiap mikro-batch menghasilkan jumlah file yang tetap mudah dikelola untuk klasterisasi.