Upsert Kafka bağlayıcısı, upsert semantiğini kullanarak Kafka konularından veri okur ve bu konulara veri yazar. Kaynak olarak kullanıldığında Kafka kayıtlarını bir değişiklik günlüğü akışına dönüştürür. Hedef (sink) olarak kullanıldığında ise değişiklik günlüklerini Kafka'ya geri yazar ve silme işlemlerini null değerli (tombstone) mesajlarla temsil eder.
| Kategori | Ayrıntılar |
|---|---|
| Desteklenen türler | Kaynak tablo, hedef tablo ve veri alımı hedefi |
| Çalışma modu | Akış modu |
| Veri biçimleri | avro, avro-confluent, csv, json ve raw |
| API türleri | SQL ve veri alımı YAML işi |
| Hedef tabloda verileri güncelleme veya silme | Evet |
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bir Kafka kümesi. Bir DataFlow Kafka kümesi oluşturun veya ApsaraMQ for Kafka'da kaynaklar oluşturun
Flink kümeniz ile Kafka kümeniz arasında ağ bağlantısı. EMR üzerindeki Kafka için bir VPC ve güvenlik grubu yapılandırın. ApsaraMQ for Kafka için bir izin listesi yapılandırın
Nasıl çalışır?
Kaynak tarafından üretilen upsert değişiklik günlüğü akışı yalnızca +I (insert), +U (update after) ve -D (delete) girişlerini içerir. Geri çekme (retract) akışının aksine, hiçbir zaman -U (update before) mesajları içermez.
| Değişiklik günlüğü girişi türü | Tam adı | Semantik |
|---|---|---|
+I |
Ekleme | Anahtarı daha önce mevcut olmayan yeni bir kayıt |
+U |
Güncellemeden sonra | Anahtarı zaten mevcut olan bir kayıt — önceki değerin üzerine yazar |
-D |
Silme | Null değerli bir kayıt — ilgili anahtar için girişi siler |
Kaynak tablo olarak, bağlayıcı Kafka kayıtlarını okur ve bunları bir değişiklik günlüğü akışına dönüştürür:
Anahtarı zaten mevcut olan bir kayıt UPDATE (
+U) olarak yorumlanırAnahtarı mevcut olmayan bir kayıt INSERT (
+I) olarak yorumlanırNull değerli bir kayıt DELETE (
-D) olarak yorumlanır
Hedef tablo veya veri alımı hedefi olarak, bağlayıcı upstream değişiklik günlüğü akışını tüketir:
INSERTveUPDATE_AFTERkayıtları normal Kafka mesajları olarak yazılırDELETEkayıtları tombstone mesajları (ilgili anahtar için null değer) olarak yazılır
Flink, hedef çıkışını birincil anahtara göre bölmeye ayırır; böylece aynı anahtara ait tüm mesajlar doğru sırada aynı bölüme ulaşır.
Örnek
Aşağıdaki uçtan uca örnek, bir Kafka kaynak tablosundan web sitesi sayfa görüntüleme olaylarını okur, bölge başına sayfa görüntülemelerini (PV) ve benzersiz ziyaretçileri (UV) toplar ve sonuçları bir Upsert Kafka hedefine yazar.
Kaynak tablo — ham sayfa görüntüleme olaylarını okur:
CREATE TABLE pageviews (
user_id BIGINT,
page_id BIGINT,
viewtime TIMESTAMP,
user_region STRING,
WATERMARK FOR viewtime AS viewtime - INTERVAL '2' SECOND
) WITH (
'connector' = 'kafka',
'topic' = '<yourTopicName>',
'properties.bootstrap.servers' = '<host:port>',
'format' = 'json'
);
Hedef tablo — upsert semantiğiyle toplanmış sonuçları depolar:
CREATE TABLE pageviews_per_region (
user_region STRING,
pv BIGINT,
uv BIGINT,
PRIMARY KEY (user_region) NOT ENFORCED
) WITH (
'connector' = 'upsert-kafka',
'topic' = '<yourTopicName>',
'properties.bootstrap.servers' = '<host:port>',
'key.format' = 'avro',
'value.format' = 'avro'
);
Her Upsert Kafka tablosu bir birincil anahtar tanımlamalıdır. Birincil anahtar sütunları, Flink'in çıkışı nasıl böldüğünü ve bağlayıcının upsert işlemlerini nasıl tanımladığını belirler.
Sorgu — toplama yapar ve sonuçları yazar:
INSERT INTO pageviews_per_region
SELECT
user_region,
COUNT(*),
COUNT(DISTINCT user_id)
FROM pageviews
GROUP BY user_region;
SQL
Söz dizimi
CREATE TABLE upsert_kafka_sink (
user_region STRING,
pv BIGINT,
uv BIGINT,
PRIMARY KEY (user_region) NOT ENFORCED
) WITH (
'connector' = 'upsert-kafka',
'topic' = '<yourTopicName>',
'properties.bootstrap.servers' = '...',
'key.format' = 'avro',
'value.format' = 'avro'
);
WITH parametreleri
Genel parametreler
| Parametre | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|
connector |
Evet | — | upsert-kafka olarak ayarlayın. |
properties.bootstrap.servers |
Evet | — | host:port biçiminde virgülle ayrılmış Kafka aracı adresleri listesi. |
topic |
Evet | — | Okunacak veya yazılacak Kafka konusu. |
key.format |
Evet | — | Mesaj anahtarı için seri hale getirme biçimi. Geçerli değerler: csv, json, avro, debezium-json, canal-json, maxwell-json, avro-confluent, raw. |
value.format |
Evet | — | Mesaj değeri için seri hale getirme biçimi. format ile eşdeğerdir — yalnızca birini yapılandırın. |
value.fields-include |
Evet | ALL |
Mesaj değerine hangi sütunların dahil edileceğini kontrol eder. ALL tüm sütunları dahil eder; EXCEPT_KEY ise key.fields tarafından tanımlanan anahtar alanlarını hariç tutar. |
properties.* |
Hayır | — | Ek Kafka istemci parametreleri. Yapılandırma istemciye iletilmeden önce properties. ön eki kaldırılır. Son ek, geçerli bir Kafka üretici veya tüketici yapılandırma anahtarı olmalıdır. key.deserializer veya value.deserializer ayarlamak için bu mekanizmayı kullanmayın — bağlayıcı bunları dahili olarak yönetir. |
key.fields-prefix |
Hayır | — | Tablo şemasındaki tüm anahtar alanı adlarına uygulanan özel bir ön ek; değer alanlarıyla ad çakışmalarını önlemek için kullanılır. Anahtar ayrıştırılırken ve oluşturulurken bu ön ek kaldırılır. Ayarlanırsa, value.fields-include değeri EXCEPT_KEY olarak ayarlanmalıdır. |
Hedefe özgü parametreler
| Parametre | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|
sink.parallelism |
Hayır | Upstream operatörden devralınır | Kafka hedef operatörünün paralellik derecesi. |
sink.buffer-flush.max-rows |
Hayır | 0 (devre dışı) |
Temizlemeden önce arabelleğe alınacak maksimum kayıt sayısı. Aynı anahtar için birden fazla güncelleme geldiğinde, arabellekte yalnızca en son kayıt tutulur; bu durum yazma hacmini azaltır ve gereksiz tombstone mesajlarını önler. Arabelleğe almayı etkinleştirmek için hem sink.buffer-flush.max-rows hem de sink.buffer-flush.interval sıfırdan büyük olmalıdır. |
sink.buffer-flush.interval |
Hayır | 0 (devre dışı) |
Arabelleğin ne sıklıkla temizleneceği. Desteklenen birimler: ms, s, min, h — örneğin, '1 s'. sink.buffer-flush.max-rows ile aynı anahtar tekilleştirme davranışı geçerlidir. Arabelleğe almayı etkinleştirmek için her iki parametre de sıfırdan büyük olmalıdır. |
Veri alımı
Upsert Kafka bağlayıcısı, bir YAML veri alımı işinde hedef olarak kullanılabilir. Veriler JSON biçiminde yazılır ve birincil anahtar alanları mesaj gövdesine dahil edilir.
Söz dizimi
sink:
type: upsert-kafka
name: upsert-kafka Sink
properties.bootstrap.servers: localhost:9092
# ApsaraMQ for Kafka
aliyun.kafka.accessKeyId: ${secret_values.kafka-ak}
aliyun.kafka.accessKeySecret: ${secret_values.kafka-sk}
aliyun.kafka.instanceId: ${instancd-id}
aliyun.kafka.endpoint: ${endpoint}
aliyun.kafka.regionId: ${region-id}
Parametreler
| Parametre | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|
type |
Evet | — | upsert-kafka olarak ayarlayın. |
name |
Hayır | — | Hedef için bir görünen ad. |
properties.bootstrap.servers |
Evet | — | host:port biçiminde virgülle ayrılmış Kafka aracı adresleri listesi. |
properties.* |
Hayır | — | Ek Kafka üretici parametreleri. Yapılandırma istemciye iletilmeden önce properties. ön eki kaldırılır. Son ek, geçerli bir Kafka üretici yapılandırma anahtarı olmalıdır. |
sink.delivery-guarantee |
Hayır | at-least-once |
Teslimat semantiği. Geçerli değerler: none (garanti yok; veriler kaybolabilir veya çoğaltılabilir), at-least-once (varsayılan; veri kaybı yok ancak çoğaltma mümkündür), exactly-once (çoğaltmaları ortadan kaldırmak için Kafka işlemlerini kullanır). |
sink.add-tableId-to-header-enabled |
Hayır | false |
Etkinleştirildiğinde, namespace, schemaName ve tableName bilgilerini Kafka mesaj başlığına yazar. |
aliyun.kafka.accessKeyId |
Hayır | — | Alibaba Cloud hesabınız için AccessKey ID. ApsaraMQ for Kafka'ya yazarken gereklidir. Bkz. AccessKey çifti oluşturma. |
aliyun.kafka.accessKeySecret |
Hayır | — | Alibaba Cloud hesabınız için AccessKey secret. ApsaraMQ for Kafka'ya yazarken gereklidir. Bkz. AccessKey çifti oluşturma. |
aliyun.kafka.instanceId |
Hayır | — | ApsaraMQ for Kafka örneğinin Instance ID'si. Örneğin ayrıntılarını Alibaba Cloud Kafka konsolunda görüntüleyebilirsiniz. ApsaraMQ for Kafka'ya yazarken gereklidir. |
aliyun.kafka.endpoint |
Hayır | — | ApsaraMQ for Kafka için API uç noktası. ApsaraMQ for Kafka'ya yazarken gereklidir. Bkz. Uç noktalar. |
aliyun.kafka.regionId |
Hayır | — | ApsaraMQ for Kafka örneğinin Region ID'si. ApsaraMQ for Kafka'ya yazarken gereklidir. Bkz. Uç noktalar. |
Desteklenen tür değişiklikleri
Upsert Kafka veri alımı bağlayıcısı tüm değişiklik günlüğü işlem türlerini destekler. Yazılan verileri downstream'da tüketmek için sabit bir şema ile Flink Upsert Kafka SQL bağlayıcısını kullanın.
Veri alımı örneği
Aşağıdaki örnek, bir YAML veri alımı işi kullanarak bir MySQL tablosunu ApsaraMQ for Kafka'ya senkronize eder:
source:
type: mysql
name: MySQL Source
hostname: ${mysql.hostname}
port: ${mysql.port}
username: ${mysql.username}
password: ${mysql.password}
tables: ${mysql.source.table}
server-id: 8601-8604
sink:
type: upsert-kafka
name: Upsert Kafka Sink
properties.bootstrap.servers: ${upsert.kafka.bootstraps.server}
aliyun.kafka.accessKeyId: ${upsert.kafka.aliyun.ak}
aliyun.kafka.accessKeySecret: ${upsert.kafka.aliyun.sk}
aliyun.kafka.instanceId: ${upsert.kafka.aliyun.instanceid}
aliyun.kafka.endpoint: ${upsert.kafka.aliyun.endpoint}
aliyun.kafka.regionId: ${upsert.kafka.aliyun.regionid}
route:
- source-table: ${mysql.source.table}
sink-table: ${upsert.kafka.topic}
Teslimat semantiği
Varsayılan olarak, Upsert Kafka hedefi at-least-once garantisiyle yazar. Flink, aynı anahtara sahip çoğaltılmış kayıtları konuya yazabilir. Bağlayıcı upsert modunda çalıştığından, konu bir kaynak olarak tekrar okunduğunda herhangi bir anahtar için son kayıt geçerli olur. Bu nedenle çoğaltılmış yazmalar idempotenttir — nihai durumu bozmazlar.
Exactly-once semantiğini etkinleştirmek için Kafka kümesinin Kafka işlemlerini (Apache Kafka 0.11 veya sonraki sürümler) desteklemesi ve işlem özelliğinin etkinleştirilmiş olması gerekir. Veri alımı YAML yapılandırmasında sink.delivery-guarantee değerini exactly-once olarak ayarlayın.
Sınırlamalar
Ververica Runtime (VVR) 2.0.0 veya sonraki bir sürümde çalışan Flink gerektirir.
Hem okuma hem de yazma işlemleri için Apache Kafka 0.10 veya sonraki sürümleri destekler.
Yalnızca Apache Kafka 2.8 için belgelenen istemci parametrelerini destekler. Bkz. tüketici ve üretici yapılandırma referansları.
Upsert Kafka kaynak tabloları her zaman
earliest-offsetkonumundan başlar — bu sabittir ve yapılandırılamaz. Bağlayıcının eksiksiz bir değişiklik günlüğünü yeniden oluşturabilmesi için tüm geçmiş değişiklik verilerini okuması gerekir. Diğer herhangi bir başlatma modunun (latest-offsetgibi) veya zaman damgasına göre başlatmanın kullanılması, eksik bir değişiklik günlüğüyle sonuçlanır ve downstream hesaplamalarda veri doğruluğu sorunlarına neden olur.Exactly-once hedef semantiği için, hedef Kafka kümesinin işlemler etkinleştirilmiş Apache Kafka 0.11 veya sonraki bir sürümü çalıştırması gerekir.
İzleme ölçümleri
Kaynak tablo ölçümleri
| Ölçüm | Açıklama |
|---|---|
numRecordsIn |
Okunan toplam kayıt sayısı |
numRecordsInPerSecond |
Saniye başına okunan kayıt sayısı |
numBytesIn |
Okunan toplam bayt sayısı |
numBytesInPerSecond |
Saniye başına okunan bayt sayısı |
currentEmitEventTimeLag |
Olay zamanı ile yayım zamanı arasındaki gecikme |
currentFetchEventTimeLag |
Olay zamanı ile getirme zamanı arasındaki gecikme |
sourceIdleTime |
Kaynağın boşta kalma süresi |
pendingRecords |
İşlenmeyi bekleyen kayıt sayısı |
Hedef tablo ölçümleri
| Ölçüm | Açıklama |
|---|---|
numRecordsOut |
Yazılan toplam kayıt sayısı |
numRecordsOutPerSecond |
Saniye başına yazılan kayıt sayısı |
numBytesOut |
Yazılan toplam bayt sayısı |
numBytesOutPerSecond |
Saniye başına yazılan bayt sayısı |
currentSendTime |
En son partinin gönderilmesi için geçen süre |