Tüm Ürünler
Search
Belge Merkezi

Realtime Compute for Apache Flink:Kafka connector

Son Güncelleme:Oct 04, 2026

Realtime Compute for Apache Flink içinde kaynak veya hedef tablo olarak Kafka SQL bağlayıcısını kullanın.

Genel bakış

Apache Kafka, yüksek performanslı veri işleme, akış analitiği ve veri entegrasyonu için yaygın şekilde kullanılan açık kaynaklı, dağıtık bir olay akışı platformudur. Realtime Compute for Apache Flink için Kafka bağlayıcısı, açık kaynaklı Apache Kafka istemcisini kullanarak yüksek performanslı veri aktarımı sağlar, birden fazla veri formatının okunmasını ve yazılmasını destekler ve tam-olarak-bir-kere (exactly-once) semantiğini sunar.

Kategori

Açıklama

Desteklenen türler

SQL kaynak, hedef

Flink CDC kaynak, hedef

DataStream kaynak, hedef

Çalıştırma modu

Akış

Veri formatları

Desteklenen veri formatları

  • CSV

  • JSON

  • Apache Avro

  • Confluent Avro

  • Debezium JSON

  • Canal JSON

  • Maxwell JSON

  • Raw

  • Protobuf

Not
  • Yerleşik Protobuf Veri Formatı yalnızca Ververica Runtime (VVR) 8.0.9 ve sonraki sürümlerde desteklenir.

  • Her desteklenen veri formatının WITH yan tümcesinde belirtilebilecek ilgili parametreleri vardır. Daha fazla bilgi için bkz. Formats.

Ölçümler

Ölçümler

  • Kaynak Tablosu

    • numRecordsIn

    • numRecordsInPerSecond

    • numBytesIn

    • numBytesInPerSecond

    • currentEmitEventTimeLag

    • currentFetchEventTimeLag

    • sourceIdleTime

    • pendingRecords

  • Hedef Tablosu

    • numRecordsOut

    • numRecordsOutPerSecond

    • numBytesOut

    • numBytesOutPerSecond

    • currentSendTime

Not

Ölçümler hakkında daha fazla bilgi için bkz. Metrics.

API türleri

SQL, DataStream, Flink CDC

Hedef güncelleme/silme

Bağlayıcı yalnızca hedef tabloya veri eklemeyi (append) destekler. Güncellemeler ve silmeler desteklenmez.

Not

Hedef Tablodaki verileri nasıl güncelleyeceğiniz veya sileceğiniz hakkında daha fazla bilgi için bkz. Upsert Kafka.

Önkoşullar

Başlamadan önce Kafka küme türünüz için önkoşulları karşıladığınızı doğrulayın:

  • ApsaraMQ for Kafka kümesine bağlanma

    • Kafka kümesi 0,11 veya sonraki bir sürüm olmalıdır.

    • Bir ApsaraMQ for Kafka kümesi oluşturmuş olmanız gerekir. Daha fazla bilgi için bkz. Step 3: Create resources.

    • Flink çalışma alanı ile Kafka kümesi aynı Virtual Private Cloud (VPC) içinde bulunmalı ve Flink çalışma alanının CIDR bloğunu ApsaraMQ for Kafka izin listesine eklemiş olmalısınız. Daha fazla bilgi için bkz. Configure whitelists.

    Önemli

    ApsaraMQ for Kafka'ya veri yazmayla ilgili sınırlamalar:

    • ApsaraMQ for Kafka, yazma işlemleri için Zstandard (zstd) sıkıştırma formatını desteklemez.

    • ApsaraMQ for Kafka, idempotent veya transactional yazmaları desteklemez; bu durum Kafka hedef tablolarının sunduğu exactly-once semantiğini kullanmanızı engeller. Ververica Runtime (VVR) 8.0.0'dan itibaren Kafka bağlayıcısı, Kafka istemci 3.x'i kullanır ve properties.enable.idempotence özelliği varsayılan olarak true değerine sahiptir. Bu nedenle, Ververica Runtime (VVR) 8.0.0 veya sonraki sürümleri kullanarak ApsaraMQ for Kafka'ya yazarken yazma hatalarını önlemek amacıyla hedef tablo tanımınıza properties.enable.idempotence=false yapılandırmasını eklemeniz gerekir. ApsaraMQ for Kafka için depolama motorlarının ve özellik sınırlamalarının karşılaştırması için bkz. Comparison between storage engines.

  • Kendi yönettiğiniz Apache Kafka kümesine bağlanma

    • Kendi yönettiğiniz Apache Kafka kümesi 0,11 veya sonraki bir sürüm olmalıdır.

    • Flink çalışma alanının kendi yönettiğiniz Apache Kafka kümesine ağ bağlantısı olmalıdır. Genel internet üzerinden kümeye bağlanma ayrıntıları için bkz. FAQ about network connectivity.

    • Yalnızca Apache Kafka sürüm 2,8 için istemci yapılandırma seçenekleri desteklenir. Daha fazla bilgi için Apache Kafka Consumer Configs ve Producer Configs belgelerine bakın.

Notlar

Apache Flink ve Apache Kafka'daki bilinen tasarım sınırlamaları nedeniyle transactional yazmalar önerilmez. sink.delivery-guarantee = 'exactly-once' ayarlandığında Kafka bağlayıcısı transactional yazmaları etkinleştirir ve aşağıdaki bilinen sorunlar ortaya çıkar:

  • Her checkpoint yeni bir Transaction ID üretir. Checkpoint aralığı çok kısa olursa oluşan Transaction ID yoğunluğu Kafka küme koordinatörünün bellek yetersizliğine yol açarak küme kararlılığını tehlikeye atabilir.

  • Her transaction yeni bir Producer örneği oluşturur. Çok fazla transaction eşzamanlı olarak commit edilirse TaskManager bellek yetersizliğine girebilir ve Apache Flink işinin kararsız hale gelmesine neden olabilir.

  • Birden fazla Apache Flink işi aynı sink.transactional-id-prefix değerini kullanırsa üretilen Transaction ID'ler çakışabilir. Bir işteki yazma işlemi başarısız olduğunda bu durum bir Apache Kafka bölümünün Log Start Offset (LSO) değerinin ilerlemesini engelleyebilir. Bu da o bölümün tüm tüketicilerini etkiler.

Exactly-once semantiğine ihtiyacınız varsa idempotence sağlamak amacıyla verileri birincil anahtarlı bir tabloya yazmak için Upsert Kafka connector kullanın. Transactional yazmaları kullanmak zorundaysanız bkz. Exactly-once semantics usage notes.

Ağ bağlantısı sorunlarını giderme

Bir Realtime Compute for Apache Flink işi başlatılamadığında出现的 Timed out waiting for a node assignment hatası genellikle Realtime Compute for Apache Flink ile Kafka kümesi arasında bir ağ bağlantısı sorunu olduğunu gösterir.

Bir Kafka istemcisi broker'lara şu şekilde bağlanır:

  1. İstemci, Kafka kümesine ilk bağlantıyı kurmak için bootstrap.servers içinde belirtilen adresleri kullanır.

  2. Kafka kümesi her broker için uç noktalarını da içeren meta verileri döndürür.

  3. İstemci daha sonra veri okumak veya yazmak için bu uç noktaları kullanarak broker'lara bağlanır.

bootstrap.servers adreslerine erişilebilir olsa bile Kafka yanlış broker uç noktaları döndürürse istemci veri okuyamaz veya yazamaz. Bu sorun genellikle proxy, port yönlendirme veya kiralık hat kullanan ağ mimarilerinde ortaya çıkar.

Sorun giderme adımları

ApsaraMQ for Kafka

  1. Uç Nokta türünü onaylayın

    • Varsayılan Uç Nokta (dahili ağ)

    • SASL Uç Noktası (kimlik doğrulamalı dahili ağ)

    • Genel Uç Nokta (ayrı başvuru gerektirir)

    Realtime Compute for Apache Flink geliştirme konsolundaki Network Probe özelliğini kullanarak bootstrap.servers adresiyle ilgili bağlantı sorunlarını ortadan kaldırın.

  2. Güvenlik gruplarını ve izin listelerini kontrol edin

    Realtime Compute for Apache Flink çalışma alanının CIDR bloğunu Kafka örneğinizin izin listesine ekleyin. Daha fazla bilgi için bkz. View VPC CIDR Block ve Configure a whitelist.

  3. SASL yapılandırmasını kontrol edin (etkinse)

    SASL_SSL uç noktası kullanıyorsanız Realtime Compute for Apache Flink işinizde JAAS, SSL ve SASL mekanizmalarının doğru yapılandırıldığından emin olun. Uygun kimlik doğrulama olmadan bağlantı el sıkışma aşamasında başarısız olabilir ve bu durum zaman aşımı olarak görünebilir. Daha fazla bilgi için bkz. Security and authentication.

Self-managed Kafka

  1. **Network Probe özelliğini kullanın**

    Bu özellik bootstrap.servers adresiyle ilgili bağlantı sorunlarını ortadan kaldırmanıza ve doğru dahili veya genel uç noktanın kullanıldığını doğrulamanıza yardımcı olur.

  2. Güvenlik gruplarını ve izin listelerini kontrol edin

    • Elastic Compute Service (ECS) örneğinin güvenlik grubu, Kafka uç noktası bağlantı noktasına (genellikle 9092 veya 9093) gelen trafiğe izin vermelidir.

    • ECS örneğindeki herhangi bir güvenlik duvarının Realtime Compute for Apache Flink çalışma alanınızın VPC'sinden gelen trafiğe izin verdiğinden emin olun. Daha fazla bilgi için bkz. View VPC CIDR Block.

  3. Yapılandırmayı kontrol edin

    1. Kafka'nın kullandığı ZooKeeper kümesinde oturum açmak için zkCli.sh veya zookeeper-shell.sh aracını kullanın.

    2. Broker meta verilerini almak için bir komut çalıştırın. Örneğin, get /brokers/ids/0 komutunu çalıştırın. Yanıtın endpoints alanında Kafka'nın istemcilere duyurduğu adresi bulun.

      
      # bin/zookeeper-shell.sh localhost:2181
      Connecting to localhost:2181
      Welcome to ZooKeeper!
      JLine support is disabled
      
      WATCHER::
      
      WatchedEvent state:SyncConnected type:None path:null
      get /brokers/ids/0
      {"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://116.62.xxx:9092"],"jmx_port":-1,"host":"116.62.xxx","timestamp":"1614840078030","port":9092,"version":4}
      
    3. Realtime Compute for Apache Flink geliştirme konsolundaki Network Probe özelliğini kullanarak bu adrese erişilebilir olup olmadığını test edin.

      Not
      • Adrese erişilemiyorsa Kafka yöneticilerinizle iletişime geçerek listeners ve advertised.listeners yapılandırmalarını kontrol ettirin ve düzeltin; duyurulan adresin Realtime Compute for Apache Flink tarafından erişilebilir olduğundan emin olun.

      • Kafka istemci bağlantıları hakkında daha fazla bilgi için bkz. Troubleshoot Connectivity.

  4. SASL yapılandırmasını kontrol edin (etkinse)

    SASL_SSL uç noktası kullanıyorsanız Realtime Compute for Apache Flink işinizde JAAS, SSL ve SASL mekanizmalarının doğru yapılandırıldığından emin olun. Uygun kimlik doğrulama olmadan bağlantı el sıkışma aşamasında başarısız olabilir ve bu durum zaman aşımı olarak görünebilir. Daha fazla bilgi için bkz. Security and authentication.

SQL

Kafka bağlayıcısını SQL işlerinde kaynak veya hedef tablo olarak kullanın.

Sözdizimi

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'
)

Meta veri sütunları

Kafka mesaj meta verilerine erişmek için kaynak veya hedef tabloda meta veri sütunları tanımlayın. Örneğin, birden fazla konuya abone olduğunuzda bir meta veri sütunu her kaydın hangi konudan geldiğini belirleyebilir.

CREATE TABLE kafka_source (
  -- Read the message topic as the `record_topic` column
  `record_topic` STRING NOT NULL METADATA FROM 'topic' VIRTUAL,
  -- Read the timestamp from the ConsumerRecord as the `ts` column
  `ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL,
  -- Read the message offset as the `record_offset` column
  `record_offset` BIGINT NOT NULL METADATA FROM 'offset' VIRTUAL,
  ...
) WITH (
  'connector' = 'kafka',
  ...
);

CREATE TABLE kafka_sink (
  -- Write the timestamp from the `ts` column as the ProducerRecord's timestamp to Kafka
  `ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL,
  ...
) WITH (
  'connector' = 'kafka',
  ...
);

Aşağıdaki tabloda Kafka kaynak ve hedef tablolarının desteklediği meta veri sütunları listelenmiştir.

Anahtar

Tür

Açıklama

Kapsam

topic

STRING NOT NULL METADATA VIRTUAL

Mesaj konusu.

Kaynak tablo

partition

INT NOT NULL METADATA VIRTUAL

Mesaj bölümü kimliği.

Kaynak tablo

headers

MAP<STRING, BYTES> NOT NULL METADATA VIRTUAL

Mesaj başlıkları.

Kaynak tablo ve hedef tablo

leader-epoch

INT NOT NULL METADATA VIRTUAL

Mesaj lider dönemi.

Kaynak tablo

offset

BIGINT NOT NULL METADATA VIRTUAL

Mesaj ofseti.

Kaynak tablo

timestamp

TIMESTAMP(3) WITH LOCAL TIME ZONE NOT NULL METADATA VIRTUAL

Mesaj zaman damgası.

Kaynak tablo ve hedef tablo

timestamp-type

STRING NOT NULL METADATA VIRTUAL

Mesaj zaman damgası türü. Geçerli değerler:

  • NoTimestampType: Mesajda zaman damgası tanımlanmamıştır.

  • CreateTime: Mesajın oluşturulma zamanı.

  • LogAppendTime: Mesajın Kafka broker günlüğüne eklendiği zaman.

Kaynak tablo

__raw_key__

STRING NOT NULL METADATA VIRTUAL

Ham mesaj anahtarı.

Kaynak tablo ve hedef tablo

Not

Bu parametre yalnızca Ververica Runtime (VVR) 11.4 ve sonraki sürümlerde desteklenir.

__raw_value__

STRING NOT NULL METADATA VIRTUAL

Ham mesaj değeri.

Kaynak tablo ve hedef tablo

Not

Bu parametre yalnızca Ververica Runtime (VVR) 11.4 ve sonraki sürümlerde desteklenir.

Bağlayıcı seçenekleri

  • Genel

    Seçenek

    Açıklama

    Tür

    Gerekli

    Varsayılan

    Açıklamalar

    connector

    Bağlayıcı türü.

    String

    Evet

    –

    Değer kafka olmalıdır.

    properties.bootstrap.servers

    Kafka broker adreslerinin listesi.

    String

    Evet

    –

    Format: host1:port1,host2:port2,.... Adresleri virgül (,) ile ayırın.

    properties.*

    Kafka istemcisi için ek özellikler.

    String

    Hayır

    –

    Özellik anahtarları resmi Apache Kafka belgelerinde Producer Configs ve Consumer Configs için tanımlanan geçerli seçenekler olmalıdır.

    Realtime Compute for Apache Flink properties. önekini kaldırır ve kalan anahtar-değer çiftlerini alttaki Kafka istemcisine iletir. Örneğin, otomatik konu oluşturmayı devre dışı bırakmak için 'properties.allow.auto.create.topics' = 'false' ayarlayabilirsiniz.

    Kafka bağlayıcısı bu seçeneklerin üzerine yazar, bu nedenle bunları bu şekilde yapılandıramazsınız:

    • key.deserializer

    • value.deserializer

    format

    Bir Kafka mesajının değerini serileştirmek ve seri durumdan çıkarmak için kullanılan format.

    String

    Hayır

    –

    Desteklenen formatlar:

    • csv

    • json

    • avro

    • debezium-json

    • canal-json

    • maxwell-json

    • avro-confluent

    • raw

    Not

    Daha fazla bilgi için bkz. Format options.

    key.format

    Bir Kafka mesajının anahtarını serileştirmek ve seri durumdan çıkarmak için kullanılan format.

    String

    Hayır

    –

    Desteklenen formatlar:

    • csv

    • json

    • avro

    • debezium-json

    • canal-json

    • maxwell-json

    • avro-confluent

    • raw

    Not

    Bu yapılandırmayı kullandığınızda key.options gereklidir.

    key.fields

    Kafka mesaj anahtarı olarak kullanılacak tablo şemasından alanlar.

    String

    Hayır

    –

    Birden fazla alan adını noktalı virgül (;) ile ayırın. Örneğin, 'field1;field2'.

    key.fields-prefix

    Tüm anahtar alanları için değer alanlarıyla ad çakışmalarını önlemek amacıyla özel bir önek.

    String

    Hayır

    –

    Bu önek anahtar ve değer alanlarını ayırt etmek için kullanılır. Anahtarı serileştirmeden önce veya seri durumdan çıkardıktan sonra kaldırılır.

    Not

    Bu seçeneği kullanırsanız value.fields-include değeri EXCEPT_KEY olarak ayarlanmalıdır.

    value.format

    Bir Kafka mesajının değerini serileştirmek ve seri durumdan çıkarmak için kullanılan format.

    String

    Hayır

    –

    Bu yapılandırma format ile eşdeğerdir. format veya value.format seçeneklerinden yalnızca birini ayarlayabilirsiniz. Her ikisi de yapılandırılırsa value.format format seçeneğinin üzerine yazar.

    value.fields-include

    Anahtar alanların değer formatına dahil edilip edilmeyeceğini tanımlar.

    String

    Hayır

    ALL

    Geçerli değerler:

    • ALL: Kafka mesaj değeri tüm tablo sütunlarını içerir.

    • EXCEPT_KEY: Kafka mesaj değeri key.fields içinde tanımlananlar hariç tüm tablo sütunlarını içerir.

  • Kaynak tablo

    Seçenek

    Açıklama

    Tür

    Gerekli

    Varsayılan

    Açıklamalar

    topic

    Okunacak konu veya konular.

    String

    Hayır

    –

    Birden fazla konuya abone olmak için konu adlarını noktalı virgül (;) ile ayırın; örneğin, 'topic-1;topic-2'.

    Not

    Bu seçeneği veya topic-pattern seçeneğini belirtebilirsiniz ancak her ikisini aynı anda belirtemezsiniz.

    topic-pattern

    Abone olunacak konularla eşleşen bir düzenli ifade. Tüketici, adları bu desenle eşleşen tüm konulara abone olur.

    String

    Hayır

    –

    Örnekler:

    • user_event_.*: user_event_ önekiyle başlayan tüm konularla eşleşir.

    • prod\.logs\..*: prod.logs. önekiyle başlayan konularla eşleşir (. karakteri kaçış karakteriyle belirtilmelidir).

    Not

    Bu seçeneği veya topic seçeneğini belirtebilirsiniz ancak her ikisini aynı anda belirtemezsiniz.

    properties.group.id

    Kafka kaynak tüketici grubu kimliği.

    String

    Hayır

    KafkaSource-{Source-Table-Name}

    Bir tüketici grubu kimliğini ilk kez kullanıyorsanız başlangıç ofsetini tanımlamak amacıyla properties.auto.offset.reset değerini earliest veya latest olarak ayarlamalısınız.

    scan.startup.mode

    Kafka tüketici başlangıç ofseti.

    String

    Hayır

    group-offsets

    Geçerli değerler:

    • earliest-offset: En erken mevcut ofsetten okumaya başlar.

    • latest-offset: En son ofsetten okumaya başlar.

    • group-offsets: Belirtilen properties.group.id için commit edilmiş ofsetlerden okumaya başlar.

    • timestamp: Belirtilen scan.startup.timestamp-millis değerinden okumaya başlar.

    • specific-offsets: scan.startup.specific-offsets içinde belirtilen ofsetlerden okumaya başlar.

    Not

    Bu seçenek yalnızca durumu olmayan bir iş başladığında geçerlidir. Bir iş checkpoint'ten devam ediyorsa checkpoint durumunda saklanan ofsetlerden okur.

    scan.startup.specific-offsets

    scan.startup.mode değeri specific-offsets olduğunda bölüm başına başlangıç ofseti.

    String

    Hayır

    –

    Örneğin, partition:0,offset:42;partition:1,offset:300

    scan.startup.timestamp-millis

    scan.startup.mode değeri timestamp olarak ayarlandığında milisaniye cinsinden başlangıç zaman damgası.

    Long

    Hayır

    –

    Birim milisaniyedir.

    scan.topic-partition-discovery.interval

    Bölüm keşif aralığı.

    Duration

    Hayır

    5 dakika

    Bağlayıcı periyodik olarak yeni bölümleri keşfeder ve bunlardan okur. topic-pattern kullandığınızda bağlayıcı ayrıca desenle eşleşen yeni konuları da keşfeder. Bu özelliği devre dışı bırakmak için aralığı negatif olmayan bir değere ayarlayın.

    Not

    Ververica Runtime (VVR) 6.0.x'te dinamik bölüm keşfi varsayılan olarak devre dışıdır. VVR 8.0'dan itibaren bu özellik varsayılan olarak etkindir ve keşif aralığı 5 dakikadır.

    scan.header-filter

    Kafka mesaj başlıklarına göre mesajları filtreler.

    String

    Hayır

    –

    Bir başlık anahtarı ve değeri iki nokta üst üste (:) ile ayrılır. Birden fazla başlık koşulu mantıksal operatörler (& ve |) kullanılarak bağlanır. NOT mantıksal operatörü (!) de desteklenir. Örneğin, depart:toy|depart:book&!env:test ifadesi başlık depart=toy veya depart=book içeriyor ve env=test içermiyorsa Kafka verilerini tutar.

    Not
    • Bu seçenek yalnızca Ververica Runtime (VVR) 8.0.6 ve sonraki sürümlerde desteklenir.

    • İfadelerde parantezler desteklenmez.

    • Mantıksal işlemler soldan sağa değerlendirilir.

    • Karşılaştırma için başlık değerleri UTF-8 dizelerine dönüştürülür.

    scan.check.duplicated.group.id

    properties.group.id değerini zaten kullanan başka bir etkin tüketici olup olmadığını kontrol eder.

    Boolean

    Hayır

    false

    Geçerli değerler:

    • true: İş başlamadan önce sistem yinelenen bir tüketici grubunu kontrol eder. Çakışmaları önlemek için böyle bir grup bulunursa iş başarısız olur.

    • false: Çakışma kontrolü yapmadan işi başlatır.

    Not

    Bu seçenek yalnızca Ververica Runtime (VVR) 6.0.4 ve sonraki sürümlerde desteklenir.

  • Hedef tablo

    Seçenek

    Açıklama

    Tür

    Gerekli

    Varsayılan

    Açıklamalar

    topic

    Hedef konu.

    String

    Evet

    –

    –

    sink.partitioner

    Paralel hedef örneklerinden gelen kayıtları Kafka bölümlerine eşler.

    String

    Hayır

    default

    Geçerli değerler:

    • default: Varsayılan Kafka bölümleyiciyi kullanır.

    • fixed: Her paralel hedef örneği sabit bir Kafka bölümüne yazar.

    • round-robin: Kayıtlar bölümlere round-robin yöntemiyle dağıtılır.

    • Özel bölümleyici: Özel bir bölümleyici kullanmak için bir FlinkKafkaPartitioner alt sınıfının tam nitelikli sınıf adını sağlayın; örneğin, org.mycompany.MyPartitioner.

    sink.delivery-guarantee

    Hedef teslimat garantisi.

    String

    Hayır

    at-least-once

    Geçerli değerler:

    • none: Garanti sağlamaz. Kayıtlar kaybolabilir veya yinelenebilir.

    • at-least-once: Hiçbir kaydın kaybolmadığını garanti eder ancak kayıtlar yinelenebilir.

    • exactly-once: Exactly-once semantiği sağlamak için Kafka transaction'larını kullanır ve kayıtların ne kaybolmasını ne de yinelenmesini sağlar.

    Not

    exactly-once semantiği kullanırken ayrıca sink.transactional-id-prefix belirtmeniz gerekir.

    sink.transactional-id-prefix

    Transaction ID öneki. sink.delivery-guarantee değeri exactly-once olduğunda gereklidir.

    String

    Evet, sink.delivery-guarantee değeri exactly-once ise

    –

    Yalnızca sink.delivery-guarantee değeri exactly-once olarak ayarlandığında gereklidir.

    sink.parallelism

    Hedef operatör paralelliği.

    Integer

    Hayır

    –

    Varsayılan olarak framework paralelliği upstream operatörlere göre belirler.

Güvenlik ve kimlik doğrulama

Kafka kümesi güvenli bir bağlantı veya kimlik doğrulama gerektiriyorsa ilgili güvenlik ve kimlik doğrulama yapılandırmalarının önüne properties. önekini ekleyin ve WITH parametresinde ayarlayın. Aşağıdaki örnek PLAIN SASL mekanizmasını ve bir JAAS yapılandırmasını kullanan bir Kafka tablosunu yapılandırır.

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";'
)

Aşağıdaki örnek güvenlik protokolü olarak SASL_SSL ve SASL mekanizması olarak SCRAM-SHA-256 kullanımını gösterir.

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',
  /* SSL configuration */
  /* Path to the truststore for the server's CA certificate. */
  /* Files uploaded using Artifacts are stored in the /flink/usrlib/ directory. */
  'properties.ssl.truststore.location' = '/flink/usrlib/kafka.client.truststore.jks',
  'properties.ssl.truststore.password' = 'test1234',
  /* If client authentication is required, you must also configure the path to the keystore (private key). */
  'properties.ssl.keystore.location' = '/flink/usrlib/kafka.client.keystore.jks',
  'properties.ssl.keystore.password' = 'test1234',
  /* The algorithm used to verify the server hostname. An empty string disables hostname verification. */
  'properties.ssl.endpoint.identification.algorithm' = '',
  /* SASL configuration */
  /* Set the SASL mechanism to SCRAM-SHA-256. */
  'properties.sasl.mechanism' = 'SCRAM-SHA-256',
  /* Configure JAAS. */
  'properties.sasl.jaas.config' = 'org.apache.flink.kafka.shaded.org.apache.kafka.common.security.scram.ScramLoginModule required username="username" password="password";'
)

Örnekte bahsedilen CA sertifikasını ve özel anahtarı yüklemek için Realtime Compute for Apache Flink konsolunun Artifacts özelliğini kullanabilirsiniz. Yüklenen dosyalar /flink/usrlib dizininde saklanır. my-truststore.jks adlı bir CA sertifika dosyası kullanmak için WITH yan tümcesinde 'properties.ssl.truststore.location' özelliğini aşağıdaki iki yoldan biriyle ayarlayabilirsiniz:

  • 'properties.ssl.truststore.location' = '/flink/usrlib/my-truststore.jks' ayarlayın. Bu yöntem çalışma zamanında Object Storage Service (OSS) üzerinden dosyaların dinamik olarak indirilmesini önler ancak Hata Ayıklama Modunu desteklemez.

  • Realtime Compute altyapı sürümü VVR 11.5 veya sonraki bir sürümse properties.ssl.truststore.location ve properties.ssl.keystore.location değerlerini mutlak bir OSS yoluna ayarlayabilirsiniz. Dosya yolu formatı oss://flink-fullymanaged-<Workspace ID>/artifacts/namespaces/<Namespace name>/<file name> şeklindedir. Bu yöntem Flink çalışma zamanı sırasında OSS dosyalarını dinamik olarak indirir ve Hata Ayıklama Modunu destekler.

Not
  • Yapılandırmanızı doğrulayın: Bu konudaki örnekler yaygın yapılandırmaları gösterir. Kafka bağlayıcısını yapılandırmadan önce doğru güvenlik ve kimlik doğrulama ayarlarını almak için Kafka işletim ve bakım ekibinizle iletişime geçin.

  • Kaçış: Yerel Apache Flink'in aksine Realtime Compute for Apache Flink SQL düzenleyicisi varsayılan olarak çift tırnak işaretlerini (") kaçış karakterleriyle işler. Bu nedenle properties.sasl.jaas.config seçeneğinde kullanıcı adı ve parola için kullanılan çift tırnak işaretlerini kaçış karakteriyle (\) belirtmenize gerek yoktur.

  • KMS'de barındırılan kimlik bilgileri: Düz metin kullanmak yerine KMS tarafından yönetilen bir kimlik bilgisine başvurmak için properties.sasl.jaas.config içindeki kullanıcı adı ve parolayı secret://kms.<secret-name>.<key> olarak ayarlayabilirsiniz. Bu özellik Realtime Compute altyapısı VVR 11.9 ve sonraki sürümlerde desteklenir. Yapılandırma yordamı için bkz. KMS credential management integration.

Kaynak tablo başlangıç ofseti

Başlangıç modu

Bir Kafka kaynak tablosunun veri okumaya başlayacağı ofseti belirtmek için scan.startup.mode seçeneğini yapılandırabilirsiniz. Geçerli değerler şunlardır:

  • earliest-offset: En erken ofsetten okumaya başlar.

  • latest-offset: En son ofsetten okumaya başlar.

  • group-offsets: properties.group.id içinde belirtilen tüketici grubu için commit edilmiş ofsetlerden okumaya başlar.

  • timestamp: scan.startup.timestamp-millis içinde belirtilen değere eşit veya ondan büyük zaman damgasına sahip ilk mesajdan okumaya başlar.

  • specific-offsets: scan.startup.specific-offsets içinde belirtilen belirli bölüm ofsetlerinden okumaya başlar.

Not
  • Bir başlangıç modu belirtmezseniz varsayılan değer 'group-offsets' olur.

  • scan.startup.mode seçeneği yalnızca durumsuz işler için geçerlidir. Durumlu bir iş başladığında her zaman durumunda saklanan ofsetlerden tüketim yapar.

Örnek:

CREATE TEMPORARY TABLE kafka_source (
  ...
) WITH (
  'connector' = 'kafka',
  ...
  -- Consume from the earliest offset.
  'scan.startup.mode' = 'earliest-offset',
  -- Consume from the latest offset.
  'scan.startup.mode' = 'latest-offset',
  -- Consume from the committed offsets of the consumer group "my-group".
  'properties.group.id' = 'my-group',
  'scan.startup.mode' = 'group-offsets',
  'properties.auto.offset.reset' = 'earliest', -- If "my-group" is used for the first time, consumption starts from the earliest offset.
  'properties.auto.offset.reset' = 'latest', -- If "my-group" is used for the first time, consumption starts from the latest offset.
  -- Consume from the specified timestamp in milliseconds: 1655395200000.
  'scan.startup.mode' = 'timestamp',
  'scan.startup.timestamp-millis' = '1655395200000',
  -- Consume from specific offsets.
  'scan.startup.mode' = 'specific-offsets',
  'scan.startup.specific-offsets' = 'partition:0,offset:42;partition:1,offset:300'
);

Başlangıç ofseti önceliği

Kaynak tablonun başlangıç ofseti aşağıdaki kurallara göre öncelik sırasına göre belirlenir:

Öncelik (yüksekten düşüğe)

Checkpoint veya savepoint'te saklanan ofset.

İş başlatma sırasında Realtime Compute for Apache Flink konsolunda seçilen başlangıç zamanı.

WITH yan tümcesinde scan.startup.mode ile belirtilen başlangıç ofseti.

scan.startup.mode belirtilmezse ilgili tüketici grubunun ofsetlerinden tüketimi başlatmak için group-offsets kullanılır.

Bu adımlardan herhangi biriyle belirlenen ofset süresi dolduğu veya Kafka kümesinde bir sorun oluştuğu gibi nedenlerle geçersiz olursa sistem properties.auto.offset.reset içinde belirtilen ilkeye göre ofseti sıfırlar. Bu seçenek yapılandırılmamışsa sistem kullanıcı müdahalesi gerektiren bir özel durum oluşturur.

Yaygın bir senaryo yeni bir tüketici grubu kimliğiyle tüketimi başlatmaktır. Kaynak tablo önce Kafka kümesinden o grubun commit edilmiş ofsetlerini sorgular. Grup kimliği yeni olduğu için geçerli ofset bulunamaz. Sonuç olarak sistem properties.auto.offset.reset içinde belirtilen ilkeye göre ofseti sıfırlar. Bu nedenle yeni bir grup kimliğiyle tüketim yaparken properties.auto.offset.reset seçeneğini yapılandırmanız gerekir.

Kaynak ofsetlerini commit etme

Kafka kaynak tablosu tüketici ofsetini Kafka kümesine yalnızca başarılı bir checkpoint'ten sonra commit eder; bu nedenle uzun bir checkpoint aralığı commit edilen ofsetin geride kalmasına neden olur. Kaynak tablo gerçek okuma ilerlemesini checkpoint durumunda saklar ve sistem bunu hata kurtarma için kullanır. Commit edilen ofsetler yalnızca ilerleme izleme amaçlıdır ve kurtarma için kullanılmaz; bu nedenle commit hataları veri doğruluğunu etkilemez.

Özel hedef bölümleyici

Kafka'nın yerleşik bölümleme stratejisi gereksinimlerinizi karşılamıyorsa FlinkKafkaPartitioner sınıfını genişleterek özel bir bölümleyici uygulayabilirsiniz. Geliştirme tamamlandıktan sonra kodunuzu bir JAR paketine derleyin ve Realtime Compute konsolundaki Artifacts özelliğini kullanarak yükleyin. JAR paketi yüklendikten ve referans verildikten sonra WITH yan tümcesinde sink.partitioner parametresini bölümleyicinizin tam nitelikli sınıf adına ayarlayın; örneğin, org.mycompany.MyPartitioner.

Kafka, Upsert Kafka ve Kafka JSON katalog

Kafka yalnızca ekleme yapılabilen bir olay akışı platformudur ve veri güncellemelerini veya silmelerini desteklemez. Akış SQL'inde standart bir Kafka hedef tablosu upstream Change Data Capture (CDC) verilerini veya aggregate ve join gibi operatörlerin geri çekme mantığını işleyemez. Değişiklik veya geri çekme içeren verileri yazmanız gerekiyorsa bir Upsert Kafka hedef tablosu kullanın.

Bir veya daha fazla upstream veritabanı tablosundan Kafka'ya Change Data Capture (CDC) verilerinin toplu eşzamanlamasını basitleştirmek için Kafka JSON katalog kullanabilirsiniz. Kafka'da saklanan veriler JSON formatındaysa Kafka JSON katalog şema ve WITH parametrelerini tanımlama adımını atlamanızı sağlar. Ayrıntılar için bkz. Manage Kafka JSON catalogs.

Örnekler

Örnek 1: Kafka'dan okuma ve Kafka'ya yazma

Bu örnek bir kaynak Kafka konusundan veri okur ve bunu bir hedef konuya yazar. Veriler CSV formatındadır.

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;

Örnek 2: Tablo şemasını ve verileri eşzamanlama

Kafka bağlayıcısını kullanarak Kafka konusundaki mesajları Hologres'e gerçek zamanlı olarak eşzamanlayabilirsiniz. Yük devretme sırasında Hologres'te yinelenen mesajları önlemek için Kafka mesajlarının ofsetini ve bölüm kimliğini bileşik birincil anahtar olarak kullanabilirsiniz.

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'
    -- Optional. Flattens all nested columns.
);

CREATE TABLE IF NOT EXISTS hologres.kafka.`sync_kafka`
WITH (
  'connector' = 'hologres'
) AS TABLE vvp.`default`.kafkaTable;

Örnek 3: Kafka anahtarlarını ve değerlerini eşzamanlama

Bir Kafka mesaj anahtarı ilgili bilgiler içeriyorsa hem anahtarı hem de değeri eşzamanlayabilirsiniz.

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;
Not

Kafka mesaj anahtarları Şema Evrimini veya otomatik tür ayrıştırmayı desteklemez. Şemayı manuel olarak bildirmeniz gerekir.

Örnek 4: Verileri eşzamanlama ve hesaplama gerçekleştirme

Verileri Kafka'dan Hologres'e eşzamlarken hafif dönüşümlere ihtiyaç duyabilirsiniz.

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');
--Use COALESCE to handle null values.

Örnek 5: İç içe geçmiş JSON'u ayrıştırma

Aşağıda örnek bir JSON mesajı verilmiştir:

{
  "id": 101,
  "name": "VVP",
  "properties": {
    "owner": "Alibaba Cloud",
    "engine": "Flink"
  }
}

Alanları ayrıştırmak için JSON_VALUE(payload, '$.properties.owner') gibi işlevler kullanmak yerine yapıyı doğrudan Kaynak DDL'de tanımlayabilirsiniz:

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'
);

Bu yaklaşımla Flink okuma aşamasında JSON'u yapılandırılmış alanlara ayrıştırır. Sonraki SQL sorguları ek işlev çağrılarına gerek kalmadan doğrudan properties.owner alanına başvurabilir ve bu durum genel performansı artırır.

Exactly-once semantiği

  • Tüketici izolasyon düzeyini yapılandırın

    Kafka verilerini tüketen tüm uygulamalar isolation.level özelliğini ayarlamalıdır:

    • read_committed: Yalnızca commit edilmiş verileri okur.

    • read_uncommitted (Varsayılan): Commit edilmemiş verileri okuyabilir.

    EXACTLY_ONCE read_committed değerine bağlıdır. Aksi takdirde tüketiciler commit edilmemiş verileri görebilir ve tutarlılık bozulur.

  • Transaction zaman aşımı ve veri kaybı

    Bir checkpoint'ten kurtulurken Realtime Compute for Apache Flink yalnızca o checkpoint başlamadan önce commit edilmiş transaction'ları dikkate alır. Bir iş arızası ile yeniden başlatılması arasındaki süre Kafka transaction zaman aşımını aşarsa Kafka açık transaction'ı otomatik olarak iptal eder ve bu durum veri kaybına yol açabilir.

    • Bir Kafka broker için varsayılan transaction.max.timeout.ms değeri 15 dakikadır.

    • Flink Kafka Sink varsayılan olarak transaction.timeout.ms parametresini 1 saat olarak ayarlar.

    • Broker üzerindeki transaction.max.timeout.ms değerini Flink'teki ayara eşit veya ondan büyük olacak şekilde artırmalısınız.

  • Üretici havuzu ve eşzamanlı checkpoint'ler

    EXACTLY_ONCE modu sabit boyutlu bir Kafka üretici havuzu kullanır. Her checkpoint bu havuzdan bir üretici kullanır. Eşzamanlı checkpoint sayısı havuz boyutunu aşarsa iş başarısız olur.

    Üretici havuzu boyutunu maksimum eşzamanlı checkpoint sayısına göre yapılandırın.

  • Paralellik azaltma kısıtlamaları

    Bir iş ilk checkpoint tamamlanmadan önce başarısız olursa orijinal üretici havuzu bilgileri yeniden başlatmada kaybolur. Bu nedenle ilk checkpoint tamamlanana kadar işin paralelliğini azaltmayın. Azaltma gerekliyse yeni paralellik FlinkKafkaProducer.SAFE_SCALE_DOWN_FACTOR değerinden düşük olmamalıdır.

  • Transaction'lar okumaları engeller

    read_committed modunda commit edilmemiş veya iptal edilmemiş herhangi bir transaction konudaki tüm okuma işlemlerini engeller.

    Örneğin:

    • Transaction 1 veri yazar.

    • Transaction 2 daha fazla veri yazar ve commit edilir.

    • Transaction 1 açık kaldığı sürece commit edilmiş Transaction 2'den gelen veriler tüketiciler tarafından görünmez.

    Bunun aşağıdaki sonuçları vardır:

    • Normal çalışma sırasında veri görünürlük gecikmesi yaklaşık olarak checkpoint aralığına eşittir.

    • Bir iş başarısız olursa yazdığı konu iş yeniden başlatılana veya transaction zaman aşımına uğrayana kadar tüketiciler tarafından engellenir. Aşırı durumlarda transaction zaman aşımı süreci de okuma işlemlerini etkileyebilir.

SSS