Tüm Ürünler
Search
Belge Merkezi

Realtime Compute for Apache Flink:Upsert Kafka

Son Güncelleme:Oct 04, 2026

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:

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ır

  • Anahtarı mevcut olmayan bir kayıt INSERT (+I) olarak yorumlanır

  • Null 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:

  • INSERT ve UPDATE_AFTER kayıtları normal Kafka mesajları olarak yazılır

  • DELETE kayı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-offset konumundan 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-offset gibi) 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

Sonraki adımlar