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ı |
|
|
Ölçümler |
|
|
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.
ÖnemliApsaraMQ 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 olaraktruedeğ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-prefixdeğ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:
İstemci, Kafka kümesine ilk bağlantıyı kurmak için
bootstrap.serversiçinde belirtilen adresleri kullanır.Kafka kümesi her broker için uç noktalarını da içeren meta verileri döndürür.
İ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
-
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.serversadresiyle ilgili bağlantı sorunlarını ortadan kaldırın. -
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.
-
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
-
**Network Probe özelliğini kullanın**
Bu özellik
bootstrap.serversadresiyle 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. -
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.
-
Yapılandırmayı kontrol edin
Kafka'nın kullandığı ZooKeeper kümesinde oturum açmak için zkCli.sh veya zookeeper-shell.sh aracını kullanın.
-
Broker meta verilerini almak için bir komut çalıştırın. Örneğin,
get /brokers/ids/0komutunu ç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} -
Realtime Compute for Apache Flink geliştirme konsolundaki Network Probe özelliğini kullanarak bu adrese erişilebilir olup olmadığını test edin.
NotAdrese erişilemiyorsa Kafka yöneticilerinizle iletişime geçerek
listenersveadvertised.listenersyapı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.
-
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:
|
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
kafkaolmalı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
NotDaha 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
NotBu 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.
NotBu seçeneği kullanırsanız
value.fields-includedeğeriEXCEPT_KEYolarak 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
formatile eşdeğerdir.formatveyavalue.formatseçeneklerinden yalnızca birini ayarlayabilirsiniz. Her ikisi de yapılandırılırsavalue.formatformatseç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ğerikey.fieldsiç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'.NotBu seçeneği veya
topic-patternseç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).
NotBu seçeneği veya
topicseç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
earliestveyalatestolarak 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.
NotBu 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.modedeğerispecific-offsetsolduğunda bölüm başına başlangıç ofseti.String
Hayır
–
Örneğin,
partition:0,offset:42;partition:1,offset:300scan.startup.timestamp-millis
scan.startup.modedeğeritimestampolarak 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.
NotVerverica 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:testifadesi başlıkdepart=toyveyadepart=bookiçeriyor veenv=testiç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.iddeğ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.
NotBu 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
FlinkKafkaPartitioneralt 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.
Notexactly-oncesemantiği kullanırken ayrıca sink.transactional-id-prefix belirtmeniz gerekir.sink.transactional-id-prefix
Transaction ID öneki.
sink.delivery-guaranteedeğeriexactly-onceolduğunda gereklidir.String
Evet,
sink.delivery-guaranteedeğeriexactly-onceise–
Yalnızca sink.delivery-guarantee değeri
exactly-onceolarak 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.locationveproperties.ssl.keystore.locationdeğ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.
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.configseç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.configiç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.
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;
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_committeddeğ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.msdeğeri 15 dakikadır.Flink Kafka Sink varsayılan olarak
transaction.timeout.msparametresini 1 saat olarak ayarlar.Broker üzerindeki
transaction.max.timeout.msdeğ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_ONCEmodu 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_FACTORdeğerinden düşük olmamalıdır. -
Transaction'lar okumaları engeller
read_committedmodunda 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.