Gunakan Kafka connector sebagai source, sink, atau tujuan Flink CDC di Realtime Compute for Apache Flink.
Ikhtisar
Apache Kafka adalah platform streaming event terdistribusi open-source yang banyak digunakan untuk pemrosesan data berkinerja tinggi, analitik streaming, dan integrasi data. Kafka connector untuk Realtime Compute for Apache Flink menggunakan klien Apache Kafka open-source untuk menyediakan throughput data berkinerja tinggi, mendukung pembacaan dan penulisan berbagai format data, serta menawarkan semantik tepat-sekali (exactly-once semantics).
|
Kategori |
Deskripsi |
|
Jenis yang didukung |
SQL source, sink Flink CDC source, sink DataStream source, sink |
|
Mode eksekusi |
Streaming |
|
Format data |
|
|
Metrik |
|
|
Jenis API |
SQL, DataStream, Flink CDC |
|
Pembaruan/penghapusan sink |
Connector hanya mendukung penambahan data ke tabel sink. Pembaruan dan penghapusan tidak didukung. Catatan
Untuk informasi lebih lanjut tentang cara memperbarui atau menghapus data di Tabel Sink, lihat Upsert Kafka. |
Prasyarat
Sebelum memulai, pastikan Anda memenuhi prasyarat berikut sesuai jenis kluster Kafka Anda:
-
Menghubungkan ke kluster ApsaraMQ for Kafka
-
Versi kluster Kafka minimal 0.11.
-
Anda telah membuat kluster ApsaraMQ for Kafka. Untuk informasi lebih lanjut, lihat Langkah 3: Buat sumber daya.
-
Ruang kerja Flink dan kluster Kafka berada dalam Virtual Private Cloud (VPC) yang sama, dan Anda telah menambahkan Blok CIDR ruang kerja Flink ke daftar putih ApsaraMQ for Kafka. Untuk informasi lebih lanjut, lihat Konfigurasi daftar putih.
PentingBatasan penulisan data ke ApsaraMQ for Kafka:
-
ApsaraMQ for Kafka tidak mendukung format kompresi Zstandard (zstd) untuk penulisan.
-
ApsaraMQ for Kafka tidak mendukung penulisan idempoten atau transaksional, sehingga mencegah Anda menggunakan semantik tepat-sekali yang disediakan oleh tabel sink Kafka. Mulai Ververica Runtime (VVR) 8.0.0, Kafka connector menggunakan klien Kafka 3.x, di mana properti
properties.enable.idempotencesecara default bernilaitrue. Oleh karena itu, untuk mencegah kegagalan penulisan saat menggunakan Ververica Runtime (VVR) 8.0.0 atau versi lebih baru untuk menulis ke ApsaraMQ for Kafka, Anda harus menambahkan konfigurasiproperties.enable.idempotence=falseke definisi tabel sink Anda. Untuk perbandingan mesin penyimpanan dan batasan fitur ApsaraMQ for Kafka, lihat Perbandingan antar mesin penyimpanan.
-
-
Menghubungkan ke kluster Apache Kafka yang dikelola sendiri
-
Versi kluster Apache Kafka yang dikelola sendiri minimal 0.11.
-
Ruang kerja Flink memiliki konektivitas jaringan ke kluster Apache Kafka yang dikelola sendiri. Untuk detail cara menghubungkan ke kluster melalui internet publik, lihat FAQ tentang konektivitas jaringan.
-
Hanya opsi konfigurasi klien untuk Apache Kafka versi 2.8 yang didukung. Untuk informasi lebih lanjut, lihat dokumentasi Apache Kafka Consumer Configs dan Producer Configs.
-
Catatan
Penulisan transaksional tidak disarankan karena adanya keterbatasan desain yang diketahui pada Apache Flink dan Apache Kafka. Saat Anda mengatur sink.delivery-guarantee = 'exactly-once', Kafka connector mengaktifkan penulisan transaksional, dengan masalah yang diketahui sebagai berikut:
-
Setiap checkpoint menghasilkan ID Transaksi baru. Jika interval checkpoint terlalu pendek, banjir ID Transaksi yang dihasilkan dapat menyebabkan koordinator kluster Kafka kehabisan memori, sehingga mengganggu stabilitas kluster.
-
Setiap transaksi membuat instans Producer baru. Jika terlalu banyak transaksi melakukan commit secara bersamaan, Pengelola Tugas (TaskManager) dapat kehabisan memori, sehingga mengganggu pekerjaan Apache Flink.
-
Jika beberapa pekerjaan Apache Flink menggunakan
sink.transactional-id-prefixyang sama, ID Transaksi yang dihasilkan dapat bertabrakan. Ketika operasi penulisan gagal pada satu pekerjaan, hal ini dapat mencegah Log Start Offset (LSO) partisi Apache Kafka maju. Hal ini memengaruhi semua konsumen partisi tersebut.
Jika Anda memerlukan semantik tepat-sekali, gunakan connector Upsert Kafka untuk menulis ke tabel kunci primer, sehingga memastikan idempotensi. Jika Anda harus menggunakan penulisan transaksional, lihat Catatan penggunaan semantik tepat-sekali.
Pemecahan masalah konektivitas jaringan
Error Timed out waiting for a node assignment saat pekerjaan Realtime Compute for Apache Flink gagal dimulai biasanya menunjukkan adanya masalah konektivitas jaringan antara Realtime Compute for Apache Flink dan kluster Kafka.
Klien Kafka menghubungkan ke broker sebagai berikut:
-
Klien menggunakan alamat yang ditentukan dalam
bootstrap.serversuntuk membuat koneksi awal ke kluster Kafka. -
Kluster Kafka mengembalikan metadata untuk setiap broker, termasuk titik akhirnya.
-
Klien kemudian menggunakan titik akhir ini untuk menghubungkan ke broker guna membaca atau menulis data.
Meskipun alamat bootstrap.servers dapat dijangkau, klien tidak dapat membaca atau menulis data jika Kafka mengembalikan titik akhir broker yang salah. Masalah ini sering terjadi pada arsitektur jaringan yang menggunakan proxy, penerusan port, atau jalur sewa.
Langkah pemecahan masalah
ApsaraMQ for Kafka
-
Konfirmasi tipe Titik Akhir
-
Titik Akhir Default (jaringan internal)
-
Titik Akhir SASL (jaringan internal dengan otentikasi)
-
Titik Akhir Publik (memerlukan aplikasi terpisah)
Gunakan fitur Network Probe di konsol pengembangan Realtime Compute for Apache Flink untuk mengesampingkan masalah konektivitas dengan alamat
bootstrap.servers. -
-
Periksa grup keamanan dan daftar putih
Tambahkan Blok CIDR ruang kerja Realtime Compute for Apache Flink ke daftar putih instans Kafka Anda. Untuk informasi lebih lanjut, lihat Lihat Blok CIDR VPC dan Konfigurasi daftar putih.
-
Periksa konfigurasi SASL (jika diaktifkan)
Jika Anda menggunakan titik akhir SASL_SSL, pastikan mekanisme JAAS, SSL, dan SASL dikonfigurasi dengan benar di pekerjaan Realtime Compute for Apache Flink Anda. Otentikasi yang hilang dapat menyebabkan koneksi gagal selama fase handshake, yang juga dapat muncul sebagai timeout. Untuk informasi lebih lanjut, lihat Keamanan dan otentikasi.
Kafka yang dikelola sendiri
-
Gunakan fitur Network Probe
Fitur ini membantu Anda mengesampingkan masalah konektivitas dengan alamat
bootstrap.serversdan memverifikasi bahwa titik akhir internal atau publik yang benar digunakan. -
Periksa grup keamanan dan daftar putih
-
Grup keamanan untuk instans Elastic Compute Service (ECS) harus mengizinkan lalu lintas inbound pada port titik akhir Kafka, biasanya 9092 atau 9093.
-
Pastikan firewall apa pun pada instans ECS mengizinkan traffic dari VPC ruang kerja Realtime Compute for Apache Flink Anda. Untuk informasi lebih lanjut, lihat Lihat Blok CIDR VPC.
-
-
Periksa konfigurasi
-
Gunakan tool zkCli.sh atau zookeeper-shell.sh untuk login ke kluster ZooKeeper yang digunakan Kafka.
-
Jalankan perintah untuk mendapatkan metadata broker. Misalnya, jalankan
get /brokers/ids/0. Di bidang endpoints respons, temukan alamat yang diiklankan Kafka kepada klien.
-
Gunakan fitur Network Probe di konsol pengembangan Realtime Compute for Apache Flink untuk menguji apakah alamat ini dapat diakses.
Catatan-
Jika alamat tidak dapat diakses, hubungi administrator Kafka Anda untuk memeriksa dan memperbaiki konfigurasi
listenersdanadvertised.listenersagar alamat yang diiklankan dapat diakses dari Realtime Compute for Apache Flink. -
Untuk informasi lebih lanjut tentang koneksi klien Kafka, lihat Pemecahan Masalah Konektivitas.
-
-
-
Periksa konfigurasi SASL (jika diaktifkan)
Jika Anda menggunakan titik akhir SASL_SSL, pastikan mekanisme JAAS, SSL, dan SASL dikonfigurasi dengan benar di pekerjaan Realtime Compute for Apache Flink Anda. Otentikasi yang hilang dapat menyebabkan koneksi gagal selama fase handshake, yang juga dapat muncul sebagai timeout. Untuk informasi lebih lanjut, lihat Keamanan dan otentikasi.
SQL
Gunakan Kafka connector sebagai tabel source atau tabel sink dalam pekerjaan SQL.
Sintaks
CREATE TABLE KafkaTable (
`user_id` BIGINT,
`item_id` BIGINT,
`behavior` STRING,
`ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL
) WITH (
'connector' = 'kafka',
'topic' = 'user_behavior',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'csv'
)
Kolom metadata
Definisikan kolom metadata di tabel source atau sink untuk mengakses metadata pesan Kafka. Misalnya, saat Anda berlangganan ke beberapa topik, kolom metadata dapat mengidentifikasi dari topik mana setiap record berasal.
CREATE TABLE kafka_source (
-- Baca topik pesan sebagai kolom `record_topic`
`record_topic` STRING NOT NULL METADATA FROM 'topic' VIRTUAL,
-- Baca timestamp dari ConsumerRecord sebagai kolom `ts`
`ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL,
-- Baca offset pesan sebagai kolom `record_offset`
`record_offset` BIGINT NOT NULL METADATA FROM 'offset' VIRTUAL,
...
) WITH (
'connector' = 'kafka',
...
);
CREATE TABLE kafka_sink (
-- Tulis timestamp dari kolom `ts` sebagai timestamp ProducerRecord ke Kafka
`ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL,
...
) WITH (
'connector' = 'kafka',
...
);
Tabel berikut mencantumkan kolom metadata yang didukung oleh tabel source dan sink Kafka.
|
Kunci |
Type |
Deskripsi |
Cakupan |
|
topic |
STRING NOT NULL METADATA VIRTUAL |
Topik pesan. |
Tabel source |
|
partition |
INT NOT NULL METADATA VIRTUAL |
ID partisi pesan. |
Tabel source |
|
headers |
MAP<STRING, BYTES> NOT NULL METADATA VIRTUAL |
Header pesan. |
Tabel source dan sink |
|
leader-epoch |
INT NOT NULL METADATA VIRTUAL |
Leader-epoch pesan. |
Tabel source |
|
offset |
BIGINT NOT NULL METADATA VIRTUAL |
Offset pesan. |
Tabel source |
|
timestamp |
TIMESTAMP(3) WITH LOCAL TIME ZONE NOT NULL METADATA VIRTUAL |
Timestamp pesan. |
Tabel source dan sink |
|
timestamp-type |
STRING NOT NULL METADATA VIRTUAL |
Tipe timestamp pesan. Nilai yang valid adalah:
|
Tabel source |
|
__raw_key__ |
STRING NOT NULL METADATA VIRTUAL |
Kunci pesan mentah. |
Tabel source dan sink Catatan
Parameter ini hanya didukung di Ververica Runtime (VVR) 11.4 ke atas. |
|
__raw_value__ |
STRING NOT NULL METADATA VIRTUAL |
Nilai pesan mentah. |
Tabel source dan sink Catatan
Parameter ini hanya didukung di Ververica Runtime (VVR) 11.4 ke atas. |
Opsi connector
-
Umum
Opsi
Deskripsi
Jenis
Wajib
Default
Keterangan
connector
Jenis connector.
String
Ya
–
Nilainya harus
kafka.properties.bootstrap.servers
Daftar alamat broker Kafka.
String
Ya
–
Format:
host:port,host:port,.... Pisahkan alamat dengan koma (,).properties.*
Properti tambahan untuk klien Kafka.
String
Tidak
–
Kunci properti harus merupakan opsi yang valid sebagaimana didefinisikan dalam dokumentasi resmi Apache Kafka untuk Producer Configs dan Consumer Configs.
Realtime Compute for Apache Flink menghapus awalan properties. dan meneruskan pasangan kunci-nilai yang tersisa ke klien Kafka yang mendasari. Misalnya, Anda dapat mengatur
'properties.allow.auto.create.topics' = 'false'untuk menonaktifkan pembuatan topik otomatis.Kafka connector menimpa opsi-opsi ini, sehingga Anda tidak dapat mengonfigurasinya dengan cara ini:
-
key.deserializer
-
value.deserializer
format
Format untuk serialisasi dan deserialisasi nilai pesan Kafka.
String
Tidak
–
Format yang didukung:
-
csv
-
json
-
avro
-
debezium-json
-
canal-json
-
maxwell-json
-
avro-confluent
-
raw
CatatanUntuk informasi lebih lanjut, lihat Opsi format.
key.format
Format untuk serialisasi dan deserialisasi kunci pesan Kafka.
String
Tidak
–
Format yang didukung:
-
csv
-
json
-
avro
-
debezium-json
-
canal-json
-
maxwell-json
-
avro-confluent
-
raw
CatatanSaat menggunakan konfigurasi ini, key.options wajib diisi.
key.fields
Bidang dari skema tabel yang akan digunakan sebagai kunci pesan Kafka.
String
Tidak
–
Pisahkan beberapa nama bidang dengan titik koma (;). Misalnya,
'field1;field2'.key.fields-prefix
Awalan kustom untuk semua bidang kunci guna mencegah konflik nama dengan bidang nilai.
String
Tidak
–
Awalan ini digunakan untuk membedakan antara bidang kunci dan bidang nilai. Awalan ini dihapus sebelum serialisasi kunci atau setelah deserialisasi.
CatatanJika Anda menggunakan opsi ini,
value.fields-includeharus diatur keEXCEPT_KEY.value.format
Format untuk serialisasi dan deserialisasi nilai pesan Kafka.
String
Tidak
–
Konfigurasi ini setara dengan
format. Anda hanya dapat mengatur salah satu dariformatatauvalue.format. Jika keduanya dikonfigurasi,value.formatakan menggantikanformat.value.fields-include
Menentukan apakah bidang kunci disertakan dalam format nilai.
String
Tidak
ALL
Nilai yang valid:
-
ALL: Nilai pesan Kafka mencakup semua kolom tabel. -
EXCEPT_KEY: Nilai pesan Kafka mencakup semua kolom tabel kecuali yang didefinisikan dalamkey.fields.
-
-
Tabel sumber
Opsi
Deskripsi
Jenis
Wajib
Default
Keterangan
topic
Topik atau topik-topik yang akan dibaca.
String
Tidak
–
Untuk berlangganan ke beberapa topik, pisahkan nama-namanya dengan titik koma (;), misalnya,
'topic-1;topic-2'.CatatanAnda dapat menentukan opsi ini atau
topic-pattern, tetapi tidak keduanya.topic-pattern
Ekspresi reguler yang cocok dengan topik yang akan di-subscribe. Konsumen berlangganan ke semua topik yang namanya cocok dengan pola ini.
String
Tidak
–
Contoh:
-
user_event_.*: Cocok dengan semua topik yang diawali denganuser_event_. -
prod\.logs\..*: Cocok dengan topik yang diawali denganprod.logs.(karakter.harus di-escape).
CatatanAnda dapat menentukan opsi ini atau
topic, tetapi tidak keduanya.properties.group.id
ID kelompok konsumen source Kafka.
String
Tidak
KafkaSource-{Nama-Tabel-Source}
Jika Anda menggunakan ID kelompok konsumen untuk pertama kalinya, Anda juga harus mengatur properties.auto.offset.reset ke
earliestataulatestuntuk menentukan offset startup awal.scan.startup.mode
Offset startup konsumen Kafka.
String
Tidak
group-offsets
Nilai yang valid:
-
earliest-offset: Mulai membaca dari offset paling awal yang tersedia. -
latest-offset: Mulai membaca dari offset terbaru. -
group-offsets: Mulai membaca dari offset yang telah dikomit oleh properties.group.id yang ditentukan. -
timestamp: Mulai membaca dari scan.startup.timestamp-millis yang ditentukan. -
specific-offsets: Mulai membaca dari offset yang ditentukan dalam scan.startup.specific-offsets.
CatatanOpsi ini hanya berlaku saat pekerjaan dimulai tanpa state. Jika pekerjaan dilanjutkan dari checkpoint, pekerjaan tersebut membaca dari offset yang disimpan dalam state checkpoint.
scan.startup.specific-offsets
Offset awal per-partisi saat
scan.startup.modediatur kespecific-offsets.String
Tidak
–
Misalnya,
partition:0,offset:42;partition:1,offset:300scan.startup.timestamp-millis
Timestamp awal dalam milidetik saat
scan.startup.modediatur ketimestamp.Long
Tidak
–
Unitnya adalah milidetik.
scan.topic-partition-discovery.interval
Interval penemuan partisi.
Duration
Tidak
5 menit
Connector secara berkala menemukan dan membaca dari partisi baru. Saat Anda menggunakan topic-pattern, connector juga menemukan topik baru yang cocok dengan pola tersebut. Atur interval ke nilai non-positif untuk menonaktifkan fitur ini.
CatatanDi Ververica Runtime (VVR) 6.0.x, penemuan partisi dinamis dinonaktifkan secara default. Mulai VVR 8.0, fitur ini diaktifkan secara default dengan interval penemuan 5 menit.
scan.header-filter
Memfilter pesan berdasarkan header pesan Kafka.
String
Tidak
–
Kunci header dan nilainya dipisahkan oleh titik dua (:). Beberapa kondisi header dihubungkan menggunakan operator logika (& dan |). Operator logika NOT (!) juga didukung. Misalnya,
depart:toy|depart:book&!env:testmenyimpan data Kafka jika header berisidepart=toyataudepart=bookdan tidak berisienv=test.Catatan-
Opsi ini hanya didukung di Ververica Runtime (VVR) 8.0.6 ke atas.
-
Tanda kurung dalam ekspresi tidak didukung.
-
Operasi logika dievaluasi dari kiri ke kanan.
-
Nilai header dikonversi ke string UTF-8 untuk perbandingan.
scan.check.duplicated.group.id
Memeriksa apakah sudah ada konsumen aktif lain yang menggunakan
properties.group.id.Boolean
Tidak
false
Nilai yang valid:
-
true: Sebelum memulai pekerjaan, sistem memeriksa duplikasi kelompok konsumen. Jika ditemukan, pekerjaan gagal untuk mencegah konflik.
-
false: Memulai pekerjaan tanpa memeriksa konflik.
CatatanOpsi ini hanya didukung di Ververica Runtime (VVR) 6.0.4 ke atas.
-
-
Sink Table
Opsi
Deskripsi
Jenis
Wajib
Default
Keterangan
topic
Topik tujuan.
String
Ya
–
–
sink.partitioner
Memetakan record dari instans sink paralel ke partisi Kafka.
String
Tidak
default
Nilai yang valid:
-
default: Menggunakan partitioner Kafka default. -
fixed: Setiap instans sink paralel menulis ke partisi Kafka tetap. -
round-robin: Record didistribusikan ke partisi secara round-robin. -
Partitioner kustom: Untuk menggunakan partitioner kustom, berikan nama kelas lengkap dari subclass
FlinkKafkaPartitioner, misalnya,org.mycompany.MyPartitioner.
sink.delivery-guarantee
Jaminan pengiriman sink.
String
Tidak
at-least-once
Nilai yang valid:
-
none: Tidak memberikan jaminan apa pun. Record mungkin hilang atau diduplikasi. -
at-least-once: Menjamin tidak ada record yang hilang, tetapi mungkin terduplikasi. -
exactly-once: Menggunakan transaksi Kafka untuk memberikan semantik tepat-sekali, memastikan record tidak hilang maupun terduplikasi.
CatatanSaat menggunakan semantik
exactly-once, Anda juga harus menentukan sink.transactional-id-prefix.sink.transactional-id-prefix
Awalan ID transaksi. Diperlukan saat
sink.delivery-guaranteediatur keexactly-once.String
Ya, jika
sink.delivery-guaranteediatur keexactly-once–
Hanya diperlukan saat sink.delivery-guarantee diatur ke
exactly-once.sink.parallelism
Paralelisme operator sink.
Integer
Tidak
–
Secara default, framework menentukan paralelisme berdasarkan operator hulu.
-
Keamanan dan otentikasi
Jika kluster Kafka memerlukan koneksi aman atau otentikasi, tambahkan awalan konfigurasi keamanan dan otentikasi terkait dengan properties. dan atur di parameter WITH. Contoh berikut mengonfigurasi tabel Kafka untuk menggunakan PLAIN sebagai mekanisme SASL dengan konfigurasi JAAS.
CREATE TABLE KafkaTable (
`user_id` BIGINT,
`item_id` BIGINT,
`behavior` STRING,
`ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka',
...
'properties.security.protocol' = 'SASL_PLAINTEXT',
'properties.sasl.mechanism' = 'PLAIN',
'properties.sasl.jaas.config' = 'org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="username" password="password";'
)
Contoh berikut menunjukkan cara menggunakan SASL_SSL sebagai protokol keamanan dan SCRAM-SHA-256 sebagai mekanisme SASL.
CREATE TABLE KafkaTable (
`user_id` BIGINT,
`item_id` BIGINT,
`behavior` STRING,
`ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka',
...
'properties.security.protocol' = 'SASL_SSL',
/* Konfigurasi SSL */
/* Path ke truststore untuk sertifikat CA server. */
/* File yang diunggah menggunakan Artifacts disimpan di direktori /flink/usrlib/. */
'properties.ssl.truststore.location' = '/flink/usrlib/kafka.client.truststore.jks',
'properties.ssl.truststore.password' = 'test1234',
/* Jika otentikasi klien diperlukan, Anda juga harus mengonfigurasi path ke keystore (kunci privat). */
'properties.ssl.keystore.location' = '/flink/usrlib/kafka.client.keystore.jks',
'properties.ssl.keystore.password' = 'test1234',
/* Algoritma yang digunakan untuk memverifikasi hostname server. String kosong menonaktifkan verifikasi hostname. */
'properties.ssl.endpoint.identification.algorithm' = '',
/* Konfigurasi SASL */
/* Atur mekanisme SASL ke SCRAM-SHA-256. */
'properties.sasl.mechanism' = 'SCRAM-SHA-256',
/* Konfigurasi JAAS. */
'properties.sasl.jaas.config' = 'org.apache.flink.kafka.shaded.org.apache.kafka.common.security.scram.ScramLoginModule required username="username" password="password";'
)
Anda dapat menggunakan fitur Artifacts di konsol Realtime Compute for Apache Flink untuk mengunggah sertifikat CA dan kunci privat yang disebutkan dalam contoh. File yang diunggah disimpan di direktori /flink/usrlib. Untuk menggunakan file sertifikat CA bernama my-truststore.jks, Anda dapat mengatur properti 'properties.ssl.truststore.location' di klausa WITH dengan salah satu dari dua cara berikut:
-
Atur
'properties.ssl.truststore.location' = '/flink/usrlib/my-truststore.jks'. Metode ini menghindari pengunduhan file secara dinamis dari Object Storage Service (OSS) saat runtime, tetapi tidak mendukung Debug Mode. -
Jika versi mesin Realtime Compute adalah VVR 11.5 atau lebih baru, Anda dapat mengonfigurasi
properties.ssl.truststore.locationdanproperties.ssl.keystore.locationke path OSS absolut. Format path file adalah oss://flink-fullymanaged-<Workspace ID>/artifacts/namespaces/<Nama Namespace>/<nama file>. Metode ini mengunduh file OSS secara dinamis selama runtime Flink dan mendukung Debug Mode.
-
Verifikasi konfigurasi Anda: Contoh dalam topik ini menunjukkan konfigurasi umum. Sebelum mengonfigurasi Kafka connector, hubungi tim O&M Kafka Anda untuk mendapatkan pengaturan keamanan dan otentikasi yang benar.
-
Escaping: Berbeda dengan Apache Flink asli, editor SQL Realtime Compute for Apache Flink secara default melakukan escaping tanda kutip ganda ("). Oleh karena itu, Anda tidak perlu menambahkan backslash (\) untuk melakukan escaping tanda kutip ganda yang digunakan untuk username dan password dalam opsi
properties.sasl.jaas.config.
Offset awal tabel source
Mode startup
Anda dapat mengonfigurasi opsi scan.startup.mode untuk menentukan offset tempat tabel source Kafka mulai membaca data. Nilai yang valid meliputi:
-
earliest-offset: Mulai membaca dari offset paling awal.
-
latest-offset: Mulai membaca dari offset terbaru.
-
group-offsets: Mulai membaca dari offset yang telah dikomit untuk kelompok konsumen yang ditentukan dalam properties.group.id.
-
timestamp: Mulai membaca dari pesan pertama dengan timestamp lebih besar dari atau sama dengan nilai yang ditentukan dalam scan.startup.timestamp-millis.
-
specific-offsets: Mulai membaca dari offset partisi tertentu yang ditentukan dalam scan.startup.specific-offsets.
-
Jika Anda tidak menentukan mode startup, nilai default adalah 'group-offsets'.
-
Opsi scan.startup.mode hanya berlaku untuk pekerjaan tanpa status. Saat pekerjaan berstatus dimulai, pekerjaan tersebut selalu mengonsumsi dari offset yang disimpan dalam statenya.
Contoh:
CREATE TEMPORARY TABLE kafka_source (
...
) WITH (
'connector' = 'kafka',
...
-- Konsumsi dari offset paling awal.
'scan.startup.mode' = 'earliest-offset',
-- Konsumsi dari offset terbaru.
'scan.startup.mode' = 'latest-offset',
-- Konsumsi dari offset yang dikomit oleh kelompok konsumen "my-group".
'properties.group.id' = 'my-group',
'scan.startup.mode' = 'group-offsets',
'properties.auto.offset.reset' = 'earliest', -- Jika "my-group" digunakan untuk pertama kali, konsumsi dimulai dari offset paling awal.
'properties.auto.offset.reset' = 'latest', -- Jika "my-group" digunakan untuk pertama kali, konsumsi dimulai dari offset terbaru.
-- Konsumsi dari timestamp tertentu dalam milidetik: 1655395200000.
'scan.startup.mode' = 'timestamp',
'scan.startup.timestamp-millis' = '1655395200000',
-- Konsumsi dari offset tertentu.
'scan.startup.mode' = 'specific-offsets',
'scan.startup.specific-offsets' = 'partition:0,offset:42;partition:1,offset:300'
);
Prioritas offset awal
Offset awal tabel source ditentukan oleh aturan berikut, berdasarkan prioritas (dari tertinggi ke terendah):
|
Prioritas (tertinggi ke terendah) |
Offset yang disimpan dalam checkpoint atau savepoint. |
|
Waktu mulai yang dipilih di konsol Realtime Compute for Apache Flink saat pekerjaan dimulai. |
|
|
Offset awal yang ditentukan oleh scan.startup.mode di klausa WITH. |
|
|
Jika scan.startup.mode tidak ditentukan, group-offsets digunakan untuk memulai konsumsi dari offset kelompok konsumen yang sesuai. |
Jika offset yang ditentukan oleh langkah-langkah tersebut tidak valid, misalnya karena telah kedaluwarsa atau terjadi masalah di kluster Kafka, sistem akan mereset offset sesuai kebijakan yang ditentukan dalam properties.auto.offset.reset. Jika opsi ini tidak dikonfigurasi, sistem akan melemparkan exception yang memerlukan intervensi pengguna.
Skenario umum melibatkan memulai konsumsi dengan ID kelompok konsumen baru. Tabel source pertama-tama menanyakan kluster Kafka untuk offset yang dikomit oleh kelompok tersebut. Karena ID kelompok tersebut baru, tidak ditemukan offset yang valid. Akibatnya, sistem mereset offset sesuai kebijakan yang ditentukan dalam properties.auto.offset.reset. Oleh karena itu, saat mengonsumsi dengan ID kelompok baru, Anda harus mengonfigurasi opsi properties.auto.offset.reset.
Meng-commit offset source
Tabel source Kafka hanya meng-commit offset konsumennya ke kluster Kafka setelah checkpoint berhasil, sehingga interval checkpoint yang panjang menyebabkan offset yang dikomit tertinggal. Tabel source menyimpan progres baca aktualnya dalam state checkpoint, yang digunakan sistem untuk pemulihan kesalahan. Offset yang dikomit hanya berfungsi sebagai monitor progres dan tidak digunakan untuk pemulihan, sehingga kegagalan commit tidak memengaruhi akurasi data.
Partitioner sink kustom
Jika strategi partisi bawaan Kafka tidak memenuhi kebutuhan Anda, Anda dapat mengimplementasikan partitioner kustom dengan memperluas kelas FlinkKafkaPartitioner. Setelah pengembangan selesai, kompilasi kode Anda menjadi paket JAR dan unggah menggunakan fitur Artifacts di konsol Realtime Compute. Setelah paket JAR diunggah dan direferensikan, atur parameter sink.partitioner di klausa WITH ke nama kelas lengkap partitioner Anda, misalnya, org.mycompany.MyPartitioner.
Kafka, Upsert Kafka, dan katalog Kafka JSON
Kafka adalah platform streaming event append-only yang tidak mendukung pembaruan atau penghapusan data. Dalam SQL streaming, tabel sink Kafka standar tidak dapat menangani data Change Data Capture (CDC) hulu atau logika retraction dari operator seperti aggregate dan join. Jika Anda perlu menulis data yang berisi perubahan atau retraction, gunakan tabel sink Upsert Kafka.
Untuk menyederhanakan sinkronisasi batch data Change Data Capture (CDC) dari satu atau beberapa tabel database hulu ke Kafka, Anda dapat menggunakan katalog Kafka JSON. Jika data yang disimpan di Kafka dalam format JSON, katalog Kafka JSON memungkinkan Anda melewati langkah mendefinisikan skema dan parameter WITH. Untuk detailnya, lihat Kelola katalog Kafka JSON.
Contoh
Contoh 1: Baca dari dan tulis ke Kafka
Contoh ini membaca data dari topik Kafka source dan menulisnya ke topik sink. Datanya dalam format CSV.
CREATE TEMPORARY TABLE kafka_source (
id INT,
name STRING,
age INT
) WITH (
'connector' = 'kafka',
'topic' = 'source',
'properties.bootstrap.servers' = '<yourKafkaBrokers>',
'properties.group.id' = '<yourKafkaConsumerGroupId>',
'format' = 'csv'
);
CREATE TEMPORARY TABLE kafka_sink (
id INT,
name STRING,
age INT
) WITH (
'connector' = 'kafka',
'topic' = 'sink',
'properties.bootstrap.servers' = '<yourKafkaBrokers>',
'properties.group.id' = '<yourKafkaConsumerGroupId>',
'format' = 'csv'
);
INSERT INTO kafka_sink SELECT id, name, age FROM kafka_source;
Contoh 2: Sinkronisasi skema dan data tabel
Anda dapat menggunakan Kafka connector untuk menyinkronkan pesan dari topik Kafka ke Hologres secara real time. Untuk mencegah pesan duplikat di Hologres selama failover, Anda dapat menggunakan offset dan ID partisi pesan Kafka sebagai kunci primer komposit.
CREATE TEMPORARY TABLE kafkaTable (
`offset` INT NOT NULL METADATA,
`part` BIGINT NOT NULL METADATA FROM 'partition',
PRIMARY KEY (`part`, `offset`) NOT ENFORCED
) WITH (
'connector' = 'kafka',
'properties.bootstrap.servers' = '<yourKafkaBrokers>',
'topic' = 'kafka_evolution_demo',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json',
'json.infer-schema.flatten-nested-columns.enable' = 'true'
-- Opsional. Meratakan semua kolom bersarang.
);
CREATE TABLE IF NOT EXISTS hologres.kafka.`sync_kafka`
WITH (
'connector' = 'hologres'
) AS TABLE vvp.`default`.kafkaTable;
Contoh 3: Sinkronisasi kunci dan nilai Kafka
Jika kunci pesan Kafka berisi informasi yang relevan, Anda dapat menyinkronkan kunci dan nilainya.
CREATE TEMPORARY TABLE kafkaTable (
`key_id` INT NOT NULL,
`val_name` VARCHAR(200)
) WITH (
'connector' = 'kafka',
'properties.bootstrap.servers' = '<yourKafkaBrokers>',
'topic' = 'kafka_evolution_demo',
'scan.startup.mode' = 'earliest-offset',
'key.format' = 'json',
'value.format' = 'json',
'key.fields' = 'key_id',
'key.fields-prefix' = 'key_',
'value.fields-prefix' = 'val_',
'value.fields-include' = 'EXCEPT_KEY'
);
CREATE TABLE IF NOT EXISTS hologres.kafka.`sync_kafka`(
WITH (
'connector' = 'hologres'
) AS TABLE vvp.`default`.kafkaTable;
Kunci pesan Kafka tidak mendukung Schema Evolution atau parsing tipe otomatis. Anda harus mendeklarasikan skema secara manual.
Contoh 4: Sinkronisasi data dan lakukan komputasi
Saat menyinkronkan data dari Kafka ke Hologres, Anda mungkin memerlukan transformasi ringan.
CREATE TEMPORARY TABLE kafkaTable (
`distinct_id` INT NOT NULL,
`properties` STRING,
`timestamp` TIMESTAMP_LTZ METADATA,
`date` AS CAST(`timestamp` AS DATE)
) WITH (
'connector' = 'kafka',
'properties.bootstrap.servers' = '<yourKafkaBrokers>',
'topic' = 'kafka_evolution_demo',
'scan.startup.mode' = 'earliest-offset',
'key.format' = 'json',
'value.format' = 'json',
'key.fields' = 'key_id',
'key.fields-prefix' = 'key_'
);
CREATE TABLE IF NOT EXISTS hologres.kafka.`sync_kafka` WITH (
'connector' = 'hologres'
) AS TABLE vvp.`default`.kafkaTable
ADD COLUMN
`order_id` AS COALESCE(JSON_VALUE(`properties`, '$.order_id'), 'default');
--Gunakan COALESCE untuk menangani nilai null.
Contoh 5: Parsing JSON bersarang
Berikut adalah contoh pesan JSON:
{
"id": 101,
"name": "VVP",
"properties": {
"owner": "Alibaba Cloud",
"engine": "Flink"
}
}
Untuk menghindari penggunaan fungsi seperti JSON_VALUE(payload, '$.properties.owner') untuk mengurai bidang, Anda dapat langsung mendefinisikan struktur dalam DDL Source:
CREATE TEMPORARY TABLE kafka_source (
id VARCHAR,
`name` VARCHAR,
properties ROW<`owner` STRING, engine STRING>
) WITH (
'connector' = 'kafka',
'topic' = 'xxx',
'properties.bootstrap.servers' = 'xxx',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json'
);
Dengan pendekatan ini, Flink mengurai JSON menjadi bidang terstruktur selama fase baca. Query SQL selanjutnya dapat langsung mereferensikan properties.owner tanpa panggilan fungsi tambahan, yang meningkatkan kinerja keseluruhan.
API DataStream
Untuk membaca atau menulis data dengan API DataStream, gunakan DataStream Connector yang sesuai untuk menghubungkan ke Realtime Compute for Apache Flink. Untuk informasi lebih lanjut tentang cara menyiapkan DataStream Connector, lihat Integrasikan connector DataStream.
-
Buat source Kafka
Kafka Source menyediakan kelas pembangun untuk membuat Instans Kafka Source. Kode contoh berikut membangun Kafka Source yang mengonsumsi data dari Offset paling awal Topik
input-topic. Consumer Group-nya adalahmy-group, dan Value Message Kafka dideserialisasi sebagai string.Java
KafkaSource<String> source = KafkaSource.<String>builder() .setBootstrapServers(brokers) .setTopics("input-topic") .setGroupId("my-group") .setStartingOffsets(OffsetsInitializer.earliest()) .setValueOnlyDeserializer(new SimpleStringSchema()) .build(); env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");Untuk membangun Kafka Source, Anda harus menentukan properti berikut.
Parameter
Deskripsi
BootstrapServers
Daftar alamat broker Kafka. Atur properti ini dengan memanggil metode
setBootstrapServers(String).GroupId
ID Kelompok Konsumen. Atur properti ini dengan memanggil metode
setGroupId(String).Topik atau Partisi
Topik atau partisi untuk berlangganan. Kafka Source mendukung tiga metode berikut untuk berlangganan ke topik atau partisi:
-
Berlangganan ke semua partisi dari topik dalam daftar.
KafkaSource.builder().setTopics("topic-a","topic-b") -
Pola topik: Berlangganan ke semua partisi dari topik yang namanya cocok dengan ekspresi reguler yang ditentukan.
KafkaSource.builder().setTopicPattern("topic.*") -
Daftar partisi, di mana Anda dapat berlangganan ke partisi tertentu.
final HashSet<TopicPartition> partitionSet = new HashSet<>(Arrays.asList( new TopicPartition("topic-a", 0), // Partisi 0 dari topik "topic-a" new TopicPartition("topic-b", 5))); // Partisi 5 dari topik "topic-b" KafkaSource.builder().setPartitions(partitionSet)
Deserializer
Deserializer yang digunakan untuk mengurai pesan Kafka.
Tentukan deserializer menggunakan metode
setDeserializer(KafkaRecordDeserializationSchema).KafkaRecordDeserializationSchemamendefinisikan cara menguraiConsumerRecordKafka. Jika Anda hanya perlu mengurai Nilai Pesan Kafka, Anda dapat menggunakan salah satu metode berikut:-
Gunakan metode
setValueOnlyDeserializer(DeserializationSchema)dari kelas builder.DeserializationSchemamendefinisikan cara mengurai data biner Nilai Pesan Kafka. -
Gunakan kelas yang mengimplementasikan antarmuka Deserializer Kafka. Misalnya, Anda dapat menggunakan StringDeserializer untuk mengurai Nilai Pesan Kafka menjadi string.
import org.apache.kafka.common.serialization.StringDeserializer; KafkaSource.<String>builder() .setDeserializer(KafkaRecordDeserializationSchema.valueOnly(StringDeserializer.class));
CatatanUntuk mengurai
ConsumerRecordlengkap, Anda harus mengimplementasikan antarmukaKafkaRecordDeserializationSchema.POM
Kafka DataStream Connector tersedia di repositori pusat Maven.
<dependency> <groupId>com.alibaba.ververica</groupId> <artifactId>ververica-connector-kafka</artifactId> <version>${vvr-version}</version> </dependency>Saat menggunakan DataStream Connector Kafka, pertimbangkan properti berikut:
-
Offset awal
Kafka Source menentukan offset awal-nya menggunakan initializer offset (
OffsetsInitializer). Initializer bawaan meliputi:Offset initializer
Kode
Memulai konsumsi dari Offset paling awal.
KafkaSource.builder().setStartingOffsets(OffsetsInitializer.earliest())Memulai konsumsi dari Offset terbaru.
KafkaSource.builder().setStartingOffsets(OffsetsInitializer.latest())Memulai konsumsi data yang timestamp-nya lebih besar dari atau sama dengan waktu yang ditentukan. Unitnya adalah milidetik.
KafkaSource.builder().setStartingOffsets(OffsetsInitializer.timestamp(1592323200000L))Memulai konsumsi dari Offset yang dikomit oleh Kelompok Konsumen. Jika tidak ada Offset yang dikomit, menggunakan strategi reset yang ditentukan (misalnya, Offset paling awal).
KafkaSource.builder().setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.EARLIEST))Konsumsi dimulai dari offset yang dikomit oleh kelompok konsumen, dan tidak ada kebijakan reset offset yang ditentukan.
KafkaSource.builder().setStartingOffsets(OffsetsInitializer.committedOffsets())Catatan-
Jika initializer bawaan tidak memenuhi kebutuhan Anda, Anda dapat mengimplementasikan initializer offset kustom.
-
Jika Anda tidak menentukan initializer offset, nilai default adalah
OffsetsInitializer.earliest().
-
-
Mode streaming dan mode batch
Kafka Source mendukung mode streaming dan Batch Mode. Secara default, beroperasi dalam mode streaming, di mana Job berjalan tanpa batas hingga gagal atau dibatalkan. Untuk mengonfigurasi Kafka Source agar berjalan dalam Batch Mode, Anda dapat menggunakan
setBounded(OffsetsInitializer)untuk menentukan Offset berhenti. Kafka Source keluar ketika semua partisi mencapai offset berhenti yang ditentukan.CatatanKafka Source dalam mode streaming biasanya tidak memiliki Offset berhenti. Namun, untuk tujuan pengujian, Anda dapat menggunakan
setUnbounded(OffsetsInitializer)untuk menentukan Offset berhenti bahkan dalam mode streaming. Perhatikan perbedaan nama metode untuk menentukan Offset berhenti:setUnboundeduntuk mode streaming dansetBoundeduntuk Batch Mode. -
Penemuan partisi dinamis
Untuk menangani penskalaan Topik atau pembuatan topik baru tanpa me-restart Job Flink, Anda dapat mengaktifkan Penemuan partisi dinamis saat berlangganan ke topik berdasarkan pola. Fitur ini dinonaktifkan secara default dan harus diaktifkan secara eksplisit:
KafkaSource.builder() .setProperty("partition.discovery.interval.ms", "10000") // Temukan partisi baru setiap 10 detik.PentingFitur penemuan partisi dinamis bergantung pada mekanisme pembaruan metadata kluster Kafka. Jika kluster Kafka tidak memperbarui informasi partisi secara tepat waktu, partisi baru mungkin tidak ditemukan. Pastikan konfigurasi partition.discovery.interval.ms kluster Kafka sesuai dengan skenario aktual Anda.
-
Waktu event dan watermark
Secara default, Kafka Source menggunakan timestamp dari Pesan Kafka sebagai Event Time. Anda dapat mendefinisikan strategi Watermark kustom untuk mengekstrak Event Time dari isi Pesan dan mengirimkan Watermark ke hulu.
env.fromSource(kafkaSource, new CustomWatermarkStrategy(), "Kafka Source With Custom Watermark Strategy")Untuk mempelajari lebih lanjut tentang strategi Watermark kustom, lihat Generating Watermarks.
CatatanJika subtugas sumber menganggur—misalnya, ketika partisi Kafka tidak memiliki data baru atau paralelisme sumber lebih tinggi daripada jumlah partisi Kafka—Watermark untuk subtugas tersebut tidak akan maju, yang dapat memblokir komputasi jendela hilir.
Untuk mengatasi masalah ini, pertimbangkan solusi berikut:
-
Konfigurasikan timeout idle sumber: Aktifkan properti table.exec.source.idle-timeout untuk menandai sumber yang idle sebagai sementara idle, sehingga memungkinkan Watermark hilir maju.
-
Atur Paralelisme yang sesuai: Pastikan Paralelisme source tidak lebih besar daripada jumlah partisi Kafka.
-
-
Offset commit
Saat checkpoint diaktifkan, Kafka Source meng-commit Offset konsumen saat ini ke Kafka ketika Checkpoint selesai. Hal ini memastikan state Checkpoint Flink konsisten dengan Offset yang dikomit di broker Kafka. Jika checkpoint dinonaktifkan, Kafka Source mengandalkan mekanisme commit periodik otomatis internal konsumen Kafka. Fitur ini dikontrol oleh properti konsumen Kafka
enable.auto.commitdanauto.commit.interval.ms.CatatanKafka Source tidak mengandalkan offset yang dikomit untuk toleransi kesalahan dan pemulihan. Meng-commit offset hanya untuk memantau progres konsumen Kafka dan Kelompok Konsumen.
-
Properti lainnya
Selain properti yang disebutkan, Anda dapat menggunakan
setProperties(Properties)dansetProperty(String, String)untuk mengatur properti apa pun untuk Kafka Source dan konsumen Kafka yang mendasarinya. Kafka Source menyediakan properti spesifik berikut.Parameter
Deskripsi
client.id.prefix
Awalan ID klien untuk konsumen Kafka.
partition.discovery.interval.ms
Interval penemuan partisi dalam milidetik. Nilai
-1menonaktifkan penemuan partisi dinamis.CatatanDi Batch Mode, properti ini secara otomatis diatur ke
-1.register.consumer.metrics
Mendaftarkan metrik konsumen Kafka di Flink.
Konfigurasi Konsumen Kafka Lainnya
Untuk daftar lengkap konfigurasi konsumen Kafka, lihat dokumentasi resmi Apache Kafka.
PentingUntuk memastikan operasi yang benar, DataStream Connector Kafka menimpa properti yang dikonfigurasi secara manual berikut:
-
key.deserializerselalu ditimpa ke org.apache.kafka.common.serialization.ByteArrayDeserializer. -
value.deserializerselalu ditimpa ke org.apache.kafka.common.serialization.ByteArrayDeserializer. -
auto.offset.reset.strategyditimpa oleh strategi yang disediakan olehOffsetsInitializer.
Contoh berikut menunjukkan cara mengonfigurasi konsumen Kafka untuk menggunakan mekanisme SASL PLAIN dan menyediakan konfigurasi JAAS.
KafkaSource.builder() .setProperty("sasl.mechanism", "PLAIN") .setProperty("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"username\" password=\"password\";") -
-
Pemantauan
Kafka Source mengekspos metrik melalui sistem metrik Flink untuk pemantauan dan diagnostik.
-
Cakupan metrik
Semua metrik untuk pembaca source Kafka didaftarkan di bawah grup metrik
KafkaSourceReader, yang merupakan subgrup dari grup metrik operator. Metrik yang terkait dengan partisi topik tertentu didaftarkan di subgrupKafkaSourceReader.topic.<topic_name>.partition.<partition_id>.Misalnya, metrik Current Consumer Offset (
currentOffset) untuk Partisi 1 dari topik "my-topic" tersedia di .operator.KafkaSourceReader.topic.my-topic.partition.1.currentOffset. Jumlah commit yang berhasil (commitsSucceeded) tersedia di .operator.KafkaSourceReader.commitsSucceeded. -
Daftar metrik
Metrik
Deskripsi
Cakupan
currentOffset
Offset konsumen saat ini dari partisi.
TopicPartition
committedOffset
Offset terakhir yang dikomit untuk partisi.
TopicPartition
commitsSucceeded
Jumlah total commit offset yang berhasil.
KafkaSourceReader
commitsFailed
Jumlah commit yang gagal
KafkaSourceReader
-
Metrik konsumen Kafka
Metrik konsumen Kafka yang mendasari didaftarkan di grup metrik KafkaSourceReader.KafkaConsumer. Misalnya, metrik
records-consumed-totaldidaftarkan di .operator.KafkaSourceReader.KafkaConsumer.records-consumed-total.Anda dapat menggunakan properti
register.consumer.metricsuntuk menentukan apakah akan mendaftarkan metrik konsumen Kafka. Opsi ini diaktifkan secara default (true). Untuk informasi lebih lanjut tentang metrik konsumen Kafka, lihat dokumentasi Apache Kafka.
-
-
-
Buat sink Kafka
Kafka Sink Flink menulis aliran data ke satu atau beberapa topik Kafka.
DataStream<String> stream = ... Properties kafkaProperties = new Properties(); kafkaProperties.setProperty("bootstrap.servers", "localhost:9092"); KafkaSink<String> sink = KafkaSink.<String>builder() .setKafkaProducerConfig(kafkaProperties) .setRecordSerializer( KafkaRecordSerializationSchema.builder() .setTopic("my-topic") .setValueSerializationSchema(new SimpleStringSchema()) .build()) .setDeliveryGuarantee(DeliveryGuarantee.AT_LEAST_ONCE) .build(); stream.sinkTo(sink);Untuk membangun Kafka Sink, Anda harus mengonfigurasi properti berikut.
Parameter
Deskripsi
Properti klien Kafka
Properti
bootstrap.serverswajib diisi. Properti ini menentukan daftar broker Kafka yang dipisahkan koma.Serializer record
Anda harus menyediakan
KafkaRecordSerializationSchemauntuk mengonversi data input menjadiProducerRecordKafka. Flink menyediakan builder skema yang menawarkan komponen umum, seperti serialisasi untuk kunci dan nilai pesan, pemilihan topik, dan partisi pesan. Anda juga dapat mengimplementasikan antarmuka yang sesuai untuk kontrol lebih rinci. Metode ProducerRecord<byte[], byte[]> serialize(T element, KafkaSinkContext context, Long timestamp) dipanggil untuk setiap record masuk untuk menghasilkan ProducerRecord yang akan ditulis ke Kafka.ProducerRecordmemberikan kontrol rinci tentang cara setiap record ditulis ke Kafka, memungkinkan Anda untuk:-
Tetapkan Topic tujuan.
-
Atur Message Key.
-
Menentukan Partisi tujuan.
Jaminan pengiriman
Parameter
bootstrap.serverswajib diisi dan menentukan daftar broker Kafka yang dipisahkan koma.Jaminan pengiriman
Saat checkpoint Flink diaktifkan, Flink Kafka Sink dapat memberikan semantik tepat-sekali. Selain mengaktifkan checkpoint, Anda dapat menggunakan parameter DeliveryGuarantee untuk menentukan jaminan pengiriman yang berbeda. Parameter DeliveryGuarantee menyediakan opsi berikut:
-
DeliveryGuarantee.NONE: (Default) Flink tidak memberikan jaminan apa pun. Data mungkin hilang atau diduplikasi.
-
DeliveryGuarantee.AT_LEAST_ONCE: Menjamin tidak ada data yang hilang, tetapi duplikasi mungkin terjadi.
-
DeliveryGuarantee.EXACTLY_ONCE: Menggunakan transaksi Kafka untuk memberikan semantik tepat-sekali.
CatatanSaat menggunakan semantik EXACTLY_ONCE, lihat Pertimbangan untuk semantik tepat-sekali.
-
Flink CDC
Gunakan Kafka connector sebagai source atau sink untuk membuat pekerjaan YAML untuk Flink CDC.
Batasan
-
Gunakan Realtime Compute for Apache Flink (VVR) 11.1 atau lebih baru untuk mengonsumsi data Flink CDC dari sumber data Kafka.
-
Hanya JSON, Debezium JSON, dan Canal JSON yang didukung.
-
Hanya Realtime Compute for Apache Flink (VVR) 8.0.11 ke atas yang mendukung pembacaan data dari satu tabel yang didistribusikan di beberapa Partisi.
Sintaks
source:
type: kafka
name: Kafka source
properties.bootstrap.servers: localhost:9092
topic: ${kafka.topic}
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: localhost:9092
Parameter
-
Umum
Parameter
Deskripsi
Wajib
Jenis
Default
Keterangan
type
Jenis source atau sink.
Ya
String
–
Nilainya harus
kafka.name
Nama source atau sink.
Tidak
String
–
–
properties.bootstrap.servers
Alamat broker Kafka.
Ya
String
–
Formatnya adalah
host:port,host:port,host:port, dipisahkan koma (,).properties.*
Properti konfigurasi untuk klien Kafka.
Tidak
String
–
Kunci properti harus merupakan opsi yang valid sebagaimana didefinisikan dalam dokumentasi resmi Apache Kafka untuk Producer Configs dan Consumer Configs.
Realtime Compute for Apache Flink (VVR) menghapus awalan
properties.sebelum meneruskan pasangan kunci-nilai yang tersisa ke klien Kafka yang mendasari. Misalnya, atur'properties.allow.auto.create.topics' = 'false'untuk menonaktifkan pembuatan topik otomatis.key.format
Format serialisasi dan deserialisasi kunci pesan Kafka.
Tidak
String
–
-
Untuk source, hanya format
jsonyang didukung. -
Untuk sink, nilai yang valid adalah:
-
csv
-
json
-
CatatanOpsi ini hanya didukung di Realtime Compute for Apache Flink (VVR) 11.0.0 ke atas.
value.format
Format serialisasi dan deserialisasi nilai pesan Kafka.
Tidak
String
debezium-json
-
Untuk source, nilai yang valid adalah:
-
debezium-json
-
canal-json
-
json
-
-
Untuk sink, nilai yang valid adalah:
-
debezium-json
-
canal-json
-
canal-protobuf
-
Catatan-
Format
debezium-jsondancanal-jsonmemerlukan Realtime Compute for Apache Flink (VVR) versi 8.0.10 atau lebih baru. -
Format
jsonmemerlukan Realtime Compute for Apache Flink (VVR) versi 11.0.0 atau lebih baru.
-
-
Parameter source
Parameter
Deskripsi
Wajib
Tipe
Default
Keterangan
topic
Topik atau topik-topik yang akan dibaca.
Tidak
String
–
Untuk berlangganan ke beberapa topik, pisahkan nama-namanya dengan titik koma (;), misalnya,
topic-1;topic-2.CatatanTentukan salah satu parameter ini atau
topic-pattern, tetapi tidak keduanya.topic-pattern
Ekspresi reguler yang cocok dengan nama topik yang akan di-subscribe.
Tidak
String
–
Contoh:
-
user_event_.*: Cocok dengan semua topik yang diawali denganuser_event_. -
prod\.logs\..*: Cocok dengan topik yang diawali denganprod.logs.(karakter.harus di-escape).
CatatanTentukan salah satu parameter ini atau
topic, tetapi tidak keduanya.properties.group.id
ID kelompok konsumen.
Tidak
String
–
Saat menentukan ID kelompok konsumen baru, Anda harus mengatur parameter properties.auto.offset.reset ke
earliestataulatestuntuk menentukan offset awal.scan.startup.mode
Offset awal konsumen Kafka.
Tidak
String
group-offsets
Nilai yang valid:
-
earliest-offset: Mulai membaca dari offset paling awal yang tersedia.
-
latest-offset: Mulai membaca dari offset terbaru.
-
group-offsets (Nilai default): Mulai membaca dari offset yang dikomit untuk properties.group.id yang ditentukan.
-
timestamp: Mulai membaca dari timestamp yang ditentukan oleh scan.startup.timestamp-millis.
-
specific-offsets: Mulai membaca dari offset yang ditentukan oleh scan.startup.specific-offsets.
CatatanParameter ini hanya berlaku saat pekerjaan dimulai dengan startup tanpa status. Saat pekerjaan berstatus dimulai, pekerjaan tersebut selalu mengonsumsi dari offset yang disimpan dalam statenya.
scan.startup.specific-offsets
Offset awal per-partisi saat
scan.startup.modediatur kespecific-offsets.Tidak
String
–
Misalnya,
partition:0,offset:42;partition:1,offset:300scan.startup.timestamp-millis
Timestamp awal dalam milidetik saat
scan.startup.modediatur ketimestamp.Tidak
Long
–
Unitnya adalah milidetik.
scan.topic-partition-discovery.interval
Interval untuk menemukan partisi baru secara dinamis dalam topik.
Tidak
Duration
5 menit
Connector secara berkala menemukan dan membaca dari partisi baru. Saat menggunakan
topic-pattern, connector juga menemukan topik baru yang cocok dengan pola tersebut. Untuk menonaktifkan penemuan, atur nilai ini ke 0 atau kurang.scan.check.duplicated.group.id
Memeriksa apakah kelompok konsumen yang ditentukan oleh
properties.group.idmerupakan duplikat.Tidak
Boolean
false
Nilai yang valid:
-
true: Memeriksa duplikasi kelompok konsumen sebelum pekerjaan dimulai. Jika ditemukan duplikat, pekerjaan gagal.
-
false: Memulai pekerjaan tanpa memeriksa konflik.
schema.inference.strategy
Strategi parsing skema.
Tidak
String
continuous
Nilai yang valid:
-
continuous: Mengurai skema setiap record data. Jika skema tidak kompatibel, sistem menyimpulkan skema yang lebih luas dan menghasilkan event perubahan skema.
-
static: Melakukan parsing skema hanya sekali saat pekerjaan dimulai. Data kemudian diurai berdasarkan skema awal ini, dan tidak ada event perubahan skema yang dihasilkan.
Catatan-
Untuk informasi lebih lanjut tentang parsing skema, lihat Kebijakan untuk parsing dan evolusi skema.
-
Opsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 8.0.11 ke atas.
scan.max.pre.fetch.records
Pesan maksimum yang dikonsumsi per partisi untuk inferensi skema awal.
Tidak
Int
50
Sebelum pemrosesan data dimulai, sistem melakukan pre-fetch dan mengonsumsi jumlah pesan terbaru yang ditentukan dari setiap partisi untuk menginisialisasi skema.
key.fields-prefix
Awalan untuk nama bidang kunci pesan guna menghindari konflik nama.
Tidak
String
–
Misalnya, jika parameter ini diatur ke
key_, dan kunci pesan berisi bidang bernamaa, nama bidang yang diurai menjadikey_a.CatatanNilai
key.fields-prefixtidak boleh menjadi awalan dari nilaivalue.fields-prefix.value.fields-prefix
Awalan untuk nama bidang nilai pesan guna menghindari konflik nama.
Tidak
String
–
Misalnya, jika parameter ini diatur ke
value_, dan nilai pesan berisi bidang bernamab, nama bidang yang diurai menjadivalue_b.CatatanNilai
value.fields-prefixtidak boleh menjadi awalan dari nilaikey.fields-prefix.metadata.list
Kolom metadata yang diteruskan ke sink hilir.
Tidak
String
–
Kolom metadata yang tersedia meliputi
topic,partition,offset,timestamp,timestamp-type,headers, danleader-epoch. Pisahkan nama kolom dengan koma.scan.value.initial-schemas.ddls
Pernyataan DDL yang mendefinisikan skema awal untuk tabel tertentu.
Tidak
String
–
Gunakan titik koma (
;) untuk memisahkan beberapa pernyataan DDL. Misalnya, gunakanCREATE TABLE db1.t1 (id BIGINT, name VARCHAR(10)); CREATE TABLE db1.t2 (id BIGINT);untuk menentukan skema awal untuk tabel db1.t1 dan db1.t2, masing-masing.Skema tabel yang didefinisikan dalam DDL harus konsisten dengan tabel sink target dan mematuhi sintaks SQL Flink.
CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.5 ke atas.
ingestion.ignore-errors
Mengabaikan error parsing data.
Tidak
Boolean
false
CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.5 ke atas.
ingestion.error-tolerance.max-count
Jumlah maksimum error parsing yang dapat ditoleransi sebelum pekerjaan gagal. Hanya berlaku saat
ingestion.ignore-errorsdiatur ketrue.Tidak
Integer
-1
Parameter ini hanya berlaku saat
ingestion.ignore-errorsdiatur ketrue. Nilai -1 menunjukkan toleransi tak terbatas, artinya exception parsing tidak akan menyebabkan pekerjaan gagal.CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.5 ke atas.
scan.duplicate-field.strategy
Menentukan cara menangani nama bidang duplikat yang diurai dari bagian kunci dan nilai.
Tidak
String
EXCEPTION
Nilai yang valid:
-
EXCEPTION: Melemparkan exception saat bidang duplikat ada di kunci dan nilai. Ini adalah perilaku default di VVR 11.6 ke bawah.
-
PREFER_KEY: Menggunakan nilai dari bidang kunci saat bidang diduplikasi.
-
PREFER_VALUE: Menggunakan nilai dari bidang nilai saat bidang diduplikasi.
CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.7 ke atas.
-
Parameter format Debezium JSON
Parameter
Wajib
Tipe
Default
Deskripsi
debezium-json.distributed-tables
Tidak
Boolean
false
Atur ke
truejika data untuk satu tabel Debezium JSON didistribusikan di beberapa partisi.CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 8.0.11 ke atas.
PentingMemodifikasi parameter ini memerlukan startup tanpa status.
debezium-json.schema-include
Tidak
Boolean
false
Menyertakan skema dalam pesan Debezium JSON. Ini sesuai dengan properti
value.converter.schemas.enabledalam konfigurasi Debezium Kafka Connect.Nilai yang valid:
-
true: Pesan Debezium JSON berisi skema.
-
false: Pesan Debezium JSON tidak berisi skema.
debezium-json.ignore-parse-errors
Tidak
Boolean
false
Nilai yang valid:
-
true: Melewatkan baris yang menyebabkan exception parsing.
-
false: Melemparkan error dan pekerjaan gagal.
debezium-json.infer-schema.primitive-as-string
Tidak
Boolean
false
Mengurai semua tipe primitif sebagai
Stringsaat mengurai skema tabel.Nilai yang valid:
-
true: Mengurai semua tipe primitif sebagai
String. -
false: Mengurai tipe berdasarkan aturan default.
-
-
Parameter format Canal JSON
Parameter
Wajib
Jenis
Default
Deskripsi
canal-json.distributed-tables
Tidak
Boolean
false
Jika data untuk satu tabel dalam Canal JSON didistribusikan di beberapa partisi, Anda harus mengaktifkan opsi ini.
CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 8.0.11 ke atas.
PentingMemodifikasi parameter ini memerlukan startup tanpa status.
canal-json.database.include
Tidak
String
–
Ekspresi reguler opsional untuk memfilter changelog berdasarkan bidang metadata
databasedalam record Canal. Hanya record dari database yang cocok yang diproses. Ekspresi reguler kompatibel dengan kelas Pattern Java.canal-json.table.include
Tidak
String
–
Ekspresi reguler opsional untuk memfilter changelog berdasarkan bidang metadata
tabledalam record Canal. Hanya record dari tabel yang cocok yang diproses. Ekspresi reguler kompatibel dengan kelas Pattern Java.canal-json.ignore-parse-errors
Tidak
Boolean
false
Nilai yang valid:
-
true: Melewatkan baris saat ini jika terjadi exception parsing.
-
false: Melemparkan error dan pekerjaan gagal dimulai.
canal-json.infer-schema.primitive-as-string
Tidak
Boolean
false
Mengurai semua tipe primitif sebagai
Stringsaat mengurai skema tabel.Nilai yang valid:
-
true: Mengurai semua tipe primitif sebagai
String. -
false: Mengurai tipe berdasarkan aturan default.
canal-json.infer-schema.strategy
Tidak
String
AUTO
Strategi parsing skema tabel.
Nilai yang valid:
-
AUTO: Secara otomatis mengurai skema dari data JSON. Direkomendasikan jika data tidak berisi bidang
sqlType, untuk mencegah kegagalan parsing. -
SQL_TYPE: Mengurai skema dari array
sqlTypedalam data Canal JSON. Kami merekomendasikan mengatur ini ke SQL_TYPE untuk mendapatkan tipe yang lebih akurat jika data berisi bidangsqlType. -
MYSQL_TYPE: Mengurai skema dari array
mysqlTypedalam data Canal JSON.
Untuk informasi lebih lanjut tentang aturan pemetaan tipe
sqlType, lihat Parsing Skema Canal JSON.Catatan-
Konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.1 ke atas.
-
Nilai
MYSQL_TYPEdidukung di Ververica Runtime (VVR) 11.3 ke atas.
canal-json.mysql.treat-mysql-timestamp-as-datetime-enabled
Tidak
Boolean
true
Memetakan tipe MySQL
TIMESTAMPke tipe CDCTIMESTAMP.-
true: Tipe MySQL
TIMESTAMPdipetakan ke tipe CDCTIMESTAMP. -
false: Tipe MySQL
TIMESTAMPdipetakan ke tipe CDCTIMESTAMP_LTZ.
canal-json.mysql.treat-tinyint1-as-boolean.enabled
Tidak
Boolean
true
Saat menggunakan strategi parsing
MYSQL_TYPE, mengontrol apakah memetakan tipe MySQLTINYINT(1)ke tipe CDCBOOLEAN.-
true: Tipe MySQL
TINYINT(1)dipetakan ke tipe CDCBOOLEAN. -
false: Tipe MySQL
TINYINT(1)dipetakan ke tipe CDCTINYINT(1).
Opsi ini hanya berlaku saat
canal-json.infer-schema.strategydiatur keMYSQL_TYPE. -
-
Parameter format JSON
Parameter
Wajib
Tipe
Default
Deskripsi
json.timestamp-format.standard
Tidak
String
SQL
Format timestamp untuk data input dan output.
-
SQL: Mengurai timestamp input dalam format
yyyy-MM-dd HH:mm:ss.s{precision}, seperti2020-12-30 12:13:14.123. -
ISO-8601: Mengurai timestamp input dalam format
yyyy-MM-ddTHH:mm:ss.s{precision}, seperti2020-12-30T12:13:14.123.
json.ignore-parse-errors
Tidak
Boolean
false
Nilai yang valid:
-
true: Melewatkan baris saat ini jika terjadi exception parsing.
-
false: Melemparkan error dan pekerjaan gagal dimulai.
json.infer-schema.primitive-as-string
Tidak
Boolean
false
Mengurai semua tipe primitif sebagai
Stringsaat mengurai skema tabel.Nilai yang valid:
-
true: Mengurai semua tipe primitif sebagai
String. -
false: Mengurai tipe berdasarkan aturan default.
json.infer-schema.flatten-nested-columns.enable
Tidak
Boolean
false
Secara rekursif memperluas kolom bersarang dalam data JSON. Nilai yang valid:
-
true: Secara rekursif memperluas kolom bersarang.
-
false: Memperlakukan kolom bersarang sebagai
String.
json.decode.parser-table-id.fields
Tidak
String
–
Menggunakan nilai bidang JSON tertentu untuk menghasilkan tableId saat mengurai data dalam format JSON. Nilai beberapa bidang digabungkan dengan koma Inggris
,. Misalnya, jika data JSON adalah{"col0":"a", "col1","b", "col2","c"}, hasil yang dihasilkan adalah sebagai berikut:Konfigurasi
tableId
col0
a
col0,col1
a.b
col0,col1,col2
a.b.c
json.infer-schema.fixed-types
Tidak
String
–
Saat mengurai data JSON, Anda dapat menentukan tipe data untuk bidang tertentu. Gunakan koma
,untuk memisahkan beberapa bidang. Misalnya,id BIGINT, name VARCHAR(10)menentukan bahwa bidangidbertipe BIGINT dan bidangnamebertipe VARCHAR(10).Catatan-
Opsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.5 ke atas.
-
Saat menggunakan konfigurasi ini dengan Ververica Runtime (VVR) versi 11.5, Anda juga harus menambahkan konfigurasi
scan.max.pre.fetch.records: 0.
json.decode.empty-value-as-delete.enabled
Tidak
Boolean
false
Menentukan apakah mengurai pesan tombstone (dengan nilai kosong) dalam topik Kafka yang dikompaksi sebagai event DELETE. Digunakan untuk skenario di mana nilai kosong merepresentasikan semantik penghapusan, seperti pencerminkan topik dikompaksi atau sinyal penghapusan CDC.
CatatanOpsi konfigurasi ini hanya didukung di Ververica Runtime (VVR) 11.7 ke atas.
-
-
-
Parameter tabel sink
Parameter
Deskripsi
Wajib
Tipe
Default
Keterangan
type
Jenis sink.
Ya
String
–
Nilainya harus
kafka.name
Nama sink.
Tidak
String
–
–
topic
Nama topik Kafka.
Tidak
String
–
Jika parameter ini ditentukan, semua data ditulis ke topik ini.
CatatanJika tidak ditentukan, setiap record ditulis ke topik yang dinamai sesuai TableID-nya. TableID dibentuk dengan menggabungkan nama database dan tabel menggunakan titik (
.), contohnya:databaseName.tableName.partition.strategy
Strategi penulisan partisi Kafka.
Tidak
String
all-to-zero
Nilai yang valid:
-
all-to-zero(default): Menulis semua data ke Partisi 0. -
hash-by-key: Menulis data ke partisi berdasarkan nilai hash kunci primer. Pendekatan ini memastikan bahwa record dengan kunci primer yang sama ditulis ke partisi yang sama, sehingga urutan record tetap terjaga.
sink.tableId-to-topic.mapping
Pemetaan nama tabel hulu ke nama topik Kafka hilir.
Tidak
String
–
Pisahkan setiap pemetaan dengan titik koma (
;). Dalam satu pemetaan, pisahkan nama tabel hulu dan nama topik Kafka hulu dengan tanda titik dua (:). Nama tabel dapat menggunakan ekspresi reguler. Untuk memetakan beberapa tabel ke satu topik yang sama, pisahkan nama tabel dengan koma (,). Contoh:mydb.mytable1:topic1;mydb.mytable2:topic2.CatatanParameter ini memungkinkan Anda mengubah topik tujuan sambil tetap mempertahankan informasi nama tabel asli.
-
Parameter format Debezium JSON
Parameter
Wajib
Type
Default
Deskripsi
debezium-json.include-schema.enabled
Tidak
Boolean
false
Menyertakan informasi skema dalam data Debezium JSON.
debezium-json.emit.full-table-id.enabled
Tidak
Boolean
false
Menulis ID tabel tiga bagian lengkap ke bidang metadata Debezium JSON.
Jika parameter ini diaktifkan, pemetaannya adalah sebagai berikut:
Bagian ID Tabel CDC
Debezium JSON Key
Namespace
dbSkema
schemaTabel
tableJika parameter ini dinonaktifkan, pemetaannya adalah sebagai berikut:
Bagian ID Tabel CDC
Debezium JSON Key
Namespace
Tidak dipetakan
Skema
dbTabel
tableCatatanParameter ini hanya didukung di Ververica Runtime (VVR) 11.6 ke atas.
-
Contoh
-
Gunakan Kafka sebagai source Flink CDC:
source: type: kafka name: Kafka source properties.bootstrap.servers: ${kafka.bootstraps.server} topic: ${kafka.topic} value.format: ${value.format} scan.startup.mode: ${scan.startup.mode} sink: type: hologres name: Hologres sink endpoint: <yourEndpoint> dbname: <yourDbname> username: ${secret_values.ak_id} password: ${secret_values.ak_secret} sink.type-normalize-strategy: BROADEN -
Gunakan Kafka sebagai sink Flink CDC:
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 sink: type: kafka name: Kafka Sink properties.bootstrap.servers: ${kafka.bootstraps.server} route: - source-table: ${mysql.source.table} sink-table: ${kafka.topic}Modul
routemenentukan Topik Kafka tujuan untuk Tabel Source.
Secara default, fitur pembuatan topik otomatis dinonaktifkan untuk ApsaraMQ for Kafka. Untuk informasi lebih lanjut, lihat FAQ tentang pembuatan topik otomatis. Anda harus membuat topik sebelum menulis data ke ApsaraMQ for Kafka. Untuk informasi lebih lanjut, lihat Langkah 3: Buat sumber daya.
Kebijakan untuk parsing dan evolusi skema
Kafka connector memelihara skema semua tabel yang saat ini diketahui.
Inisialisasi skema tabel
Skema tabel mencakup kolom dan tipe data, nama database dan tabel, serta kunci primer. Bagian berikut menjelaskan cara menginisialisasi masing-masing komponen ini.
-
Informasi kolom dan tipe data
Pekerjaan Flink CDC dapat secara otomatis menyimpulkan kolom dan tipe data dari data, tetapi Anda mungkin ingin mendefinisikannya secara eksplisit untuk tabel tertentu. Ada tiga strategi inisialisasi skema, tergantung pada seberapa banyak kontrol yang Anda butuhkan atas tipe-tipe tersebut:
-
Inferensi skema otomatis penuh
Sebelum membaca data dari Kafka, Kafka connector mencoba mengonsumsi hingga scan.max.pre.fetch.records pesan dari setiap partisi, mengurai skema setiap pesan, dan menggabungkan skema-skema ini untuk menginisialisasi skema tabel. Event pembuatan tabel kemudian dihasilkan berdasarkan skema yang diinisialisasi ini sebelum data benar-benar dikonsumsi.
Untuk format Debezium JSON dan Canal JSON, informasi tabel terdapat dalam setiap pesan. Pesan yang di-pre-fetch berdasarkan parameter scan.max.pre.fetch.records mungkin berisi data dari beberapa tabel. Oleh karena itu, jumlah record yang di-pre-fetch untuk satu tabel tertentu tidak dapat ditentukan. Pre-fetch dan inisialisasi skema hanya dilakukan sekali untuk setiap partisi sebelum pesannya dikonsumsi dan diproses. Jika data untuk tabel baru muncul kemudian, skema yang diurai dari record pertama tabel tersebut digunakan sebagai skema awalnya, dan skema tersebut tidak di-pre-fetch atau diinisialisasi ulang.
Distribusi data dari satu tabel di beberapa partisi hanya didukung di Ververica Runtime (VVR) 8.0.11 ke atas, dan mengharuskan Anda mengatur opsi konfigurasi debezium-json.distributed-tables atau canal-json.distributed-tables ke true.
-
Menentukan skema tabel awal
Dalam beberapa kasus, Anda mungkin perlu menentukan skema tabel awal secara eksplisit—misalnya, saat menulis data dari Kafka ke tabel downstream yang sudah ada. Untuk melakukannya, tambahkan parameter scan.value.initial-schemas.ddls. Berikut contoh konfigurasinya:
source:
type: kafka
name: Kafka Source
properties.bootstrap.servers: host:9092
topic: test-topic
value.format: json
scan.startup.mode: earliest-offset
# Set the initial table schema
scan.value.initial-schemas.ddls: CREATE TABLE db1.t1 (id BIGINT, name VARCHAR(10)); CREATE TABLE db1.t2 (id BIGINT);
Pernyataan DDL harus sesuai dengan skema tabel target. Konfigurasi ini menentukan tipe awal kolom id sebagai BIGINT dan kolom name sebagai VARCHAR(10) untuk tabel db1.t1, dan tipe awal kolom id sebagai BIGINT untuk tabel db1.t2.
Pernyataan DDL menggunakan sintaks SQL Flink.
-
Menetapkan tipe tetap untuk bidang tertentu
Anda mungkin ingin mengunci bidang tertentu ke tipe data tetap. Misalnya, bidang yang biasanya disimpulkan sebagai TIMESTAMP mungkin perlu dikeluarkan sebagai string. Dalam hal ini, Anda dapat menambahkan parameter json.infer-schema.fixed-types untuk menentukan skema tabel awal. Parameter ini hanya berlaku saat format pesan adalah JSON. Berikut adalah contoh konfigurasi:
source:
type: kafka
name: Kafka Source
properties.bootstrap.servers: host:9092
topic: test-topic
value.format: json
scan.startup.mode: earliest-offset
# Set specific fields to a fixed type
json.infer-schema.fixed-types: id BIGINT, name VARCHAR(10)
scan.max.pre.fetch.records: 0
Konfigurasi ini menentukan bahwa semua bidang id bertipe BIGINT dan semua bidang name bertipe VARCHAR(10).
Tipe data konsisten dengan tipe SQL Flink.
-
Informasi database dan tabel
-
Untuk format Canal JSON dan Debezium JSON, connector mengurai informasi tabel, termasuk nama database dan tabel, dari setiap pesan.
-
Secara default, dalam format JSON, informasi tabel hanya mencakup nama tabel—yaitu nama topik yang berisi data tersebut. Jika data Anda mencakup informasi database dan tabel, Anda dapat menggunakan parameter json.infer-schema.fixed-types untuk menentukan bidang-bidang yang berisi informasi tersebut. Bidang-bidang ini kemudian dipetakan ke nama database dan tabel. Berikut adalah contoh konfigurasinya:
source: type: kafka name: Kafka Source properties.bootstrap.servers: host:9092 topic: test-topic value.format: json scan.startup.mode: earliest-offset # Gunakan nilai bidang col1 sebagai nama database dan nilai bidang col2 sebagai nama tabel json.decode.parser-table-id.fields: col1,col2Dengan konfigurasi ini, connector mengirimkan setiap record ke tabel di mana nama databasenya adalah nilai bidang
col1dan nama tabelnya adalah nilai bidangcol2.
-
-
Informasi kunci primer
-
Untuk format Canal JSON, bidang
pkNamesdalam data JSON mendefinisikan kunci primer tabel. -
Untuk format Debezium JSON dan JSON, data tidak berisi informasi kunci primer. Anda dapat menambahkan kunci primer ke tabel secara manual dengan menggunakan aturan
transform:transform: - source-table: \.*.\.* projection: \* primary-keys: key1, key2
-
Parsing skema dan evolusi skema
Setelah skema tabel diinisialisasi, jika schema.inference.strategy diatur ke static, Kafka connector mengurai nilai pesan setiap pesan berdasarkan skema tabel awal dan tidak menghasilkan event perubahan skema. Jika schema.inference.strategy diatur ke continuous, Kafka connector mengurai nilai pesan setiap pesan Kafka, mengidentifikasi kolom fisiknya, dan membandingkan skema yang dihasilkan dengan skema yang saat ini dipelihara. Jika skema tidak konsisten, connector mencoba menggabungkannya dan menghasilkan event perubahan skema tabel yang sesuai. Aturan penggabungan adalah sebagai berikut:
-
Jika kolom fisik yang diurai berisi bidang yang tidak ada dalam skema saat ini, bidang tersebut ditambahkan ke skema, dan event dihasilkan untuk menambahkannya sebagai kolom nullable.
-
Jika kolom fisik yang diurai tidak berisi bidang yang ada dalam skema saat ini, bidang tersebut dipertahankan dan nilainya diisi dengan
NULL. Tidak ada event penghapusan kolom yang dihasilkan. -
Bidang dengan nama yang sama ditangani sebagai berikut:
-
Jika kolom memiliki tipe data yang sama tetapi presisi berbeda, tipe dengan presisi lebih besar digunakan, dan event perubahan tipe kolom dihasilkan.
-
Jika kolom memiliki tipe data berbeda, sistem menemukan tipe induk umum terkecil dalam pohon hierarki tipe di bawah ini. Sistem kemudian menggunakan tipe induk umum ini untuk kolom dan menghasilkan event perubahan tipe kolom.

-
-
Kebijakan evolusi skema yang didukung:
-
Menambahkan kolom: Connector menambahkan kolom baru ke akhir skema dan menyinkronkan datanya. Kolom baru diatur sebagai nullable.
-
Menghapus kolom: Event penghapusan kolom tidak dihasilkan. Sebagai gantinya, data selanjutnya untuk kolom tersebut diisi dengan
NULL. -
Mengganti nama kolom: Connector memperlakukannya sebagai penghapusan kolom lama dan penambahan kolom baru. Kolom baru ditambahkan ke akhir skema, dan nilai untuk kolom asli diisi dengan
NULL. -
Mengubah tipe kolom:
-
Untuk sink downstream yang mendukung perubahan tipe kolom, pekerjaan Flink CDC dapat menangani perubahan tipe (misalnya, dari
INTkeBIGINT) selama sink downstream dikonfigurasi untuk memprosesnya. Kemampuan ini bergantung pada aturan perubahan tipe kolom yang didukung oleh sink tersebut. Lihat dokumentasi sink Anda untuk informasi mengenai aturan yang didukung. -
Untuk sink downstream yang tidak mendukung perubahan tipe kolom, seperti Hologres, Anda dapat menggunakan Type broadening. Fitur ini membuat tabel dengan tipe data yang lebih luas di sink downstream saat pekerjaan dimulai. Sistem dapat mentoleransi perubahan tipe kolom selama tipe baru tetap sesuai dengan tipe yang lebih luas yang telah ditetapkan di sink downstream.
-
-
-
Perubahan skema yang tidak didukung:
-
Perubahan pada constraint, seperti kunci primer atau indeks.
-
Mengubah kolom dari
NOT NULLkeNULLABLE.
-
-
Penguraian skema JSON Canal
Data Canal JSON mungkin berisi bidang opsional
sqlType, yang mencatat informasi tipe yang tepat untuk kolom data. Untuk mendapatkan skema yang lebih akurat, Anda dapat mengatur canal-json.infer-schema.strategy keSQL_TYPEuntuk menggunakan tipe dari bidangsqlType. Pemetaan tipe adalah sebagai berikut:JDBC type
Type code
CDC type
BIT
-7
BOOLEAN
BOOLEAN
16
TINYINT
-6
TINYINT
SMALLINT
5
SMALLINT
INTEGER
4
INT
BIGINT
-5
BIGINT
DECIMAL
3
DECIMAL(38,18)
NUMERIC
2
REAL
7
FLOAT
FLOAT
6
DOUBLE
8
DOUBLE
BINARY
-2
BYTES
VARBINARY
-3
LONGVARBINARY
-4
BLOB
2004
DATE
91
DATE
TIME
92
TIME
TIMESTAMP
93
TIMESTAMP
CHAR
1
STRING
VARCHAR
12
LONGVARCHAR
-1
Other data types
Toleransi dan pengumpulan data kotor
Sumber data Kafka Anda mungkin berisi record yang rusak, yang biasa disebut data kotor. Untuk mencegah pekerjaan Anda gagal dan restart berulang kali, Anda dapat mengonfigurasinya untuk melewatkan record yang tidak valid ini. Misalnya:
source:
type: kafka
name: Kafka Source
properties.bootstrap.servers: host:9092
topic: test-topic
value.format: json
scan.startup.mode: earliest-offset
# Aktifkan Toleransi Data Kotor
ingestion.ignore-errors: true
# Toleransi hingga 1000 record data kotor
ingestion.error-tolerance.max-count: 1000
Dengan konfigurasi ini, pekerjaan terus berjalan selama menemui tidak lebih dari 1.000 record kotor. Setelah jumlah tersebut melebihi ambang batas, pekerjaan gagal sehingga Anda dapat menyelidiki data Anda.
Untuk memastikan pekerjaan Anda tidak pernah gagal karena data kotor, gunakan konfigurasi berikut:
source:
type: kafka
name: Kafka Source
properties.bootstrap.servers: host:9092
topic: test-topic
value.format: json
scan.startup.mode: earliest-offset
# Aktifkan Toleransi Data Kotor
ingestion.ignore-errors: true
# Toleransi semua record data kotor
ingestion.error-tolerance.max-count: -1
Meskipun toleransi data kotor menjaga pekerjaan Anda tetap berjalan, Anda mungkin juga ingin memeriksa record yang bermasalah. Anda mungkin juga ingin menganalisis data kotor untuk meningkatkan produsen Kafka Anda. Seperti dijelaskan dalam Pengumpulan Data Kotor, Anda dapat melihat data kotor pekerjaan di log TaskManager. Misalnya:
source:
type: kafka
name: Kafka Source
properties.bootstrap.servers: host:9092
topic: test-topic
value.format: json
scan.startup.mode: earliest-offset
# Aktifkan Toleransi Data Kotor
ingestion.ignore-errors: true
# Toleransi semua record data kotor
ingestion.error-tolerance.max-count: -1
pipeline:
dirty-data.collector:
# Tulis data kotor ke file log TaskManager
type: logger
Pemetaan nama tabel dan topik
Saat Kafka berfungsi sebagai sink Flink CDC, format pesan (seperti Debezium JSON atau Canal JSON) menyematkan nama tabel asli. Konsumen hilir umumnya menggunakan nama yang disematkan tersebut sebagai pengenal tabel alih-alih nama topik, sehingga penting untuk mengonfigurasi pemetaan antara nama tabel dan topik secara tepat.
Anggaplah Anda perlu menyinkronkan dua tabel dari database MySQL: mydb.mytable1 dan mydb.mytable2. Strategi pemetaan berikut tersedia:
1. Tanpa strategi pemetaan
Tanpa strategi pemetaan apa pun, data untuk setiap tabel ditulis ke topik yang dinamai dalam format <Nama Database>.<Nama Tabel>. Oleh karena itu, data dari mydb.mytable1 ditulis ke topik bernama mydb.mytable1, dan data dari mydb.mytable2 ditulis ke topik bernama mydb.mytable2. Berikut adalah contoh konfigurasi:
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: mydb.mytable1,mydb.mytable2
server-id: 8601-8604
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: ${kafka.bootstraps.server}
2. Pemetaan aturan rute (Tidak disarankan)
Anda mungkin ingin menulis data ke topik tertentu daripada menggunakan format default <Nama Database>.<Nama Tabel>. Untuk melakukan ini, Anda dapat mengonfigurasi aturan rute. Berikut adalah contoh konfigurasi:
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: mydb.mytable1,mydb.mytable2
server-id: 8601-8604
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: ${kafka.bootstraps.server}
route:
- source-table: mydb.mytable1,mydb.mytable2
sink-table: mytable
Dalam hal ini, semua data dari mydb.mytable1 dan mydb.mytable2 ditulis ke satu topik bernama mytable.
Namun, aturan rute yang mengubah topik tujuan juga mengubah nama tabel dalam pesan Kafka (dalam format Debezium JSON atau Canal JSON). Nama tabel dalam semua pesan Kafka menjadi mytable. Hal ini dapat menyebabkan perilaku tak terduga pada sistem yang mengonsumsi pesan dari topik ini.
3. Pemetaan dengan sink.tableId-to-topic.mapping (Direkomendasikan)
Untuk memetakan nama tabel ke topik sambil mempertahankan nama tabel sumber asli, gunakan parameter sink.tableId-to-topic.mapping. Berikut adalah contoh konfigurasi:
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: mydb.mytable1,mydb.mytable2
server-id: 8601-8604
sink.tableId-to-topic.mapping: mydb.mytable1,mydb.mytable2:mytable
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: ${kafka.bootstraps.server}
Atau, Anda dapat menggunakan konfigurasi berikut:
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: mydb.mytable1,mydb.mytable2
server-id: 8601-8604
sink.tableId-to-topic.mapping: mydb.mytable1:mytable;mydb.mytable2:mytable
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: ${kafka.bootstraps.server}
Dalam kasus ini, seluruh data dari mydb.mytable1 dan mydb.mytable2 ditulis ke topik mytable, sedangkan nama tabel dalam pesan Kafka (dalam format JSON Debezium atau JSON Canal) tetap dipertahankan sebagai mydb.mytable1 atau mydb.mytable2. Dengan demikian, sistem downstream tetap dapat mengidentifikasi tabel sumber asli dari setiap catatan.
Semantik tepat-sekali
-
Konfigurasikan tingkat isolasi konsumen
Semua aplikasi yang mengonsumsi data Kafka harus mengatur properti
isolation.level:-
read_committed: Hanya membaca data yang telah dikomit. -
read_uncommitted(Default): Dapat membaca data yang belum dikomit.
EXACTLY_ONCE bergantung pada
read_committed. Jika tidak, konsumen mungkin melihat data yang belum dikomit, sehingga merusak konsistensi. -
-
Timeout transaksi dan kehilangan data
Saat memulihkan dari checkpoint, Realtime Compute for Apache Flink hanya mempertimbangkan transaksi yang telah dikomit sebelum checkpoint tersebut dimulai. Jika durasi antara kegagalan pekerjaan dan restart-nya melebihi timeout transaksi Kafka, Kafka secara otomatis membatalkan transaksi yang terbuka, yang dapat mengakibatkan kehilangan data.
-
transaction.max.timeout.msdefault untuk broker Kafka adalah 15 menit. -
Secara default, Flink Kafka Sink mengatur parameter
transaction.timeout.mske 1 jam. -
Anda harus menaikkan
transaction.max.timeout.mspada broker agar lebih besar dari atau sama dengan pengaturan di Flink.
-
-
Kolam produsen dan checkpoint konkuren
Mode
EXACTLY_ONCEmenggunakan kolam produsen Kafka berukuran tetap. Setiap checkpoint menggunakan satu produsen dari kolam ini. Jika jumlah checkpoint konkuren melebihi ukuran kolam, pekerjaan gagal.Konfigurasikan ukuran kolam produsen berdasarkan jumlah maksimum checkpoint konkuren.
-
Batasan penskalaan turun paralelisme
Jika pekerjaan gagal sebelum checkpoint pertama selesai, informasi kolam produsen asli hilang saat restart. Oleh karena itu, jangan menurunkan paralelisme pekerjaan sebelum checkpoint pertama selesai. Jika penskalaan turun diperlukan, paralelisme baru tidak boleh kurang dari
FlinkKafkaProducer.SAFE_SCALE_DOWN_FACTOR. -
Transaksi memblokir pembacaan
Dalam mode
read_committed, transaksi apa pun yang belum dikomit atau dibatalkan akan memblokir operasi baca pada seluruh topik.Misalnya:
-
Transaksi 1 menulis data.
-
Transaksi 2 menulis lebih banyak data dan dikomit.
-
Selama Transaksi 1 tetap terbuka, data dari Transaksi 2 yang telah dikomit tidak terlihat oleh konsumen.
Hal ini memiliki implikasi berikut:
-
Selama operasi normal, latensi visibilitas data kira-kira sama dengan interval checkpoint.
-
Jika pekerjaan gagal, topik apa pun yang sedang ditulisnya akan diblokir untuk konsumen hingga pekerjaan tersebut dijalankan ulang atau transaksi timeout. Dalam kasus ekstrem, proses timeout transaksi itu sendiri juga dapat memengaruhi operasi baca.
-