Topik ini menjelaskan fitur-fitur tabel, termasuk penyimpanan remote, pemangkasan kolom, penurunan predikat, dan kompresi log.
Ikhtisar
-
remote storage: Untuk memastikan latensi rendah, data terbaru disimpan di disk lokal. Data yang lebih lama dimigrasikan secara asinkron ke penyimpanan remote guna mengurangi biaya penyimpanan lokal.
-
column pruning: Saat kueri dijalankan, hanya kolom yang diperlukan yang dibaca dan kolom yang tidak relevan dilewati, sehingga mengurangi jumlah data yang dibaca.
-
predicate pushdown: Server menggunakan statistik kolom untuk melewati blok data yang tidak sesuai dengan filter. Hal ini mengurangi beban I/O jaringan dan deserialisasi.
-
log compression: Fitur ini menggunakan mekanisme kompresi Arrow native untuk secara signifikan mengurangi biaya transfer jaringan dan penyimpanan.
Remote storage
Remote storage mengacu pada sistem penyimpanan eksternal yang lebih hemat biaya dan andal, seperti Amazon S3, Hadoop Distributed File System (HDFS), atau Alibaba Cloud OSS. Secara default, Fluss menggunakan Alibaba Cloud OSS sebagai penyimpanan remotenya.
-
Fluss menggunakan remote storage untuk tiering data dan toleransi kesalahan.
-
Untuk tabel log, remote storage menyimpan segmen log bertingkat.
-
Untuk tabel primary key, remote storage menyimpan Snapshot dan segmen data change log.
Mekanisme log remote
Fluss adalah sistem penyimpanan aliran tempat data biasanya dikonsumsi dengan membaca dari ekor (tail). Untuk memastikan latensi rendah, data terbaru disimpan di disk lokal. Fluss memindahkan data lama secara asinkron ke penyimpanan remote guna mengurangi biaya penyimpanan lokal.
Konfigurasi tingkat tabel
Setelah segmen log disalin ke penyimpanan remote, Fluss biasanya menghapus salinan lokalnya untuk menghemat ruang. Namun, untuk meningkatkan performa baca, Anda dapat memilih untuk menyimpan sejumlah segmen log terbaru tertentu secara lokal.
|
Parameter |
Tipe |
Default |
Deskripsi |
|
table.log.tiered.local-segments |
Integer |
2 |
Menentukan jumlah segmen log yang disimpan secara lokal. |
Konfigurasi tingkat klaster
Opsi konfigurasi berikut mengontrol perilaku tiering log:
|
Parameter |
Jenis |
Default |
Deskripsi |
|
remote.log.task-interval-duration |
Durasi |
1 menit |
Interval eksekusi untuk tugas manajemen log remote, yang mencakup operasi copy, cleanup, dan delete. Mengatur nilai ini menjadi 0 detik akan menonaktifkan fitur log remote. |
|
remote.log.index-file-cache-size |
Ukuran memori |
1 GB |
Ukuran total cache lokal untuk menyimpan file indeks remote. |
|
remote.log-manager.thread-pool-size |
Integer |
4 |
Ukuran kolam thread untuk menjadwalkan tugas log remote. |
|
remote.log.data-transfer-thread-num |
Integer |
4 |
Jumlah thread untuk mengunggah dan mengunduh file log remote, termasuk file data, indeks, dan metadata. |
|
log.segment.file-size |
Ukuran memori |
1 GB |
Mengontrol ukuran setiap file segmen log. Retensi dan pembersihan log dilakukan per tingkat file, sehingga file yang lebih besar menghasilkan jumlah total file yang lebih sedikit. Opsi ini, bersama dengan opsi tingkat tabel |
Snapshot remote untuk tabel primary key
-
Fluss mendistribusikan data dalam tabel primary key ke dalam bucket. Setiap bucket hanya menyimpan satu replika lokal dan tidak memiliki replika follower.
-
Untuk mencegah kehilangan data akibat kegagalan disk lokal, Fluss secara berkala membuat snapshot dan mengunggahnya ke penyimpanan remote.
-
Snapshot berisi salinan data dan offset log, yang menunjukkan posisi perubahan berikutnya yang harus dibaca setelah pembuatan snapshot.
-
Jika suatu node gagal, Fluss dapat mengunduh snapshot dari penyimpanan remote dan memutar ulang change log berikutnya untuk memulihkan data di node lain.
-
Konsistensi antara snapshot dan offset log memungkinkan klien beralih secara mulus dari pembacaan penuh (dari snapshot) ke langganan inkremental (dari change log), sehingga mencegah duplikasi atau kehilangan data.
Konfigurasi snapshot tingkat klaster
|
Parameter |
Tipe |
Default |
Deskripsi |
|
kv.snapshot.interval |
Durasi |
10 menit |
Interval pembuatan snapshot untuk tabel primary key. |
|
kv.snapshot.scheduler-thread-num |
Integer |
1 |
Jumlah thread untuk menjadwalkan semua tugas snapshot di node lokal. |
|
kv.snapshot.transfer-thread-num |
Integer |
4 |
Jumlah thread untuk mengunggah dan mengunduh file snapshot. |
|
kv.snapshot.num-retained |
Integer |
1 |
Jumlah maksimum snapshot yang telah selesai untuk disimpan. Kami menyarankan Anda mengatur nilai ini ke angka yang besar untuk mencegah penghapusan snapshot saat klien sedang membacanya. |
Column pruning
Column pruning adalah optimisasi yang mengurangi jumlah data yang dibaca dengan hanya membaca kolom yang diperlukan dan melewatkan kolom yang tidak relevan selama kueri. Fluss mendukung column pruning untuk pembacaan aliran, menjadikannya salah satu dari sedikit sistem di industri yang memiliki kemampuan ini untuk skenario pemrosesan aliran real-time.
-
Fluss mendukung column pruning baik untuk tabel log maupun change log tabel primary key. Fitur ini mengurangi I/O penyimpanan, menurunkan lalu lintas jaringan, dan mengurangi beban parsing di sisi klien, sehingga secara signifikan meningkatkan performa kueri.
-
Baik untuk pemrosesan batch maupun pemrosesan aliran, sistem selalu memproses hanya bidang yang diperlukan, sehingga memaksimalkan pemanfaatan resource.
Saat mesin komputasi, seperti Flink, menjalankan kueri, sistem tersebut menganalisis kolom yang diperlukan dan menginstruksikan Fluss untuk hanya mengembalikan kolom-kolom tersebut.
SELECT id, name FROM log_table WHERE timestamp > '2023-01-01'
Kueri ini hanya membaca kolom id, name, dan timestamp. Fluss tidak membaca kolom lain dalam tabel, seperti address dan status, dari penyimpanan, sehingga menghindari pembacaan yang tidak perlu.
Predicate pushdown
Predicate pushdown adalah optimisasi sisi server yang hanya berlaku untuk tabel log. Server mengevaluasi predikat filter terhadap statistik kolom (min, max, dan nullCount) dari setiap RecordBatch. Server kemudian melewatkan seluruh batch yang tidak mungkin berisi baris yang sesuai, sehingga mengurangi beban I/O jaringan dan deserialisasi.
Statistik kolom
Fluss mengumpulkan statistik kolom pada tingkat RecordBatch saat data ditulis. Statistik ini mencakup nilai minimum (min), maksimum (max), dan jumlah null (nullCount) untuk setiap kolom. Fluss menyimpan statistik ini di dalam Arrow RecordBatch, memungkinkan server mengevaluasi predikat filter saat membaca data.
Konfigurasi
Gunakan parameter table.statistics.columns untuk menentukan kolom yang akan dikumpulkan statistiknya. Kami menyarankan Anda menentukan nama kolom secara eksplisit. Sebagai alternatif, Anda dapat mengatur nilainya ke * untuk mengumpulkan statistik untuk semua tipe kolom yang didukung.
Aktifkan saat membuat tabel
CREATE TABLE log_table (
order_id BIGINT,
item_id BIGINT,
amount INT,
address STRING
) WITH (
'table.statistics.columns' = 'order_id,amount'
);
Aktifkan untuk tabel yang sudah ada
ALTER TABLE log_table SET ('table.statistics.columns' = 'order_id,amount');
Fitur ini hanya berlaku untuk data yang ditulis setelah Anda mengaktifkan pengumpulan statistik. Fitur ini tidak memengaruhi data historis.
Tipe yang didukung
Statistik kolom didukung untuk tipe data berikut: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, STRING, CHAR, DATE, TIME, TIMESTAMP, dan TIMESTAMP_LTZ.
Tipe data berikut tidak mendukung statistik dan secara otomatis dikecualikan dari konfigurasi: BYTES, BINARY, ARRAY, MAP, dan ROW.
Prasyarat
-
Format log harus berupa Arrow (
table.log.format = 'arrow'). Ini diaktifkan secara default. -
Anda harus secara eksplisit mengaktifkan statistik kolom dengan menggunakan opsi
table.statistics.columns. -
Fitur ini hanya berlaku untuk tabel log.
Cara kerja
Saat membaca data, server mengevaluasi statistik kolom dan predikat filter untuk setiap RecordBatch. Jika statistik menunjukkan bahwa suatu batch tidak mungkin berisi baris yang sesuai, server melewatkan batch tersebut dan tidak mengirimkannya ke klien. Klien Flink tetap menerapkan kembali filter pada data yang diterima sebagai tindakan pengaman, memastikan semantik kueri tetap tidak berubah.
Log compression
Fluss menggunakan mekanisme kompresi Arrow native. Data terkompresi tetap sesuai dengan standar format Arrow. Fluss mengompresi setiap kolom secara independen, sehingga memungkinkan column pruning berfungsi dan tidak memengaruhi performa kueri.
Proses kompresi
-
Untuk tabel log, writer di sisi klien mengompresi data dan menuliskannya ke penyimpanan dalam format terkompresi. Saat membaca data tersebut, pemindai log mendekompresinya.
-
Untuk change log tabel primary key, server menghasilkan dan mengompresi log tersebut.
Manfaat kompresi
Kompresi secara signifikan mengurangi biaya transfer jaringan dan penyimpanan. Uji benchmark menunjukkan bahwa ZSTD pada level kompresi 3 dapat mencapai rasio kompresi sekitar 5:1 (misalnya, mengompresi data 5 GB menjadi 1 GB). Pengurangan overhead jaringan juga meningkatkan throughput baca dan tulis.
Konfigurasi
|
Parameter |
Default |
Deskripsi |
|
table.log.arrow.compression.type |
ZSTD |
Algoritma kompresi. Nilai yang valid:
|
|
table.log.arrow.compression.zstd.level |
3 |
Level kompresi ZSTD. Nilai yang valid berkisar dari 1 hingga 22. |
Contoh konfigurasi
-- Atur algoritma kompresi ke ZSTD dan level kompresi ke 2
CREATE TABLE log_table (
order_id BIGINT,
item_id BIGINT,
amount INT,
address STRING
) WITH (
'table.log.arrow.compression.type' = 'ZSTD',
'table.log.arrow.compression.zstd.level' = '2'
);
-
Pengaturan kompresi hanya berlaku untuk tabel yang memiliki
table.log.format='arrow'. -
Jika
table.log.formatdiatur ke'indexed', Fluss mengabaikan pengaturan kompresi.