Topik ini menjelaskan tiga strategi untuk mengelola tabel partisi.
Tabel partisi
Di Fluss, tabel partisi mengorganisasi data berdasarkan satu atau beberapa kunci partisi. Pendekatan ini secara efektif meningkatkan performa kueri dan kemudahan pengelolaan untuk set data besar. Partisi membagi data menjadi segmen-segmen, masing-masing sesuai dengan nilai kunci partisi tertentu.
Fluss mendukung tiga strategi pengelolaan berikut untuk tabel partisi:
-
Pengelolaan partisi manual: Anda dapat membuat atau menghapus partisi secara manual. Untuk informasi selengkapnya, lihat Manage Partitions.
-
Pengelolaan partisi otomatis: Sistem secara otomatis membuat partisi berdasarkan aturan partisi otomatis yang dikonfigurasi saat pembuatan tabel. Sistem juga secara otomatis membersihkan partisi yang telah kedaluwarsa untuk mencegah pertumbuhan data tanpa batas. Untuk informasi selengkapnya, lihat Automatic Partitioning.
-
Pembuatan partisi dinamis: Fluss membuat partisi secara dinamis berdasarkan data yang ditulis ke tabel. Untuk informasi selengkapnya, lihat Dynamic Partitioning.
Ketiga strategi ini bersifat ortogonal dan dapat digunakan secara bersamaan pada tabel yang sama.
Tabel partisi multi-bidang
Tabel partisi, baik tabel primary key maupun tabel log, mendukung konfigurasi kunci partisi berdasarkan beberapa bidang. Pendekatan ini memungkinkan partisi data berdasarkan kombinasi nilai bidang, sehingga memberikan organisasi data, pengelolaan, dan optimasi kueri yang lebih granular.
Sebagai contoh, pada tabel primary key Pesanan, Anda dapat menetapkan kunci partisi sebagai (tanggal, wilayah). Data kemudian disimpan dalam partisi yang sesuai dengan kombinasi tertentu, seperti date=2025-04-05, region='US'. Pada kueri streaming, Anda dapat menyaring data—misalnya dengan region='US'—untuk memanfaatkan pemangkasan partisi dan meningkatkan performa baca melalui partition pushdown.
Keunggulan utama tabel partisi
-
Performa kueri yang lebih baik: Mengkueri partisi tertentu mengurangi jumlah data yang dibaca sistem, sehingga memperpendek waktu eksekusi kueri.
-
Organisasi data yang lebih jelas: Partisi membantu mengorganisasi data secara logis, sehingga lebih mudah dikelola dan dikueri.
-
Skalabilitas yang lebih baik: Membagi set data besar menjadi potongan-potongan kecil yang lebih mudah dikelola meningkatkan skalabilitas sistem.
Batasan
-
Tipe kunci partisi harus STRING.
-
Tabel dengan satu kunci partisi mendukung pembuatan dan pembersihan partisi otomatis. Tabel dengan beberapa kunci partisi hanya mendukung pembersihan otomatis partisi yang kedaluwarsa.
-
Jika tabel merupakan tabel primary key, kunci partisi harus merupakan subset dari primary key.
-
Anda hanya dapat mengonfigurasi aturan partisi otomatis saat pembuatan tabel; aturan tersebut tidak dapat diubah setelahnya.
Partisi otomatis
Contoh
Anda mengonfigurasi aturan partisi otomatis menggunakan opsi tabel. Contoh berikut menunjukkan cara menggunakan Flink SQL untuk membuat tabel bernama site_access yang mendukung partisi otomatis.
CREATE TABLE site_access(
event_day STRING, -- Kunci partisi
site_id INT, -- ID situs
city_code STRING, -- Kode kota
user_name STRING, -- Nama pengguna
pv BIGINT, -- Jumlah tampilan halaman
PRIMARY KEY(event_day, site_id) NOT ENFORCED
) PARTITIONED BY (event_day) WITH (
'table.auto-partition.enabled' = 'true', -- Aktifkan partisi otomatis
'table.auto-partition.time-unit' = 'YEAR', -- Tetapkan granularitas waktu ke YEAR
'table.auto-partition.num-precreate' = '5', -- Pra-buat 5 partisi
'table.auto-partition.num-retention' = '2', -- Simpan 2 partisi historis
'table.auto-partition.time-zone' = 'Asia/Shanghai' -- Tetapkan zona waktu ke Asia/Shanghai
);
Pada contoh ini, ketika tugas partisi otomatis dijalankan (Fluss menjalankannya secara berkala di latar belakang untuk semua tabel), sistem akan pra-membuat lima partisi dan menyimpan dua partisi historis dengan menggunakan YEAR sebagai granularitas waktu. Zona waktu diatur ke Asia/Shanghai.
Parameter tabel
|
Parameter |
Tipe |
Wajib |
Bawaan |
Deskripsi |
|
table.auto-partition.enabled |
Boolean |
Tidak |
false |
Menentukan apakah partisi otomatis diaktifkan untuk tabel. Nilai bawaannya adalah |
|
table.auto-partition.key |
String |
Tidak |
Tidak ada |
Untuk tabel dengan beberapa kunci partisi, parameter ini menentukan kunci mana yang digunakan untuk partisi otomatis berbasis waktu. Sistem membandingkan nilai kunci ini dengan waktu saat ini untuk membuat dan menghapus partisi. Wajib untuk tabel multi-kunci; tidak digunakan untuk tabel satu kunci. |
|
table.auto-partition.time-unit |
ENUM |
Tidak |
DAY |
Granularitas waktu untuk pembuatan partisi otomatis. Nilai bawaannya adalah 'DAY'. Nilai yang valid adalah 'HOUR', 'DAY', 'MONTH', 'QUARTER', dan 'YEAR'. Jika nilainya 'HOUR', partisi dibuat dalam format yyyyMMddHH. Jika 'DAY', formatnya adalah yyyyMMdd. Jika 'MONTH', formatnya adalah yyyyMM. Jika 'QUARTER', formatnya adalah yyyyQ. Jika 'YEAR', formatnya adalah yyyy. |
|
table.auto-partition.time-format |
String |
Tidak |
Berdasarkan satuan waktu |
Pola |
|
table.auto-partition.num-precreate |
Integer |
Tidak |
2 |
Jumlah partisi yang akan dipra-buat selama setiap pemeriksaan partisi otomatis. Misalnya, jika waktu pemeriksaan adalah 2024-11-11 dan nilai ini adalah 3, maka partisi 20241111, 20241112, dan 20241113 akan dipra-buat. Jika partisi sudah ada, pembuatannya dilewati. Nilai bawaannya adalah 2. Misalnya, jika 'table.auto-partition.time-unit' adalah 'DAY' (nilai bawaan), satu partisi dipra-buat untuk hari ini dan satu lagi untuk besok. Pra-pembuatan tidak didukung untuk tabel dengan beberapa kunci partisi; parameter ini diabaikan untuk tabel tersebut. |
|
table.auto-partition.num-retention |
Integer |
Tidak |
7 |
Jumlah partisi historis yang disimpan selama setiap pemeriksaan partisi otomatis. Misalnya, jika waktu pemeriksaan adalah 2024-11-11, satuan waktu adalah DAY, dan nilai ini adalah 3, maka partisi historis 20241108, 20241109, dan 20241110 disimpan. Sistem menghapus partisi yang lebih lama dari 20241108. Nilai bawaannya adalah 7. |
|
table.auto-partition.time-zone |
String |
Tidak |
Zona waktu sistem |
Zona waktu untuk partisi otomatis. Nilai bawaannya adalah zona waktu sistem. |
Aturan pembuatan partisi
table.auto-partition.time-unit untuk tabel yang dipartisi secara otomatis dapat diatur ke HOUR, DAY, MONTH, QUARTER, atau YEAR. Partisi otomatis dibuat dalam format berikut.
|
Satuan waktu |
Format |
Contoh |
|
HOUR |
yyyyMMddHH |
2024091922 |
|
DAY |
yyyyMMdd |
20240919 |
|
MONTH |
yyyyMM |
202409 |
|
QUARTER |
yyyyQ |
20241 |
|
YEAR |
yyyy |
2024 |
Anda dapat mengganti pola bawaan dengan table.auto-partition.time-format. Pola kustom harus memenuhi semua aturan berikut:
-
Mengurutkan bidang waktu dari satuan terbesar ke terkecil.
-
Mencakup setiap bidang yang memengaruhi granularitas partisi yang dikonfigurasi.
-
Menggunakan bidang numerik lebar tetap: empat digit untuk tahun, dua digit masing-masing untuk bulan, hari, dan jam, serta satu digit untuk kuartal.
-
Bagian pola opsional yang menggunakan
[dan]tidak didukung, karena setiap nilai partisi harus berisi semua bidang yang diperlukan.
Sebagai contoh, yyyy-MM-dd adalah pola yang valid untuk DAY. Pola berikut ditolak: MM-yyyy karena urutan bidang salah, yyyy-MM karena bidang hari tidak ada, dan yyyy-M-dd karena lebar bulan tidak tetap. Nilai partisi yang dihasilkan juga harus merupakan nilai partisi Fluss yang valid: maksimal 200 karakter ASCII berupa huruf, angka, garis bawah, atau tanda hubung, dan tidak boleh diawali dengan awalan khusus __. Oleh karena itu, yyyy/MM/dd tidak valid karena / tidak diizinkan. Teks literal dapat diapit tanda kutip. Sebagai contoh, Anda dapat menggunakan yyyy-'Q'Q untuk QUARTER. Ketika kunci auto-partisi bertipe DATE, satuan waktu harus DAY dan polanya harus yyyy-MM-dd.
Setelah Anda menonaktifkan partisi otomatis, pola waktu yang dikonfigurasi tetap disimpan dan masih digunakan untuk memvalidasi nama partisi yang dibuat secara manual, tetapi pemeriksaan retensi tidak lagi dilakukan.
Konfigurasi kluster Fluss
Tabel berikut menjelaskan opsi konfigurasi yang terkait dengan partisi otomatis untuk kluster Fluss.
|
Parameter |
Tipe |
Bawaan |
Deskripsi |
|
auto-partition.check.interval |
Duration |
10 menit |
Interval pemeriksaan Fluss terhadap tabel yang memiliki partisi otomatis diaktifkan. Selama setiap pemeriksaan, Fluss membuat atau menghapus partisi sesuai kebutuhan berdasarkan aturan tabel tersebut. |
Partisi dinamis
Partisi dinamis adalah fitur sisi client yang diaktifkan secara bawaan, yang secara otomatis membuat partisi saat data ditulis ke tabel. Fitur ini sangat berguna ketika himpunan lengkap partisi belum diketahui sebelumnya, sehingga menghilangkan kebutuhan pembuatan manual. Fitur ini juga sangat berguna saat Anda bekerja dengan partisi multi-bidang karena partisi otomatis saat ini hanya mendukung pembuatan partisi untuk kunci satu bidang saja.
Jumlah partisi yang dibuat secara dinamis juga dibatasi oleh parameter max.partition.num dan max.bucket.num yang dikonfigurasi pada kluster Fluss.
-
Nilai bawaan
max.partition.numadalah 1.000. Ini merepresentasikan jumlah maksimum partisi yang dapat dibuat untuk setiap tabel partisi. -
Nilai bawaan
max.bucket.numadalah 128.000. Ini merepresentasikan jumlah total maksimum bucket yang didukung per tabel, yang dihitung sebagai (jumlah partisi) × (jumlah bucket per partisi).
Opsi client
|
Parameter |
Tipe |
Wajib |
Bawaan |
Deskripsi |
|
client.writer.dynamic-create-partition.enabled |
Boolean |
Tidak |
true |
Menentukan apakah pembuatan partisi dinamis diaktifkan untuk writer client. Jika diaktifkan, client secara otomatis membuat partisi baru jika partisi tersebut belum ada saat penulisan. |
Contoh partisi dinamis
Langkah 1: Buat tabel contoh
Pada bilah navigasi kiri, pilih , buat skrip kueri data kosong baru, lalu masukkan SQL berikut untuk membuat tabel partisi dengan kolom dt sebagai kunci partisi.
CREATE TABLE IF NOT EXISTS `fluss-demo`.fluss.table_enable_dynamic_partition
(
id BIGINT
,name STRING
,dt STRING
)
PARTITIONED BY (dt)
WITH (
'client.writer.dynamic-create-partition.enabled' = 'true'
)
;
Verifikasi partisi saat ini dari tabel:
SHOW PARTITIONS `fluss-demo`.fluss.table_enable_dynamic_partition;
Hasil kueri menunjukkan bahwa daftar partisi tabel kosong.
Langkah 2: Masukkan data secara dinamis
Jalankan pernyataan SQL berikut untuk memasukkan data ke partisi yang belum ada:
INSERT INTO `fluss-demo`.fluss.table_enable_dynamic_partition values(1, 'hello', '20250701');
Langkah 3: Verifikasi pembuatan partisi
Jalankan perintah SHOW PARTITIONS lagi untuk memverifikasi bahwa partisi telah dibuat secara dinamis.
Hasil kueri menunjukkan dt=20250701 pada kolom partition name, yang mengonfirmasi bahwa partisi telah dibuat secara dinamis.