Topik ini menjelaskan cara menggunakan Paimon connector untuk streaming data lakehouse. Untuk hasil terbaik, kami menyarankan menggunakan connector ini bersama Paimon Catalog.
Informasi latar belakang
Apache Paimon adalah format penyimpanan data lake terpadu untuk aliran (streaming) dan batch yang mendukung penulisan throughput tinggi serta kueri latensi rendah. Paimon terintegrasi dengan baik bersama mesin komputasi populer yang tersedia di Alibaba Cloud E-MapReduce, seperti Flink, Spark, Hive, dan Trino. Anda dapat menggunakan Apache Paimon untuk membangun data lake secara cepat di HDFS atau OSS dan menghubungkannya ke mesin komputasi tersebut guna melakukan analitik data lake. Untuk informasi lebih lanjut, lihat Apache Paimon.
|
Kategori |
Deskripsi |
|
Jenis yang didukung |
Tabel sumber, tabel dimensi, tabel hasil, dan target untuk ingesti data |
|
Mode operasional |
Mode streaming dan mode batch |
|
Format data |
Tidak didukung |
|
Metrik pemantauan |
Tidak ada |
|
Jenis API |
SQL dan YAML untuk ingesti data |
|
Pembaruan dan penghapusan pada tabel hasil |
Ya |
Fitur utama
Apache Paimon menyediakan kemampuan inti berikut:
-
Membangun data lake ringan dan berbiaya rendah di HDFS atau object storage.
-
Membaca dan menulis dataset berskala besar dalam mode streaming maupun batch.
-
Menjalankan kueri batch dan OLAP dengan freshness data dari hitungan menit hingga detik.
-
Mengingesti dan menghasilkan data inkremental, berfungsi sebagai lapisan penyimpanan untuk gudang data offline tradisional maupun modern berbasis streaming.
-
Pre-agregasi data untuk mengurangi biaya penyimpanan dan beban komputasi downstream.
-
Mengakses versi historis data.
-
Memfilter data secara efisien.
-
Mendukung evolusi skema.
Batasan dan rekomendasi
-
Paimon connector memerlukan mesin komputasi Flink VVR 6.0.6 atau yang lebih baru.
-
Tabel berikut mencantumkan kompatibilitas versi antara Paimon dan VVR.
Versi Apache Paimon
VVR
1.3.1
11.5, 11.6, 11.7, 11.8
1.3
11.4
1.2
11.2, 11.3
1.1
11.1
1.0
8.0.11
-
Rekomendasi penyimpanan untuk penulisan konkuren
Saat beberapa job melakukan penulisan konkuren ke tabel Paimon yang sama, penggunaan penyimpanan OSS standar (oss://) terkadang dapat menyebabkan konflik commit atau kegagalan job karena keterbatasan pada operasi file atomik.
Untuk penulisan yang stabil dan konsisten, gunakan layanan metadata atau penyimpanan yang menyediakan jaminan atomik kuat. Opsi yang disarankan adalah Data Lake Formation (DLF), yang menawarkan manajemen terpadu metadata dan penyimpanan Paimon. Alternatifnya, Anda dapat menggunakan OSS-HDFS atau HDFS.
-
Cara perubahan konfigurasi diterapkan
Perubahan pada parameter konfigurasi tabel Paimon hanya berlaku setelah Anda me-restart job terkait. Job yang sedang berjalan tidak memuat perubahan ini secara dinamis.
-
Reklamasi Fisik Tertunda dari Partisi yang Dihapus
Saat Anda menjalankan operasi DROP PARTITION, sistem tidak langsung menghapus file data fisik yang mendasarinya.
Operasi ini hanya melakukan penghapusan logis. Paimon hanya menghapus metadata partisi target dari snapshot terbaru. Karena Paimon mendukung fitur time travel, snapshot historis masih mereferensikan file data partisi tersebut. File data fisik tersebut baru dihapus secara permanen setelah semua snapshot historis yang mereferensikan partisi tersebut mencapai batas retensi dan dibersihkan oleh mekanisme kedaluwarsa snapshot.
SQL
Gunakan Paimon connector dalam job SQL sebagai tabel sumber atau tabel sink.
Sintaks
-
Jika Anda membuat tabel Paimon di Paimon Catalog, Anda tidak perlu menentukan parameter
connector. Sintaksnya sebagai berikut:CREATE TABLE `<YOUR-PAIMON-CATALOG>`.`<YOUR-DB>`.paimon_table ( id BIGINT, data STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( ... );CatatanJika Anda telah membuat tabel Paimon di Paimon Catalog, Anda dapat menggunakannya secara langsung.
-
Jika Anda membuat tabel temporary Paimon di Catalog lain, Anda harus menentukan parameter 'connector' dan 'path'. Sintaksnya sebagai berikut:
CREATE TEMPORARY TABLE paimon_table ( id BIGINT, data STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'paimon', 'path' = '<path-to-paimon-table-files>', 'auto-create' = 'true', -- Jika file data tabel Paimon tidak ada di path yang ditentukan, file tersebut akan dibuat secara otomatis. ... );Catatan-
Contoh path:
'path' = 'oss://<bucket>/test/order.db/orders'. Jangan menghilangkan akhiran.db. Paimon mengandalkan akhiran ini untuk mengidentifikasi database. -
Beberapa job yang menulis ke tabel yang sama harus menggunakan konfigurasi path yang identik.
-
Jika dua konfigurasi path berbeda, Paimon tidak menganggapnya sebagai tabel yang sama. Bahkan jika path fisiknya sama, konfigurasi Catalog yang tidak konsisten dapat menyebabkan konflik penulisan konkuren, kegagalan operasi compact, dan kehilangan data. Misalnya, Paimon menganggap
oss://b/testdanoss://b/test/sebagai tabel yang berbeda karena adanya trailing slash, meskipun keduanya mungkin mengarah ke lokasi fisik yang sama.
-
Parameter WITH
|
Parameter |
Deskripsi |
Type |
Wajib |
Default |
Keterangan |
|
connector |
Menentukan connector untuk tabel. |
String |
Tidak |
Tidak ada |
|
|
path |
Path penyimpanan tabel. |
String |
Tidak |
Tidak ada |
|
|
auto-create |
Menentukan apakah file tabel dibuat secara otomatis jika tidak ada di path yang ditentukan. |
Boolean |
Tidak |
false |
Nilai yang valid:
|
|
file.format |
Format file data. |
String |
Tidak |
parquet |
Nilai yang valid:
|
|
bucket |
Jumlah bucket per partisi. |
Integer |
Tidak |
1 |
Paimon mendistribusikan data ke bucket berdasarkan Catatan
Kami menyarankan agar setiap bucket berisi kurang dari 5 GB data. |
|
bucket-key |
Kolom yang digunakan sebagai kunci bucket. |
String |
Tidak |
Tidak ada |
Menentukan kolom yang digunakan untuk mendistribusikan data ke bucket. Pisahkan beberapa nama kolom dengan koma (,). Contohnya, Catatan
|
|
changelog-producer |
Mekanisme produksi changelog. |
String |
Tidak |
none |
Paimon dapat menghasilkan changelog lengkap untuk aliran input apa pun, artinya setiap record
Untuk informasi lebih lanjut tentang cara memilih produsen changelog, lihat Changelog Production. |
|
full-compaction.delta-commits |
Jumlah maksimum commit antara dua full compaction berturut-turut. |
Integer |
Tidak |
Tidak ada |
Menentukan jumlah maksimum commit snapshot yang diperbolehkan sebelum memicu full compaction. |
|
lookup.cache-max-memory-size |
Ukuran cache memori untuk tabel dimensi Paimon. |
String |
Tidak |
256 MB |
Parameter ini mengontrol ukuran cache untuk lookup tabel dimensi dan produsen changelog |
|
merge-engine |
Mekanisme penggabungan record dengan kunci primer yang sama. |
String |
Tidak |
deduplicate |
Nilai yang valid:
Untuk analisis mendetail tentang merge engine, lihat Merge Engine. |
|
partial-update.ignore-delete |
Menentukan apakah pesan delete (-D) diabaikan. |
Boolean |
Tidak |
false |
Nilai yang valid:
Catatan
|
|
ignore-delete |
Menentukan apakah pesan delete (-D) diabaikan. |
Boolean |
Tidak |
false |
Nilai yang valid sama dengan nilai untuk partial-update.ignore-delete. Catatan
|
|
partition.default-name |
Nama partisi default. |
String |
Tidak |
__DEFAULT_PARTITION__ |
Nama partisi yang digunakan ketika nilai kolom partisi adalah null atau string kosong. |
|
partition.expiration-check-interval |
Frekuensi sistem memeriksa partisi yang kedaluwarsa. |
String |
Tidak |
1h |
Untuk detailnya, lihat Cara mengonfigurasi kedaluwarsa partisi otomatis. |
|
partition.expiration-time |
Durasi setelah partisi kedaluwarsa. |
String |
Tidak |
Tidak ada |
Partisi kedaluwarsa ketika usianya melebihi nilai ini. Secara default, partisi tidak pernah kedaluwarsa. Sistem menghitung usia partisi dari nilai partisinya. Untuk detailnya, lihat Cara mengonfigurasi kedaluwarsa partisi otomatis. |
|
partition.timestamp-formatter |
String format untuk mengonversi string waktu ke timestamp. |
String |
Tidak |
Tidak ada |
Menentukan format untuk mengekstraksi usia partisi dari nilai partisi. Untuk detailnya, lihat Cara mengonfigurasi kedaluwarsa partisi otomatis. |
|
partition.timestamp-pattern |
String format untuk mengonversi nilai partisi ke string waktu. |
String |
Tidak |
Tidak ada |
Menentukan pola untuk mengekstraksi string waktu dari nilai partisi. Untuk detailnya, lihat Cara mengonfigurasi kedaluwarsa partisi otomatis. |
|
scan.bounded.watermark |
Nilai watermark yang menandai akhir pemindaian. Tabel sumber berhenti menghasilkan data ketika watermark-nya melebihi nilai ini. |
Long |
Tidak |
Tidak ada |
Tidak berlaku |
|
scan.mode |
Menentukan posisi konsumsi untuk tabel sumber Paimon. |
String |
Tidak |
default |
Untuk detailnya, lihat Cara mengatur posisi konsumsi untuk tabel sumber Paimon. |
|
scan.snapshot-id |
Menentukan snapshot dari mana tabel sumber Paimon mulai mengonsumsi. |
Integer |
Tidak |
Tidak ada |
Untuk detailnya, lihat Cara mengatur posisi konsumsi untuk tabel sumber Paimon. |
|
scan.timestamp-millis |
Menentukan titik waktu dari mana tabel sumber Paimon mulai mengonsumsi. |
Integer |
Tidak |
Tidak ada |
Untuk detailnya, lihat Cara mengatur posisi konsumsi untuk tabel sumber Paimon. |
|
snapshot.num-retained.max |
Jumlah maksimum snapshot terbaru yang dipertahankan. |
Integer |
Tidak |
2147483647 |
Kedaluwarsa snapshot dipicu jika salah satu kondisi ini atau kondisi |
|
snapshot.num-retained.min |
Jumlah minimum snapshot terbaru yang dipertahankan. |
Integer |
Tidak |
10 |
Tidak berlaku |
|
snapshot.time-retained |
Periode retensi untuk snapshot. |
String |
Tidak |
1h |
Kedaluwarsa snapshot dipicu jika salah satu kondisi ini atau kondisi |
|
write-mode |
Mode penulisan untuk tabel Paimon. |
String |
Tidak |
change-log |
Nilai yang valid:
Untuk informasi lebih lanjut tentang mode penulisan, lihat Write Mode. |
|
scan.infer-parallelism |
Menentukan apakah paralelisme untuk tabel sumber Paimon diinfer secara otomatis. |
Boolean |
Tidak |
true |
Nilai yang valid:
|
|
scan.parallelism |
Paralelisme untuk tabel sumber Paimon. |
Integer |
Tidak |
Tidak ada |
Catatan
Parameter ini diabaikan jika Mode diatur ke Mode pada tab job. |
|
sink.parallelism |
Paralelisme untuk tabel sink Paimon. |
Integer |
Tidak |
Tidak ada |
Catatan
Parameter ini diabaikan jika Mode diatur ke Mode pada tab job. |
|
sink.clustering.by-columns |
Menentukan kolom clustering untuk menulis ke tabel sink Paimon. |
String |
Tidak |
Tidak ada |
Untuk tabel append-only Paimon (tabel tanpa kunci primer), parameter ini mengaktifkan penulisan terklaster dalam job batch. Proses ini meningkatkan performa kueri dengan mengelompokkan data pada kolom yang ditentukan. Pisahkan beberapa nama kolom dengan koma (,), contohnya, Untuk informasi lebih lanjut tentang clustering, lihat Dokumentasi Resmi Apache Paimon. |
|
sink.delete-strategy |
Menentukan strategi validasi untuk memastikan sistem menangani pesan retraction (-D/-U) dengan benar. |
Enum |
Tidak |
NONE |
Nilai yang valid dan perilaku yang diharapkan dari operator sink saat menangani pesan retraction:
Catatan
|
|
blob-as-descriptor |
Menentukan apakah byte descriptor Blob dioutput saat kolom Blob dibaca. |
Boolean |
Tidak |
false |
Saat parameter ini diatur ke true, kueri mengembalikan byte serialisasi BlobDescriptor alih-alih konten Blob aktual. Gunakan parameter ini bersama fungsi URL yang ditandatangani Blob. Anda tidak perlu mengatur parameter ini saat pembuatan tabel. Anda dapat mengaturnya secara dinamis saat membaca dengan menggunakan petunjuk SQL. Parameter ini didukung di VVR 11.9-preview1 dan yang lebih baru. Catatan
Hanya didukung di VVR 11.9-preview1 dan yang lebih baru. |
Untuk informasi lebih lanjut tentang opsi konfigurasi, lihat Dokumentasi Resmi Apache Paimon.
Parameter tabel vektor
Parameter berikut hanya didukung di VVR 11.8 dan yang lebih baru.
|
Parameter |
Deskripsi |
Tipe data |
Wajib |
Nilai default |
Keterangan |
|
|
Jumlah kluster IVF yang diproses selama pencarian. |
Integer |
Tidak |
16 |
Nilai yang lebih tinggi umumnya meningkatkan recall tetapi meningkatkan latensi. |
|
|
Mengambil kandidat IVF top_k × refine_factor dan melakukan re-ranking menggunakan vektor asli yang disimpan di tabel Paimon. |
Float |
Tidak |
Nonaktif |
Secara default dinonaktifkan untuk semua varian IVF. Paling cocok untuk indeks terkompresi (seperti ivf-pq dan ivf-hnsw-sq) dalam skenario di mana recall diprioritaskan daripada latensi. |
|
|
Lebar pencarian HNSW selama pencarian. |
Integer |
Tidak |
0 |
Nilai yang lebih tinggi umumnya meningkatkan recall tetapi meningkatkan latensi. 0 menunjukkan bahwa nilai default pustaka native digunakan. |
|
|
Ukuran daftar pencarian Lumina DiskANN. |
Integer |
Tidak |
max(1.5 × top_k, 16) |
Nilai yang lebih tinggi umumnya meningkatkan recall tetapi meningkatkan latensi. |
|
|
Lebar beam pencarian Lumina DiskANN. |
Integer |
Tidak |
4 |
— |
|
|
Jumlah pencarian Lumina paralel. |
Integer |
Tidak |
5 |
— |
Detail fitur
Freshness dan konsistensi data
Tabel sink Paimon menggunakan protokol two-phase commit untuk meng-commit data selama setiap checkpoint job Flink. Oleh karena itu, freshness data ditentukan oleh interval checkpoint job Flink. Setiap commit menghasilkan hingga dua snapshot.
Saat dua job Flink menulis ke tabel Paimon yang sama secara konkuren, jika job menulis ke bucket yang berbeda, mereka mencapai konsistensi serializable. Jika job menulis ke bucket yang sama, mereka hanya mencapai isolasi snapshot. Artinya, data tabel mungkin merupakan campuran hasil dari kedua job, tetapi tidak terjadi kehilangan data.
Mesin Penggabungan
Saat tabel sink Paimon menerima beberapa record dengan kunci primer yang sama, tabel tersebut menggabungkannya menjadi satu record untuk menjaga keunikan. Anda dapat mengontrol perilaku ini dengan mengatur parameter merge-engine. Tabel berikut menjelaskan mesin penggabungan yang tersedia.
|
Merge engine |
Deskripsi |
|
Deduplicate |
Mesin deduplikasi adalah default. Untuk beberapa record dengan kunci primer yang sama, tabel sink Paimon hanya menyimpan record terbaru dan membuang yang lainnya. Catatan
Jika record terbaru adalah pesan delete, semua record dengan kunci primer tersebut dibuang. |
|
Partial Update |
Mesin partial update memungkinkan Anda membangun record lengkap dengan memperbarui secara inkremental menggunakan beberapa pesan. Saat record baru dengan kunci primer yang sama tiba, nilai non-null-nya menimpa bidang yang sesuai di record yang ada. Mesin mengabaikan bidang yang bernilai null di record baru dan mempertahankan nilai yang ada. Sebagai contoh, asumsikan tabel sink Paimon menerima tiga record berikut secara berurutan:
Jika kolom pertama adalah kunci primer, record gabungan akhirnya adalah <1, 25.2, 10, 'This is a book'>. Catatan
|
|
Aggregation |
Dalam beberapa kasus penggunaan, Anda mungkin hanya memerlukan nilai agregat dari record. Mesin agregasi menggabungkan record yang memiliki kunci primer yang sama menggunakan fungsi agregat yang Anda tentukan. Untuk setiap kolom non-kunci-primer, Anda harus menentukan fungsi agregat menggunakan opsi
Kolom
Catatan
|
Produsen changelog
Atur parameter changelog-producer untuk mengonfigurasi Paimon agar menghasilkan changelog lengkap (di mana setiap record update_after memiliki record update_before yang sesuai) untuk aliran input apa pun. Tabel berikut menjelaskan produsen changelog yang tersedia. Untuk detail lebih lanjut, lihat dokumentasi resmi Apache Paimon.
|
Produsen |
Deskripsi |
|
None |
Saat Anda mengatur Sebagai contoh, jika konsumen downstream perlu menghitung jumlah suatu kolom dan hanya melihat nilai terbaru 5, mereka tidak dapat menentukan cara memperbarui total. Jika nilai sebelumnya adalah 4, jumlah harus bertambah 1; jika nilai sebelumnya adalah 6, jumlah harus berkurang 1. Konsumen yang sensitif terhadap record Catatan
Jika konsumen downstream Anda, seperti database, tidak sensitif terhadap data |
|
Input |
Saat Anda mengatur Gunakan produsen ini hanya ketika aliran input itu sendiri sudah merupakan changelog lengkap, seperti data dari Change Data Capture (CDC). |
|
Lookup |
Saat Anda mengatur Dibandingkan dengan produsen Gunakan opsi ini untuk kasus penggunaan yang memerlukan freshness data tinggi (misalnya, tingkat menit). |
|
Full Compaction |
Saat Anda mengatur Dibandingkan dengan produsen Gunakan opsi ini untuk kasus penggunaan dengan persyaratan freshness data rendah (misalnya, tingkat jam). |
Mode penulisan
Tabel Paimon mendukung mode penulisan berikut.
|
Mode |
Deskripsi |
|
Change-log |
Mode penulisan |
|
Append-only |
Mode penulisan Untuk deskripsi detail tentang mode penulisan
|
Target untuk ingesti data Flink CDC
Tabel Paimon mendukung sinkronisasi real-time data dari tabel tunggal atau seluruh database. Perubahan skema upstream disinkronkan ke tabel Paimon secara real-time. Untuk informasi lebih lanjut, lihat bagian Ingesti Data.
Pemangkasan baca Variant
Hanya membaca bidang Variant yang direferensikan oleh kueri, mengurangi overhead I/O dan memori.
Cara mengaktifkan
|
Parameter |
Nilai default |
Deskripsi |
|
|
false |
Atur ke |
Prasyarat
-
Data Variant hanya dapat ditulis oleh VVR 11.6 atau yang lebih baru. Data Variant yang ditulis oleh versi sebelumnya atau mesin lain tidak mendukung pemangkasan baca.
-
Agar data upstream berlaku, Anda harus mengaktifkan opsi
variant.inferShreddingSchemauntuk mengaktifkan inferensi shredding Variant otomatis, atau secara eksplisit mengonfigurasivariant.shreddingSchemadan opsi terkait untuk menentukan anggota Variant mana yang cocok untuk shredding. Untuk informasi lebih lanjut, lihat Coreoptions.
Skenario yang didukung
Pemangkasan baca berlaku saat SQL mengakses bidang Variant dengan kunci string, misalnya:
SELECT v['a'] FROM t; -- Satu level
SELECT v['a']['b'] FROM t; -- Bersarang
SELECT v['a'], v['b'] FROM t; -- Beberapa bidang
SELECT id, v['a'] FROM t; -- Dicampur dengan kolom biasa
SELECT v['a'] + 1 FROM t; -- Direferensikan dalam ekspresi
Skenario yang tidak didukung
-
Mereferensikan seluruh Variant secara langsung, seperti
SELECT v FROM t. -
Menggabungkan referensi langsung dengan akses bidang, seperti
SELECT v, v['a'] FROM t. -
Akses indeks array, seperti
v[0]. -
Skema tabel berisi bidang Row bersarang. Dalam kasus ini, pemangkasan baca tidak berlaku untuk bidang Variant apa pun di tabel.
URL yang ditandatangani Blob
Paimon dapat menghasilkan URL HTTPS GET publik berdurasi pendek yang ditandatangani untuk data kolom Blob yang disimpan di OSS. Layanan eksternal, seperti layanan model multimodal, dapat menggunakan URL tersebut untuk mengambil konten file secara langsung, tanpa mentransfer byte file di dalam job Flink.
Batasan
-
Hanya mesin komputasi Flink VVR 11.9-preview1 dan yang lebih baru yang mendukung fitur ini.
-
Hanya tabel Paimon yang disimpan di OSS yang didukung. Jenis metastore tidak menjadi masalah. Jenis metastore Filesystem, DLF, dan lainnya semuanya didukung.
-
URL yang dihasilkan adalah URL HTTPS publik dan harus dikonsumsi oleh layanan eksternal yang memiliki akses jaringan publik. Jika catalog menggunakan titik akhir internal, kami menyarankan Anda mengubahnya ke titik akhir HTTPS publik agar layanan eksternal dapat mengakses URL yang dihasilkan.
-
Untuk membaca kolom Blob biasa, Anda harus terlebih dahulu mendapatkan byte BlobDescriptor dengan menggunakan opsi
blob-as-descriptor, lalu meneruskan byte tersebut ke fungsi.
Sintaks
descriptor_to_presigned_url(source_table, descriptor, validity)
try_descriptor_to_presigned_url(source_table, descriptor, validity)
Parameter
|
Parameter |
Tipe |
Deskripsi |
|
|
Literal STRING |
Tabel Paimon yang berisi kolom Blob, dalam format |
|
|
BYTES |
Byte BlobDescriptor, yang merupakan hasil membaca kolom Blob setelah |
|
|
INTERVAL |
Periode validitas URL. Nilainya harus berupa jumlah detik positif, misalnya, |
Nilai kembalian
|
Tipe |
Deskripsi |
|
STRING |
URL HTTPS GET publik berdurasi pendek yang ditandatangani. |
Contoh
-- Gunakan petunjuk SQL untuk membaca kolom Blob sebagai descriptor dan menghasilkan URL yang ditandatangani
SELECT sys.descriptor_to_presigned_url(
'default.image_table',
image,
INTERVAL '5' MINUTE)
FROM image_table /*+ OPTIONS('blob-as-descriptor'='true') */;
-- Mode toleransi kesalahan: mengembalikan NULL pada kesalahan tingkat baris, dengan perilaku lain tidak berubah
SELECT sys.try_descriptor_to_presigned_url(
'default.image_table',
image,
INTERVAL '5' MINUTE)
FROM image_table /*+ OPTIONS('blob-as-descriptor'='true') */;
-
descriptor_to_presigned_urlmelempar exception pada kesalahan tingkat baris.try_descriptor_to_presigned_urlmengembalikan NULL pada kesalahan tingkat baris. -
URL yang dihasilkan tidak berisi ekstensi file, dan byte yang ditunjuk oleh URL identik dengan data Blob. Layanan downstream harus mengidentifikasi format file berdasarkan byte yang dikembalikan alih-alih akhiran URL.
-
URL yang ditandatangani setara dengan kredensial akses sementara. Setelah URL yang ditandatangani dihasilkan, segera kirimkan ke layanan downstream. Jangan menuliskannya ke log atau tabel hasil, dan jangan menyimpannya secara permanen.
Tabel berantai
Tabel rantai merekonstruksi set data lengkap dari cabang snapshot dan perubahan yang mengikutinya di cabang delta. Tulis data lengkap periodik ke cabang snapshot dan perubahan antara dua muatan lengkap ke cabang delta. Pembacaan menggunakan partisi snapshot terbaru sebagai jangkar dan menggabungkan partisi delta berikutnya untuk membangun kembali data lengkap, sehingga Anda tidak perlu menulis ulang seluruh tabel. Ini berguna ketika hanya sebagian kecil baris yang berubah antar eksekusi, seperti dump binlog ODS. Untuk informasi lebih lanjut, lihat Chain Table dalam dokumentasi Apache Paimon. Tabel rantai hanya didukung di VVR 11.9 dan yang lebih baru.
Aktifkan tabel rantai
Atur chain-table.enabled ke true saat Anda membuat tabel, buat cabang snapshot dan delta, lalu konfigurasikan opsi fallback cabang pada tabel utama dan kedua tabel cabang.
CREATE TABLE `default`.`t` (
`t1` STRING,
`t2` STRING,
`t3` STRING,
`date` STRING,
PRIMARY KEY (`date`, `t1`) NOT ENFORCED
) PARTITIONED BY (`date`) WITH (
'chain-table.enabled' = 'true',
'sequence.field' = 't2',
'bucket-key' = 't1',
'bucket' = '2',
'partition.timestamp-pattern' = '$date',
'partition.timestamp-formatter' = 'yyyyMMdd'
);
-- mycat adalah nama catalog Paimon.
CALL `mycat`.sys.create_branch('default.t', 'snapshot');
CALL `mycat`.sys.create_branch('default.t', 'delta');
ALTER TABLE `default`.`t` SET (
'scan.fallback-snapshot-branch' = 'snapshot',
'scan.fallback-delta-branch' = 'delta');
ALTER TABLE `default`.`t$branch_snapshot` SET (
'scan.fallback-snapshot-branch' = 'snapshot',
'scan.fallback-delta-branch' = 'delta');
ALTER TABLE `default`.`t$branch_delta` SET (
'scan.fallback-snapshot-branch' = 'snapshot',
'scan.fallback-delta-branch' = 'delta');
Menulis data
Tulis data lengkap ke t$branch_snapshot. Setiap partisi cabang ini adalah tampilan lengkap pada titik waktu tertentu. Tulis data inkremental ke t$branch_delta. Setiap partisi cabang ini hanya berisi perubahan periode tersebut.
-- Penulisan lengkap
INSERT OVERWRITE `default`.`t$branch_snapshot` PARTITION (date = '20250810') VALUES ('1', '1', '1');
-- Penulisan inkremental
INSERT INTO `default`.`t$branch_delta` PARTITION (date = '20250811') VALUES ('2', '1', '1');
Membaca data
|
Jalur baca |
Operasi |
Hasil |
|
Kueri lengkap |
Kueri partisi tabel utama. |
Data lengkap partisi tersebut. Partisi dibaca langsung jika cabang snapshot memuatnya. Jika tidak, partisi tersebut dibangun kembali dari snapshot jangkar dan partisi delta berikutnya. |
|
Kueri inkremental |
Kueri partisi |
Hanya perubahan yang disimpan di partisi delta yang dipilih. Status lengkap tidak dibangun kembali. |
|
Kueri hibrid |
Menggabungkan kueri lengkap dan kueri inkremental dengan |
Kombinasi hasil lengkap dan inkremental. Baris yang sama mungkin muncul dua kali. |
|
Baca streaming |
Membaca tabel utama dalam mode streaming. |
Hasil fase pemuatan awal dipancarkan terlebih dahulu, lalu commit baru dari cabang delta terus-menerus dikonsumsi. |
|
Lookup join |
Menggunakan tabel rantai sebagai tabel dimensi. |
Status gabungan partisi snapshot terbaru dan partisi delta berikutnya untuk setiap grup, diperbarui secara inkremental berdasarkan |
-- Kueri lengkap
SELECT t1, t2, t3 FROM `default`.`t` WHERE date = '20250811';
-- Kueri inkremental
SELECT t1, t2, t3 FROM `default`.`t$branch_delta` WHERE date = '20250811';
-- Kueri hibrid
SELECT t1, t2, t3 FROM `default`.`t` WHERE date = '20250811'
UNION ALL
SELECT t1, t2, t3 FROM `default`.`t$branch_delta` WHERE date = '20250811';
Baca streaming
Job baca streaming berjalan dalam dua fase:
-
Fase pemuatan awal: secara default, job membaca partisi snapshot terbaru dari setiap grup dan partisi delta yang mengikutinya. Partisi snapshot yang lebih lama dikecualikan. Untuk menggabungkan data snapshot dan delta berdasarkan jangkar dalam fase ini dan menyelesaikan record DELETE lintas cabang, atur
chain-table.streaming.merge-snapshotketrue. Pertukarannya adalah pemindaian yang lebih berat saat startup job. -
Fase inkremental: job terus-menerus membaca commit baru dari cabang
delta.
SET 'execution.runtime-mode' = 'streaming';
INSERT INTO downstream_sink SELECT * FROM `default`.`t`;
Fase inkremental hanya memantau cabang delta. Penulisan ke cabang snapshot tidak terdeteksi hingga job direstart. Jalankan prosedur compact_chain_table secara berkala untuk menggabungkan data inkremental partisi ke cabang snapshot. Setelah kompaksi, hanya perubahan delta yang tiba setelah kompaksi yang perlu digabungkan dalam fase pemuatan awal.
Kunci partisi ganda
Jika tabel memiliki lebih dari satu kunci partisi, gunakan chain-table.chain-partition-keys untuk memisahkan dimensi rantai dari dimensi grup. Nilainya harus berupa akhiran berurutan dari kunci partisi. Bidang akhiran membentuk rantai yang diurutkan berdasarkan waktu, dan bidang partisi sebelumnya menjadi dimensi grup. Setiap grup nilai partisi grup mempertahankan rantai dan jangkarnya sendiri. Jika opsi ini tidak diatur, semua partisi termasuk dalam satu grup implisit.
CREATE TABLE `default`.`t` (
`t1` STRING,
`t2` STRING,
`t3` STRING,
`region` STRING,
`date` STRING,
PRIMARY KEY (`region`, `date`, `t1`) NOT ENFORCED
) PARTITIONED BY (`region`, `date`) WITH (
'chain-table.enabled' = 'true',
'sequence.field' = 't2',
'bucket-key' = 't1',
'bucket' = '2',
'partition.timestamp-pattern' = '$date',
'partition.timestamp-formatter' = 'yyyyMMdd',
-- Hanya date yang membentuk rantai. Setiap region memiliki rantainya sendiri.
'chain-table.chain-partition-keys' = 'date'
);
Batasan
-
Tabel rantai hanya didukung untuk tabel kunci primer. Anda harus menentukan
bucketdanbucket-key. -
Skema setiap cabang harus konsisten.
-
Tabel rantai memerlukan
sequence.field. Mesin penggabunganfirst-rowdanaggregationtidak didukung. -
Baca streaming dan join lookup memerlukan cabang
deltauntuk menggunakan mesin penggabungandeduplicate(nilai default). Baca batch tidak terpengaruh. -
Vektor penghapusan hanya didukung untuk tabel rantai yang menggunakan mesin penggabungan
deduplicate. -
Hanya
none(nilai default) daninputyang didukung untukchangelog-producer. Modelookupdanfull-compactiontidak didukung. Jika nilainyanone, record dinormalisasi oleh kunci primer lengkap yang mencakup partisi rantai, dan record-Ddan-Uyang record aslinya berada di partisi lain dibuang. Atur nilainya keinputjika konsumen downstream harus menerima record changelog lintas partisi. -
Baca streaming dan join lookup hanya mendukung mode startup default (
latest-full). Error dilempar jika Anda menentukan posisi awal sepertiscan.snapshot-id,scan.timestamp-millis,scan.modediatur kelatest, atauconsumer-id. Untuk melakukan baca streaming standar tanpa logika tabel rantai, baca tabel cabang tertentu sepertit$branch_delta. -
Filter partisi tidak didukung dalam baca streaming dan join lookup tabel rantai. Ini termasuk kolom partisi dalam klausa
WHEREdan opsiscan.partitions, karena filter mengganggu logika penggabungan lintas cabang. Gunakan mode batch untuk membaca partisi tertentu. -
Kunci join dari join lookup tidak boleh berisi kunci partisi. Jika tidak, error dikembalikan.
-
partition.timestamp-formatterharus menentukan tanggal lengkap (tahun-bulan-hari atau tahun-hari-dalam-tahun), hanya menggunakan bidang tanggal dan waktu yang dapat dibalik (y/u,M/L,d,D,H,k,m, dans), dan memiliki langkah minimum setidaknya satu detik.
Format file Mosaic
Mosaic adalah format hibrida kolom-bucket yang dioptimalkan untuk tabel lebar yang berisi ribuan atau puluhan ribu kolom. Kolom diurutkan berdasarkan nama dan didistribusikan ke bucket berdasarkan rentang, disimpan dalam format berorientasi kolom di setiap bucket, dan dikompresi secara independen menggunakan ZSTD. Projection pushdown bekerja pada granularitas bucket, sehingga kueri hanya membaca bucket yang berisi kolom yang diminta. Kolom dengan awalan nama serupa berada di bucket yang sama, yang meningkatkan rasio kompresi dan lokalitas proyeksi. Untuk informasi lebih lanjut, lihat Mosaic. Format Mosaic hanya didukung di VVR 11.9 dan yang lebih baru.
Mengaktifkan format
Atur file.format ke mosaic saat Anda membuat tabel. Dalam job ingesti data, opsi yang sesuai adalah table.properties.file.format.
CREATE TABLE `default`.`wide_table` (
`id` BIGINT,
`col_a` STRING,
`col_b` DOUBLE
) WITH (
'file.format' = 'mosaic'
);
Opsi format
|
Opsi |
Nilai default |
Deskripsi |
|
|
auto |
Jumlah bucket kolom untuk I/O paralel. Jika nilainya 0 atau opsi tidak ditentukan, jumlah bucket ditentukan secara otomatis. |
|
|
(kosong) |
Nama kolom yang dikumpulkan statistik min/max-nya untuk predicate pushdown, dipisahkan dengan koma (,). Tidak ada statistik yang dikumpulkan jika nilainya kosong. |
|
|
8 |
Jumlah grup baris yang dibuka reader sebelum grup baris yang dikonsumsi. Prefetching menumpang tindih latensi baca rentang dengan decoding. Setiap grup baris yang diprefetch menyimpan batch yang didekode di memori dan menggunakan stream input terpisah. Nilai 0 menonaktifkan prefetching. |
|
|
64 mb |
Batas atas perkiraan ukuran didekode dari grup baris yang diprefetch, yang dihitung dari jumlah baris dan tipe kolom yang diproyeksikan. Proyeksi lebar atau grup baris besar menurunkan nilai efektif |
Batasan
Mosaic tidak mendukung tipe kompleks: ARRAY, MAP, MULTISET, ROW, VARIANT, BLOB, dan VECTOR.
Menggunakan Paimon sebagai tabel dimensi
Tabel Paimon dapat digunakan sebagai tabel dimensi. Untuk sintaks JOIN, lihat Pernyataan JOIN tabel dimensi.
Secara default, lookup memuat semua data di setiap instans paralel. Pendekatan ini hanya cocok untuk tabel dimensi kecil. Untuk tabel dimensi besar, gunakan solusi Shuffle Lookup yang dijelaskan di bawah.
Tabel dimensi terpartisi
Jika tabel dimensi Anda terpartisi dan Anda hanya memerlukan data dari satu atau dua partisi terbaru, Anda dapat menggunakan fitur pemuatan partisi dinamis:
SELECT * FROM T
JOIN DIM /*+ OPTIONS('lookup.dynamic-partition'='max_pt()', 'lookup.dynamic-partition.refresh-interval'='1 h') */
FOR SYSTEM_TIME AS OF T.proc_time AS D
ON T.col = D.col;
|
Parameter |
Tipe data |
Nilai default |
Deskripsi |
|
lookup.dynamic-partition |
String |
Tidak berlaku |
|
|
lookup.dynamic-partition.refresh-interval |
Durasi |
1 h |
Interval sistem memeriksa pembaruan partisi di tabel dimensi. |
Tabel dimensi besar: tabel bucket tetap
Hanya didukung di VVR 8.0.8 dan yang lebih baru. Untuk tabel bucket tetap (bucket > 0), Anda dapat menggunakan Shuffle Lookup untuk mendistribusikan data berdasarkan kunci bucket di instans paralel, sehingga setiap instans hanya memuat data di bucket yang ditugaskan:
SELECT /*+ LOOKUP('table'='D', 'shuffle'='true') */ T.col1, D.col2
FROM T
JOIN DIM FOR SYSTEM_TIME AS OF T.proc_time AS D
ON T.col1 = D.col1;
-
Kunci join harus merupakan kunci bucket. Kunci bucket secara default adalah kunci primer.
-
Hanya tabel bucket tetap (bucket > 0) yang mendukung fitur ini.
Tabel dimensi besar: tabel bucket tidak tetap
Hanya didukung di VVR 8.0.10 dan yang lebih baru. Untuk tabel bucket dinamis atau tabel append, Anda dapat menggunakan SHUFFLE_HASH atau REPLICATED_SHUFFLE_HASH sehingga setiap instans paralel membaca semua data tetapi hanya menyimpan bagian yang dibutuhkan:
-- Shuffle Hash
SELECT /*+ SHUFFLE_HASH(D) */ T.col1, D.col2
FROM T
JOIN DIM FOR SYSTEM_TIME AS OF T.proc_time AS D
ON T.col1 = D.col1;
-- Replicated Shuffle Hash
SELECT /*+ REPLICATED_SHUFFLE_HASH(D) */ T.col1, D.col2
FROM T
JOIN DIM FOR SYSTEM_TIME AS OF T.proc_time AS D
ON T.col1 = D.col1;
Untuk informasi lebih lanjut tentang SHUFFLE_HASH dan REPLICATED_SHUFFLE_HASH, lihat Pernyataan JOIN tabel dimensi.
Ingesti Data
Anda dapat menggunakan Paimon connector sebagai sink dalam job YAML ingesti data.
Sintaks
sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: filesystem
catalog.properties.warehouse: /path/warehouse
Parameter
|
Parameter |
Deskripsi |
Wajib |
Tipe |
Default |
Catatan |
|
type |
Jenis connector. |
Ya |
STRING |
Tidak ada |
Nilainya harus |
|
name |
Nama sink. |
Tidak |
STRING |
Tidak ada |
|
|
catalog.properties.metastore |
Jenis catalog Paimon. |
Tidak |
STRING |
filesystem |
Nilai yang valid:
|
|
catalog.properties.* |
Parameter untuk membuat catalog Paimon. |
Tidak |
STRING |
Tidak ada |
Untuk informasi lebih lanjut, lihat Mengelola Paimon Catalog. |
|
table.properties.* |
Parameter untuk membuat tabel Paimon. |
Tidak |
STRING |
Tidak ada |
Untuk informasi lebih lanjut, lihat Opsi tabel Paimon. |
|
table.properties.file.format |
Format penyimpanan file data di tabel. |
String |
Tidak |
parquet |
Nilai yang valid:
|
|
catalog.properties.warehouse |
Direktori root untuk penyimpanan file. |
Tidak |
STRING |
Tidak ada |
Parameter ini hanya berlaku saat |
|
commit.user-prefix |
Awalan username untuk meng-commit file data. |
Tidak |
STRING |
Tidak ada |
Catatan
Kami menyarankan menetapkan username berbeda untuk job berbeda. Hal ini memudahkan mengidentifikasi job yang menyebabkan konflik commit. |
|
partition.key |
Kunci partisi untuk tabel terpartisi. |
Tidak |
STRING |
Tidak ada |
Tabel berbeda dipisahkan oleh |
|
sink.cross-partition-upsert.tables |
Daftar tabel yang memerlukan upsert lintas partisi, di mana kunci primer tidak mencakup semua kunci partisi. |
Tidak |
STRING |
Tidak ada |
Berlaku untuk tabel dengan pembaruan lintas partisi.
Penting
|
|
sink.commit.parallelism |
Menentukan paralelisme operator Commit. |
Tidak |
INTEGER |
Tidak ada |
Jika operator Commit menjadi bottleneck, gunakan parameter ini untuk meningkatkan paralelismenya dan meningkatkan performa. Parameter ini hanya didukung di Realtime Compute for Apache Flink 11.6 dan yang lebih baru. Catatan
Mengatur parameter ini mengubah paralelisme operator. Saat me-restart job stateful, Anda harus menentukan |
|
sink.existing-table.schema-check.enabled |
Menentukan apakah akan memeriksa kompatibilitas skema tabel yang ada dan secara otomatis menyesuaikan skema saat data ditulis ke tabel yang telah dibuat sebelumnya. |
Boolean |
Tidak |
true |
Daftar berikut menjelaskan nilai yang valid dan perilaku saat data ditulis ke tabel yang telah dibuat sebelumnya:
Catatan
Parameter ini hanya didukung di Realtime Compute for Apache Flink VVR 11.8 dan yang lebih baru. |
Menggunakan kembali catalog yang ada
Mulai dari Realtime Compute for Apache Flink 11.5, Anda dapat langsung mereferensikan catalog Paimon bawaan dari halaman Data Management dalam job ingesti data Flink CDC. Hal ini mengurangi konfigurasi manual.
sink:
type: paimon
using.built-in-catalog: paimon_dlf_catalog
catalog.properties.fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
Job ingesti data dapat secara otomatis menggunakan kembali semua parameter di catalog Paimon. Hal ini setara dengan mengonfigurasi secara manual parameter yang diawali dengan catalog.properties. dalam job YAML.
Untuk mengganti parameter yang digunakan kembali secara otomatis, atur secara eksplisit di job YAML. Konfigurasi YAML eksplisit memiliki prioritas lebih tinggi. Sebagai contoh, dalam sampel di atas, parameter fs.oss.endpoint menggunakan nilai dari job YAML, mengganti nilai di paimon_dlf_catalog.
Perubahan Skema
Job pipeline YAML CDC dapat menggunakan strategi berbeda untuk menangani perubahan skema. Untuk mengonfigurasi strategi, atur parameter tingkat pipeline schema.change.behavior seperti yang dijelaskan di Konfigurasi evolusi skema. schema.change.behavior dapat diatur ke IGNORE, LENIENT, TRY_EVOLVE, EVOLVE, atau EXCEPTION. Bagian berikut menjelaskan bagaimana mode LENIENT dan EVOLVE, yang melibatkan perubahan skema, menangani berbagai event perubahan skema.
LENIENT (default)
Perubahan skema berikut didukung dalam mode LENIENT:
-
Menambahkan kolom nullable: kolom tersebut secara otomatis ditambahkan ke skema tabel sink, dan data kolom baru tersebut disinkronkan secara otomatis.
-
Menghapus kolom nullable: kolom tersebut tidak dihapus dari tabel sink. Sebagai gantinya, data kolom tersebut secara otomatis diganti dengan nilai NULL.
-
Menambahkan kolom NOT NULL: kolom tersebut secara otomatis ditambahkan ke skema tabel sink, dan data kolom baru tersebut disinkronkan secara otomatis. Kolom baru tersebut secara default nullable, dan data yang dihasilkan sebelum kolom tersebut ditambahkan diatur ke NULL.
-
Mengganti nama kolom: operasi ini dianggap sebagai penambahan kolom dan penghapusan kolom. Kolom yang diganti namanya ditambahkan ke akhir tabel sink, dan data kolom asli secara otomatis diganti dengan nilai NULL. Sebagai contoh, jika col_a diganti namanya menjadi col_b, col_b ditambahkan ke akhir tabel sink, dan data col_a diganti dengan nilai NULL.
-
Mengubah tipe kolom: mengubah tipe data kolom yang sesuai di tabel sink.
-
Perubahan skema berikut tidak didukung:
-
Perubahan tipe kunci primer.
-
Perubahan dari NULLABLE ke NOT NULL.
-
EVOLVE
Perubahan skema berikut didukung dalam mode EVOLVE:
-
Menambahkan kolom nullable: didukung.
-
Menghapus kolom nullable: tidak didukung.
-
Tambahkan kolom NOT NULL: kolom nullable ditambahkan ke tabel hasil.
-
Mengganti nama kolom: didukung. Kolom asli diganti namanya di tabel sink.
-
Mengubah tipe kolom: mengubah tipe data kolom yang sesuai dalam tabel hasil.
-
Perubahan skema berikut tidak didukung:
-
Perubahan tipe kunci primer.
-
Perubahan dari NULLABLE ke NOT NULL.
-
Untuk contoh cara mengaktifkan mode EVOLVE, lihat Mengaktifkan mode EVOLVE.
Jika tabel Paimon downstream sudah ada, job menulis data ke skema tabel yang ada dan tidak mencoba membuat tabel lagi. Jika skema tabel yang ada berbeda dari skema tabel upstream, kolom nullable yang ada di tabel upstream tetapi hilang di tabel downstream secara otomatis ditambahkan ke tabel yang ada. Jika kasus tidak dapat disesuaikan secara otomatis, seperti tipe kolom yang tidak kompatibel atau kolom NOT NULL yang hilang atau berlebih, pemeriksaan gagal dan error dilaporkan. Anda dapat menjalankan pernyataan SQL yang direkomendasikan dalam pesan error untuk memodifikasi skema tabel. Anda juga dapat mengatur sink.existing-table.schema-check.enabled ke false di sink untuk melewati pemeriksaan dan penambahan kolom otomatis, sehingga data ditulis berdasarkan skema tabel downstream.
Contoh
Contoh berikut menunjukkan konfigurasi dalam skenario khas.
Menulis ke Rest Catalog
Contoh berikut menunjukkan cara menulis data ke Data Lake Formation (DLF) saat catalog Paimon bertipe rest:
source:
type: mysql
name: MySQL Source
hostname: ${secret_values.mysql.hostname}
port: ${mysql.port}
username: ${secret_values.mysql.username}
password: ${secret_values.mysql.password}
tables: ${mysql.source.table}
server-id: 8601-8604
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: rest
catalog.properties.uri: dlf_uri
catalog.properties.warehouse: your_warehouse
catalog.properties.token.provider: dlf
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
Untuk informasi tentang parameter yang diawali dengan catalog.properties, lihat Parameter konfigurasi Catalog Flink CDC.
Menulis ke FileSystem Catalog
Konfigurasi contoh untuk menulis ke Object Storage Service (OSS) dengan catalog Paimon filesystem:
source:
type: mysql
name: MySQL Source
hostname: ${secret_values.mysql.hostname}
port: ${mysql.port}
username: ${secret_values.mysql.username}
password: ${secret_values.mysql.password}
tables: ${mysql.source.table}
server-id: 8601-8604
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: filesystem
catalog.properties.warehouse: oss://default/test
catalog.properties.fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
catalog.properties.fs.oss.accessKeyId: xxxxxxxx
catalog.properties.fs.oss.accessKeySecret: xxxxxxxx
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
Untuk informasi tentang parameter yang diawali dengan catalog.properties, lihat Membuat Paimon Filesystem Catalog.
Menulis ke tabel terpartisi
Mengonversi bidang create_time bertipe TIMESTAMP di tabel upstream menjadi bidang DATE, yang digunakan sebagai kunci partisi tabel Paimon.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
transform:
- source-table: test_db.test_source_table
projection: \*, DATE_FORMAT(CAST(create_time AS TIMESTAMP), 'yyyy-MM-dd') as partition_key
primary-keys: id, create_time, partition_key
partition-keys: partition_key
description: add partition key
pipeline:
name: MySQL to Paimon Pipeline
Menyinkronkan tabel tunggal
Kami menyarankan Anda mengonfigurasi job sinkronisasi tabel tunggal untuk tabel yang memiliki persyaratan tinggi terhadap performa real-time dan stabilitas. Sinkronisasi tabel tunggal menghindari kompleksitas sinkronisasi multi-tabel. Contoh berikut menunjukkan konfigurasinya:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
pipeline:
name: MySQL to Paimon Pipeline
Menyinkronkan seluruh database
Menyinkronkan seluruh database mengurangi jumlah job yang perlu Anda konfigurasi dan jalankan, sehingga menurunkan biaya O&M. Contoh berikut menunjukkan konfigurasinya:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
pipeline:
name: MySQL to Paimon Pipeline
Menyinkronkan seluruh database dan mengganti nama database dan tabel
Untuk mengganti nama database dan tabel secara batch, tambahkan bagian route ke job sinkronisasi seluruh database. Contoh berikut menunjukkan konfigurasinya:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
route:
# Sinkronkan semua tabel di database test_db MySQL ke database test_db2 Paimon dan pertahankan nama tabelnya.
- source-table: test_db.\.*
sink-table: test_db2.<>
replace-symbol: <>
pipeline:
name: MySQL to Paimon Pipeline
Menggabungkan database dan tabel ter-shard
Untuk menulis data dari beberapa tabel ter-shard ke satu tabel downstream, gunakan templat berikut:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.user\.*
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
route:
# Semua tabel ter-shard di database test_db MySQL digabungkan menjadi satu tabel Paimon test_db.user.
- source-table: test_db.user\.*
sink-table: test_db.user
pipeline:
name: MySQL to Paimon Pipeline
Menambahkan tabel yang ada saat restart job
Untuk menambahkan tabel yang ada ke sinkronisasi, atur scan.newly-added-table.enabled = true dan restart job.
Jika job pertama kali mengatur scan.binlog.newly-added-table.enabled ke true untuk menangkap tabel baru, jangan kemudian mengatur scan.newly-added-table.enabled ke true dan restart job untuk menangkap tabel yang ada. Jika tidak, data dikirimkan lebih dari sekali.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
scan.startup.mode: initial
# Saat restart job, periksa tabel baru yang ditangkap oleh parameter tables dan ambil snapshot.
# Catatan: Harus digunakan bersama dengan scan.startup.mode: initial.
scan.newly-added-table.enabled: true
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
pipeline:
name: MySQL to Paimon Pipeline
Mengecualikan tabel tertentu dalam sinkronisasi seluruh database
Untuk mengecualikan tabel tertentu, seperti tabel uji atau tabel yang menyebabkan failover job berulang, dari job sinkronisasi seluruh database, gunakan konfigurasi berikut:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
# Tabel yang cocok dengan ekspresi reguler ini tidak disinkronkan.
tables.exclude: test_db.table1
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
pipeline:
name: MySQL to Paimon Pipeline
Menyinkronkan seluruh database ke tabel Paimon dalam format file Lance
Lance adalah format penyimpanan data yang dirancang untuk data vektor dan multimodal. Atur parameter pembuatan tabel file.format untuk menulis data ke tabel Paimon yang menggunakan format file Lance. Contoh berikut menunjukkan konfigurasinya:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
# Tentukan format file file output sebagai lance
table.properties.file.format: lance
pipeline:
name: MySQL to Paimon Pipeline
Aktifkan mode EVOLVE
Mode EVOLVE menjaga skema tabel downstream tetap konsisten secara ketat dengan skema tabel upstream, termasuk operasi seperti menghapus bidang dan menghapus tabel. Dalam mode ini, jika downstream tidak dapat menerapkan semua event perubahan skema, job mungkin mengalami failover dan tidak dapat pulih tanpa intervensi. Contoh berikut menunjukkan konfigurasi job:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
#(Opsional) Sinkronkan data dari tabel yang baru ditambahkan selama fase inkremental.
scan.binlog.newly-added-table.enabled: true
#(Opsional) Sinkronkan komentar tabel dan bidang.
include-comments.enabled: true
#(Opsional) Utamakan distribusi shard tak terbatas untuk mencegah potensi masalah Out Of Memory (OOM) pada TaskManager.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
#(Opsional) Aktifkan parsing dan filtering untuk mempercepat pembacaan data.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: paimon
name: Paimon Sink
using.built-in-catalog: paimon_dlf_catalog
#(Opsional) Tentukan pengguna commit. Kami menyarankan Anda menggunakan pengguna commit berbeda untuk setiap job untuk menghindari konflik.
commit.user: your_job_name
#(Opsional) Aktifkan vektor penghapusan untuk meningkatkan performa baca.
table.properties.deletion-vectors.enabled: true
pipeline:
name: MySQL to Paimon Pipeline
schema.change.behavior: evolve
FAQ
-
Mengapa job Paimon gagal dengan "Heartbeat of TaskManager timed out"?
-
Mengapa job Paimon gagal dengan "Sink materializer must not be used with Paimon sink"?
-
Mengapa job Paimon gagal dengan "File deletion conflicts detected" atau "LSM conflicts detected"?
-
Mengapa job Paimon gagal dengan "File xxx not found, Possible causes"?
-
Apakah visibilitas data connector Paimon terkait dengan interval checkpoint?