All Products
Search
Document Center

Realtime Compute for Apache Flink:Paimon connector

Last Updated:Sep 21, 2026

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 (
      ...
    );
    Catatan

    Jika 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/test dan oss://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

  • Parameter ini tidak diperlukan jika Anda membuat tabel Paimon di Paimon catalog.

  • Jika Anda membuat tabel temporary Paimon di catalog lain, parameter ini harus diatur ke paimon.

path

Path penyimpanan tabel.

String

Tidak

Tidak ada

  • Parameter ini tidak diperlukan jika Anda membuat tabel Paimon di Paimon catalog.

  • Jika Anda membuat tabel temporary Paimon di catalog lain, parameter ini menentukan direktori penyimpanan tabel di HDFS atau OSS.

auto-create

Menentukan apakah file tabel dibuat secara otomatis jika tidak ada di path yang ditentukan.

Boolean

Tidak

false

Nilai yang valid:

  • false (default): Jika file tabel Paimon tidak ada di path yang ditentukan, job gagal.

  • true: Jika path yang ditentukan tidak ada, Flink secara otomatis membuat file tabel Paimon.

file.format

Format file data.

String

Tidak

parquet

Nilai yang valid:

  • orc

  • parquet

  • avro

  • lance (Didukung di Realtime Compute for Apache Flink 11.6 dan yang lebih baru)

  • mosaic (Didukung di Realtime Compute for Apache Flink 11.9 dan yang lebih baru)

bucket

Jumlah bucket per partisi.

Integer

Tidak

1

Paimon mendistribusikan data ke bucket berdasarkan bucket-key.

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, 'bucket-key' = 'order_id,cust_id' mendistribusikan data berdasarkan kolom order_id dan cust_id.

Catatan
  • Jika parameter ini tidak ditentukan, Paimon mendistribusikan data berdasarkan kunci primer.

  • Jika tabel tidak memiliki kunci primer, Paimon mendistribusikan data berdasarkan nilai semua kolom.

changelog-producer

Mekanisme produksi changelog.

String

Tidak

none

Paimon dapat menghasilkan changelog lengkap untuk aliran input apa pun, artinya setiap record update_after memiliki record update_before yang sesuai. Hal ini menyederhanakan konsumsi downstream. Nilai yang valid:

  • none (default): Tidak menghasilkan changelog tambahan. Konsumen downstream tetap dapat membaca tabel Paimon dalam mode streaming, tetapi changelog-nya tidak lengkap (hanya berisi record update_after tanpa record update_before yang sesuai).

  • input: Menulis aliran input ke file changelog, yang berfungsi sebagai changelog lengkap.

  • full-compaction: Menghasilkan changelog lengkap selama setiap full compaction.

  • lookup: Menghasilkan changelog lengkap sebelum setiap snapshot dikomit.

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 lookup.

merge-engine

Mekanisme penggabungan record dengan kunci primer yang sama.

String

Tidak

deduplicate

Nilai yang valid:

  • deduplicate: Menyimpan hanya record terbaru.

  • partial-update: Memperbarui record yang ada dengan nilai non-null dari record terbaru. Kolom lain tetap tidak berubah.

  • aggregation: Melakukan pre-agregasi menggunakan fungsi agregat yang ditentukan.

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:

  • true: Mengabaikan pesan delete.

  • false: Memproses pesan delete. Anda harus mengonfigurasi strategi penanganan penghapusan menggunakan parameter seperti sequence.field untuk mencegah potensi error IllegalStateException atau IllegalArgumentException.

Catatan
  • Di Realtime Compute for Apache Flink 8.0.6 dan yang lebih lama, parameter ini hanya berlaku dalam skenario partial update di mana merge-engine = 'partial-update'.

  • Di Realtime Compute for Apache Flink 8.0.7 dan yang lebih baru, parameter ini juga kompatibel dengan skenario non-partial-update dan memiliki fungsi yang sama dengan parameter ignore-delete. Kami menyarankan Anda menggunakan ignore-delete sebagai gantinya.

  • Tentukan apakah akan mengaktifkan parameter ini berdasarkan kebutuhan bisnis Anda dan apakah pesan delete diharapkan. Jika pesan delete tidak sesuai dengan semantik yang dimaksudkan oleh job Anda, lebih baik gagal cepat (fail fast).

ignore-delete

Menentukan apakah pesan delete (-D) diabaikan.

Boolean

Tidak

false

Nilai yang valid sama dengan nilai untuk partial-update.ignore-delete.

Catatan
  • Parameter ini hanya didukung di Realtime Compute for Apache Flink 8.0.7 dan yang lebih baru.

  • Parameter ini memiliki fungsi yang sama dengan partial-update.ignore-delete. Kami menyarankan Anda menggunakan ignore-delete dan menghindari konfigurasi kedua parameter secara bersamaan.

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.time-retained terpenuhi, dan kondisi snapshot.num-retained.min juga terpenuhi.

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 snapshot.num-retained.max terpenuhi, dan kondisi snapshot.num-retained.min juga terpenuhi.

write-mode

Mode penulisan untuk tabel Paimon.

String

Tidak

change-log

Nilai yang valid:

  • change-log: Tabel Paimon mendukung operasi insert, delete, dan update berdasarkan kunci primer.

  • append-only: Tabel Paimon hanya menerima operasi insert dan tidak mendukung kunci primer. Mode ini lebih efisien daripada mode change-log.

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:

  • true: Secara otomatis menginfer paralelisme tabel sumber Paimon berdasarkan jumlah bucket.

  • false: Menggunakan paralelisme default yang dikonfigurasi di Realtime Compute for Apache Flink. Jika mode expert diaktifkan, job menggunakan paralelisme yang Anda konfigurasi.

scan.parallelism

Paralelisme untuk tabel sumber Paimon.

Integer

Tidak

Tidak ada

Catatan

Parameter ini diabaikan jika Mode diatur ke Mode pada tab Configuration > Resources job.

sink.parallelism

Paralelisme untuk tabel sink Paimon.

Integer

Tidak

Tidak ada

Catatan

Parameter ini diabaikan jika Mode diatur ke Mode pada tab Configuration > Resources 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, 'col1,col2'.

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:

  • NONE (default): Tidak melakukan validasi.

  • IGNORE_DELETE: Operator sink harus mengabaikan pesan -U dan -D. Tidak ada retraction yang terjadi.

  • NON_PK_FIELD_TO_NULL: Operator sink harus mengabaikan pesan -U. Untuk pesan -D, operator menyimpan kunci primer dan mengatur semua bidang non-kunci-primer menjadi null.

    Ini terutama digunakan untuk partial update ketika beberapa sink menulis ke tabel yang sama.

  • DELETE_ROW_ON_PK: Operator sink harus mengabaikan pesan -U tetapi menghapus baris yang sesuai dengan kunci primer untuk pesan -D.

  • CHANGELOG_STANDARD: Operator sink harus menghapus baris yang sesuai dengan kunci primer untuk pesan -U dan -D.

Catatan
  • Parameter ini hanya didukung di Realtime Compute for Apache Flink 8.0.8 dan yang lebih baru.

  • Perilaku sink aktual untuk retraction ditentukan oleh parameter lain, seperti ignore-delete dan merge-engine. Parameter ini hanya memvalidasi apakah perilaku aktual sesuai dengan strategi yang dipilih. Jika terjadi ketidaksesuaian, job gagal dengan pesan error yang menyarankan koreksi.

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.

Catatan

Untuk informasi lebih lanjut tentang opsi konfigurasi, lihat Dokumentasi Resmi Apache Paimon.

Parameter tabel vektor

Penting

Parameter berikut hanya didukung di VVR 11.8 dan yang lebih baru.

Parameter

Deskripsi

Tipe data

Wajib

Nilai default

Keterangan

ivf.nprobe

Jumlah kluster IVF yang diproses selama pencarian.

Integer

Tidak

16

Nilai yang lebih tinggi umumnya meningkatkan recall tetapi meningkatkan latensi.

ivf.refine_factor

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.

hnsw.ef_search

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.

diskann.search.list_size

Ukuran daftar pencarian Lumina DiskANN.

Integer

Tidak

max(1.5 × top_k, 16)

Nilai yang lebih tinggi umumnya meningkatkan recall tetapi meningkatkan latensi.

diskann.search.beam_width

Lebar beam pencarian Lumina DiskANN.

Integer

Tidak

4

—

search.parallel_number

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:

  • <1, 23.0, 10, NULL>

  • <1, NULL, NULL, 'This is a book'>

  • <1, 25.2, NULL, NULL>

Jika kolom pertama adalah kunci primer, record gabungan akhirnya adalah <1, 25.2, 10, 'This is a book'>.

Catatan
  • Untuk membaca hasil partial update dalam mode streaming, Anda harus mengatur parameter changelog-producer ke lookup atau full-compaction.

  • Mesin partial update tidak dapat memproses pesan delete. Anda dapat mengatur parameter partial-update.ignore-delete ke true untuk mengabaikan pesan delete.

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 fields.<field-name>.aggregate-function. Jika tidak, kolom tersebut secara default menggunakan fungsi agregat last_non_null_value. Sebagai contoh, pertimbangkan definisi tabel Paimon berikut.

CREATE TABLE MyTable (
  product_id BIGINT,
  price DOUBLE,
  sales BIGINT,
  PRIMARY KEY (product_id) NOT ENFORCED
) WITH (
  'merge-engine' = 'aggregation',
  'fields.price.aggregate-function' = 'max',
  'fields.sales.aggregate-function' = 'sum'
);

Kolom price diagregasi menggunakan fungsi max, dan kolom sales diagregasi menggunakan fungsi sum. Diberikan dua record input, <1, 23.0, 15> dan <1, 30.2, 20>, hasil akhirnya adalah <1, 30.2, 35>. Fungsi agregat yang didukung dan tipe datanya adalah:

  • sum: Mendukung DECIMAL, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, dan DOUBLE.

  • min dan max: Mendukung DECIMAL, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, DOUBLE, DATE, TIME, TIMESTAMP, dan TIMESTAMP_LTZ.

  • last_value dan last_non_null_value: Mendukung semua tipe data.

  • listagg: Mendukung STRING.

  • bool_and dan bool_or: Mendukung BOOLEAN.

Catatan
  • Hanya fungsi sum yang mendukung retraction dan penghapusan; fungsi agregat lain tidak. Jika Anda ingin kolom tertentu mengabaikan pesan retraction dan delete, Anda dapat mengatur 'fields.${field_name}.ignore-retract'='true'.

  • Untuk membaca hasil agregasi dalam mode streaming, Anda harus mengatur parameter changelog-producer ke lookup atau full-compaction.

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 changelog-producer ke none (default), tabel sumber Paimon downstream hanya melihat status terbaru data untuk kunci primer tertentu. Changelog yang tidak lengkap ini menyulitkan konsumen untuk melakukan perhitungan yang benar karena mereka tidak dapat menentukan status sebelumnya dari data, hanya apakah data tersebut dihapus atau status terbarunya.

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 update_before sebaiknya tidak menggunakan produsen none, tetapi produsen changelog lain menimbulkan overhead performa.

Catatan

Jika konsumen downstream Anda, seperti database, tidak sensitif terhadap data update_before, Anda dapat menggunakan produsen none. Konfigurasikan produsen changelog berdasarkan kebutuhan spesifik Anda.

Input

Saat Anda mengatur changelog-producer ke input, tabel sink melakukan dual-write aliran input ke file changelog.

Gunakan produsen ini hanya ketika aliran input itu sendiri sudah merupakan changelog lengkap, seperti data dari Change Data Capture (CDC).

Lookup

Saat Anda mengatur changelog-producer ke lookup, tabel sink menggunakan mekanisme kueri titik, mirip dengan lookup tabel dimensi, untuk menghasilkan changelog lengkap untuk snapshot saat ini sebelum dikomit. Produsen ini menghasilkan changelog lengkap dari aliran input apa pun.

Dibandingkan dengan produsen full-compaction, produsen lookup menawarkan ketepatan waktu yang lebih baik untuk changelog tetapi mengonsumsi lebih banyak sumber daya secara keseluruhan.

Gunakan opsi ini untuk kasus penggunaan yang memerlukan freshness data tinggi (misalnya, tingkat menit).

Full Compaction

Saat Anda mengatur changelog-producer ke full-compaction, tabel sink menghasilkan changelog lengkap selama setiap full compaction. Produsen ini menghasilkan changelog lengkap dari aliran input apa pun. Interval untuk full compaction ditentukan oleh parameter full-compaction.delta-commits.

Dibandingkan dengan produsen lookup, produsen full-compaction memiliki latensi yang lebih tinggi tetapi memanfaatkan proses full compaction yang sudah ada tanpa menambahkan komputasi ekstra. Hal ini menghasilkan konsumsi sumber daya keseluruhan yang lebih rendah.

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 change-log adalah default untuk tabel Paimon. Mode ini mendukung operasi insert, delete, dan update berdasarkan kunci primer. Anda juga dapat menggunakan mesin penggabungan dan produsen changelog dalam mode ini.

Append-only

Mode penulisan append-only hanya mendukung penyisipan data dan tidak menggunakan kunci primer. Mode ini lebih efisien daripada mode change-log dan dapat digunakan sebagai alternatif antrian pesan dalam skenario dengan persyaratan freshness data moderat (misalnya, freshness tingkat menit).

Untuk deskripsi detail tentang mode penulisan append-only, lihat dokumentasi resmi Apache Paimon. Saat menggunakan mode ini, perhatikan hal berikut:

  • Atur parameter bucket-key sesuai kebutuhan Anda. Jika tidak, tabel Paimon mendistribusikan data berdasarkan nilai semua kolom, yang tidak efisien secara komputasi.

  • Mode penulisan append-only dapat menjamin urutan output data sampai batas tertentu. Urutan output spesifiknya adalah sebagai berikut:

    1. Untuk record dari partisi berbeda: jika parameter scan.plan-sort-partition diatur, record dari partisi dengan nilai lebih kecil dioutput terlebih dahulu. Jika tidak, record dari partisi yang dibuat lebih awal dioutput terlebih dahulu.

    2. Untuk record dari partisi dan bucket yang sama, record yang ditulis lebih awal dioutput terlebih dahulu.

    3. Untuk record dari partisi yang sama tetapi bucket berbeda, urutan output tidak dijamin karena bucket berbeda diproses oleh tugas konkuren yang berbeda.

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

variant.read.pushdown.enabled

false

Atur ke true untuk mengaktifkan pemangkasan baca Variant.

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.inferShreddingSchema untuk mengaktifkan inferensi shredding Variant otomatis, atau secara eksplisit mengonfigurasi variant.shreddingSchema dan 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

source_table

Literal STRING

Tabel Paimon yang berisi kolom Blob, dalam format database.table. Jika catalog tabel sama dengan catalog tempat fungsi berada, Anda juga dapat menggunakan catalog.database.table. Nilainya harus berupa literal tidak kosong. Bidang tabel, kolom dinamis, dan ekspresi CASE tidak didukung.

descriptor

BYTES

Byte BlobDescriptor, yang merupakan hasil membaca kolom Blob setelah blob-as-descriptor = 'true' diaktifkan.

validity

INTERVAL

Periode validitas URL. Nilainya harus berupa jumlah detik positif, misalnya, INTERVAL '5' MINUTE.

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') */;
Catatan
  • descriptor_to_presigned_url melempar exception pada kesalahan tingkat baris. try_descriptor_to_presigned_url mengembalikan 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 t$branch_delta.

Hanya perubahan yang disimpan di partisi delta yang dipilih. Status lengkap tidak dibangun kembali.

Kueri hibrid

Menggabungkan kueri lengkap dan kueri inkremental dengan UNION ALL.

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 continuous.discovery-interval.

-- 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-snapshot ke true. 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`;
Catatan

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 bucket dan bucket-key.

  • Skema setiap cabang harus konsisten.

  • Tabel rantai memerlukan sequence.field. Mesin penggabungan first-row dan aggregation tidak didukung.

  • Baca streaming dan join lookup memerlukan cabang delta untuk menggunakan mesin penggabungan deduplicate (nilai default). Baca batch tidak terpengaruh.

  • Vektor penghapusan hanya didukung untuk tabel rantai yang menggunakan mesin penggabungan deduplicate.

  • Hanya none (nilai default) dan input yang didukung untuk changelog-producer. Mode lookup dan full-compaction tidak didukung. Jika nilainya none, record dinormalisasi oleh kunci primer lengkap yang mencakup partisi rantai, dan record -D dan -U yang record aslinya berada di partisi lain dibuang. Atur nilainya ke input jika 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 seperti scan.snapshot-id, scan.timestamp-millis, scan.mode diatur ke latest, atau consumer-id. Untuk melakukan baca streaming standar tanpa logika tabel rantai, baca tabel cabang tertentu seperti t$branch_delta.

  • Filter partisi tidak didukung dalam baca streaming dan join lookup tabel rantai. Ini termasuk kolom partisi dalam klausa WHERE dan opsi scan.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-formatter harus 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, dan s), 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

mosaic.num-buckets

auto

Jumlah bucket kolom untuk I/O paralel. Jika nilainya 0 atau opsi tidak ditentukan, jumlah bucket ditentukan secara otomatis.

mosaic.stats-columns

(kosong)

Nama kolom yang dikumpulkan statistik min/max-nya untuk predicate pushdown, dipisahkan dengan koma (,). Tidak ada statistik yang dikumpulkan jika nilainya kosong.

mosaic.read.prefetch-row-groups

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.

mosaic.read.prefetch-max-bytes

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 mosaic.read.prefetch-row-groups.

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

max_pt(): hanya memuat partisi terbaru. max_two_pt(): hanya memuat dua partisi terbaru.

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;
Catatan
  • 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 paimon.

name

Nama sink.

Tidak

STRING

Tidak ada

catalog.properties.metastore

Jenis catalog Paimon.

Tidak

STRING

filesystem

Nilai yang valid:

  • filesystem (default)

  • rest (hanya mendukung Data Lake Formation (DLF), bukan DLF-Legacy)

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:

  • orc

  • parquet

  • avro

  • lance (VVR 11.6 dan yang lebih baru)

  • mosaic (VVR 11.9 dan yang lebih baru)

catalog.properties.warehouse

Direktori root untuk penyimpanan file.

Tidak

STRING

Tidak ada

Parameter ini hanya berlaku saat catalog.properties.metastore diatur ke filesystem.

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 ;, bidang berbeda dipisahkan oleh ,, dan tabel serta bidang dipisahkan oleh :. Contohnya: testdb.table1:id1,id2;testdb.table2:name.

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.

  • Format: Gunakan titik koma ; untuk memisahkan nama tabel.

  • Rekomendasi performa: Operasi ini intensif sumber daya. Buat job terpisah untuk tabel-tabel ini.

Penting
  • Anda harus mencantumkan semua tabel yang memenuhi kriteria. Menghilangkan nama tabel akan mengakibatkan duplikasi data.

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 AllowNonRestoredState agar job dapat mengabaikan state operator parsial.

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:

  • true (default): memeriksa kompatibilitas tipe kolom dan kolom NOT NULL yang hilang atau berlebih di tabel yang ada, dan secara otomatis menambahkan kolom nullable yang ada di tabel upstream tetapi hilang di tabel downstream. Jika kasus tidak dapat disesuaikan secara otomatis, job gagal dan mengembalikan pernyataan SQL yang dapat Anda jalankan untuk memperbaiki masalah.

  • false: melewati pemeriksaan dan penambahan kolom otomatis tersebut, dan menulis data berdasarkan skema yang ada di tabel downstream. Hanya penambahan kolom otomatis yang dilakukan saat pernyataan CREATE TABLE awal dieksekusi yang dilewati. Perubahan skema berikutnya diterapkan secara otomatis.

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.

Catatan

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.

Penting

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