Sink: Streaming Lookup source: Sync/Async mode
Lindorm connector, Flink akış işlerinin SQL API kullanarak Lindorm geniş tablolarına veri yazmasını ve bu tablolardan veri aramasını sağlar.
Önkoşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Bir Lindorm geniş tablo motoru ve bir Lindorm tablosu. Daha fazla bilgi için bkz. Create an instance.
Lindorm kümesi ile Flink çalışma alanı arasında ağ bağlantısı (örneğin, her ikisinin de aynı sanal özel bulut (VPC) içinde bulunması).
Lindorm HBase tabloları desteklenmez. Yalnızca LindormTable desteklenir.
Hızlı başlangıç
Aşağıdaki örnek 10 satır veri oluşturur, bir Lindorm boyut tablosunda eşleşen satırları arar ve sonucu bir Lindorm alıcı tablosuna yazar.
-- Source: generate 10 rows with sequential IDs 0-9
CREATE TEMPORARY TABLE example_source (
id INT,
proc_time AS PROCTIME()
) WITH (
'connector' = 'datagen',
'number-of-rows' = '10',
'fields.id.kind' = 'sequence',
'fields.id.start' = '0',
'fields.id.end' = '9'
);
-- Dimension table: look up user details from Lindorm
CREATE TEMPORARY TABLE lindorm_hbase_dim (
`id` INT,
`name` VARCHAR,
`birth` VARCHAR,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'lindorm',
'tablename' = '${lindorm_dim_table}',
'seedserver' = '${lindorm_seed_server}',
'namespace' = 'default',
'username' = '${lindorm_username}',
'password' = '${lindorm_password}'
);
-- Sink table: write enriched records to Lindorm
CREATE TEMPORARY TABLE lindorm_hbase_sink (
`id` INT,
`name` VARCHAR,
`birth` VARCHAR,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'lindorm',
'tablename' = '${lindorm_sink_table}',
'seedserver' = '${lindorm_seed_server}',
'namespace' = 'default',
'username' = '${lindorm_username}',
'password' = '${lindorm_password}'
);
-- Temporal join: enrich source data with the dimension table and write to sink
INSERT INTO lindorm_hbase_sink
SELECT
s.id,
d.name,
d.birth
FROM example_source AS s
JOIN lindorm_hbase_dim AS d FOR SYSTEM_TIME AS OF s.proc_time
ON s.id = d.id;
Çalıştırmadan önce yer tutucuları değiştirin:
| Yer Tutucu | Açıklama |
|---|---|
${lindorm_dim_table} |
Lindorm boyut tablosunun adı |
${lindorm_sink_table} |
Lindorm alıcı tablosunun adı |
${lindorm_seed_server} |
host:port biçiminde Lindorm sunucu uç noktası |
${lindorm_username} |
Lindorm kullanıcı adı |
${lindorm_password} |
Lindorm parolası |
Söz dizimi
CREATE TABLE white_list (
id VARCHAR,
name VARCHAR,
age INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'lindorm',
'seedserver' = '<host:port>',
'namespace' = '<yourNamespace>',
'username' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTableName>',
'columnFamily' = '<yourColumnFamily>'
);
Connector seçenekleri
Genel
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
connector |
String | Evet | — | lindorm olarak ayarlanmalıdır. |
seedserver |
String | Evet | — | host:port biçiminde Lindorm sunucu uç noktası. Realtime Compute for Apache Flink, bağlanmak için Java için ApsaraDB for HBase API kullanır. Ayrıntılar için bkz. Use Flink to connect to and use LindormTable. |
namespace |
String | Evet | — | Lindorm veritabanı ad alanı. |
username |
String | Evet | — | Lindorm veritabanı kullanıcı adı. |
password |
String | Evet | — | Lindorm veritabanı parolası. |
tableName |
String | Evet | — | Lindorm tablosunun adı. |
columnFamily |
String | Evet | — | Sütun ailesi adı. Tablo oluşturulurken sütun ailesi belirtilmemişse f girin. |
retryIntervalMs |
Integer | Hayır | 1000 |
Başarısız okuma işlemleri için yeniden deneme aralığı (milisaniye cinsinden). |
maxRetryTimes |
Integer | Hayır | 5 |
Okuma veya yazma işlemleri için maksimum yeniden deneme sayısı. |
Alıcıya özgü
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
bufferSize |
Integer | Hayır | 500 |
Lindorm'a aktarılmadan önce tamponda tutulacak kayıt sayısı. |
flushIntervalMs |
Integer | Hayır | 2000 |
Tampon dolu olmadığında iki aktarma arasındaki maksimum süre (milisaniye cinsinden). |
ignoreDelete |
Boolean | Hayır | false |
true olarak ayarlandığında silme işlemleri atlanır. |
dynamicColumnSink |
Boolean | Hayır | false |
true olarak ayarlandığında dinamik tablo özelliğini etkinleştirir. Bkz. Dynamic table. |
excludeUpdateColumns |
String | Hayır | — | Güncellemelerden hariç tutulacak sütunların virgülle ayrılmış listesi. Örneğin, a,b,c değeri a, b ve c sütunlarına yapılan güncellemeleri atlar. VVR 8.0.9 veya sonraki sürümler gerektirir. |
Boyut tablosuna özgü
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
partitionedJoin |
Boolean | Hayır | false |
true olarak ayarlandığında önbellek isabet oranını artırmak için bölümlendirmeye JoinKey kullanır. |
shuffleEmptyKey |
Boolean | Hayır | false |
true olarak ayarlandığında boş yukarı akış anahtarlarını aşağı akış düğümlerine rastgele yönlendirir. false olarak ayarlandığında bunları paralel iş parçacığı 0'a yönlendirir. |
cache |
String | Hayır | None |
Önbellek ilkesi. Geçerli değerler: None (önbelleğe alma yok) ve LRU (son erişilen satırları önbelleğe alır). |
cacheSize |
Integer | Hayır | 1000 |
Önbelleğe alınacak maksimum satır sayısı. cache seçeneği LRU olarak ayarlandığında geçerlidir. |
cacheTTLMs |
Integer | Hayır | — | Önbellek girdisinin sona erme süresi (milisaniye cinsinden). cache seçeneği LRU olarak ayarlandığında geçerlidir. Varsayılan olarak girdilerin süresi dolmaz. |
cacheEmpty |
Boolean | Hayır | true |
true olarak ayarlandığında satır döndürmeyen arama sonuçlarını önbelleğe alır. |
async |
Boolean | Hayır | false |
true olarak ayarlandığında eşzamansız arama modunu etkinleştirir. |
asyncLindormRpcTimeoutMs |
Integer | Hayır | 300000 |
Eşzamansız aramalar için RPC zaman aşımı (milisaniye cinsinden). |
Arama önbelleği
Varsayılan olarak connector her aramayı doğrudan Lindorm'dan getirir (cache = None). Yüksek aktarım hızına sahip join işlemlerinde Lindorm okuma yükünü azaltmak için LRU önbelleğe almayı etkinleştirin.
cache = LRU ayarıyla connector son erişilen satırları bellekte saklar. Join anahtarı önbellekteki bir satırla eşleştiğinde connector Lindorm'u sorgulamadan önbelleğe alınan değeri döndürür. Bir önbellek girdisi şu durumlarda kaldırılır:
Önbellek
cacheSizesatıra ulaştığında (en eski satırlar önce kaldırılır).Girdi önbellekte
cacheTTLMsmilisaniyeden daha uzun süre kaldığında.
Bir ödünleşim söz konusudur: Daha uzun bir TTL veya daha büyük bir önbellek Lindorm okuma trafiğini azaltır ancak eskimiş veri sunma riskini artırır. Her iki değeri de aktarım hızı gereksinimlerinize ve temel verilerin ne kadar hızlı değiştiğine göre ayarlayın.
Lindorm connector bire çok arama joinlerini destekler. Boyut tablosundaki satırlar birden fazla yukarı akış olayıyla eşleşebiliyorsa önbelleğe alma stratejilerine ve aktarım hızına özellikle dikkat edin.
Tekil yazmalar
Bir Lindorm tablosunda birincil anahtar bulunduğunda tüm yazmalar upsert semantiği kullanır: Gelen her kayıt ya yeni bir satır ekler ya da mevcut eşleşen satırı günceller. Bu durum yazmaları tekil (idempotent) hale getirir.
Tekil yazmalar hata toleransı için önemlidir. Bir Flink işi bir kontrol noktasından yeniden başlatıldığında son başarılı kontrol noktasından itibaren mesajları yeniden oynatır. Lindorm upsert işlemleri tekil olduğu için yeniden oynatılan kayıtlar orijinal yazmalarla aynı sonucu üretir; yinelenen satırlar veya kural ihlalleri oluşmaz.
Tekil yazmalardan yararlanmak için DDL'nizde bir birincil anahtar tanımlayın.
Dinamik tablo
Şemanız çalışma zamanında değişiyorsa dinamik tablo özelliğini kullanın; sütunlar DDL zamanında sabitlenmek yerine verideki değerlere göre dinamik olarak oluşturulur. Tipik bir kullanım durumu, saatlerin sütun adı günlerin ise birincil anahtar olduğu günlük saatlik ölçümlerin izlenmesidir:
| Birincil anahtar | 00:00 | 01:00 |
|---|---|---|
| 2025-06-01 | 45 | 32 |
| 2025-06-02 | 76 | 34 |
Dinamik tablolar için DDL kuralları:
İlk N sütun birincil anahtarı oluşturur.
Son iki sütun
VARCHARtüründe olmalıdır.Sondan bir önceki sütun (
c1) dinamik sütun adını tutar.Son sütun (
c2) o sütun için değeri tutar.c1vec2dışındaki birincil anahtar olmayan sütunlara izin verilmez.
CREATE TABLE lindorm_dynamic_output (
pk1 VARCHAR,
pk2 VARCHAR,
pk3 VARCHAR,
c1 VARCHAR, -- column name written to Lindorm
c2 VARCHAR, -- column value written to Lindorm
PRIMARY KEY (pk1, pk2, pk3) NOT ENFORCED
) WITH (
'connector' = 'lindorm',
'seedserver' = '<host:port>',
'namespace' = '<yourNamespace>',
'username' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTableName>',
'columnFamily' = '<yourColumnFamily>',
'dynamicColumnSink' = 'true'
);
Her kayıt yazıldığında connector <pk1, pk2, pk3> ile tanımlanan Lindorm satırına bir sütun ekler veya bu sütunu günceller. O satırdaki diğer sütunlar değişmeden kalır.
Veri türü eşlemeleri
Tüm Lindorm verileri ikili biçimde depolanır. Aşağıdaki tablo connector'un Flink SQL türleri ile Lindorm ikili temsilleri arasında nasıl dönüşüm yaptığını gösterir.
| Flink SQL türü | Lindorm'a yazma | Lindorm'dan okuma |
|---|---|---|
CHAR / VARCHAR |
StringData::toBytes |
StringData::fromBytes |
BOOLEAN |
Bytes::toBytes(boolean) |
Bytes::toBigDecimal |
BINARY / VARBINARY |
Doğrudan bayt | Doğrudan bayt |
DECIMAL |
Bytes::toBytes(BigDecimal) |
Bytes::toBigDecimal |
TINYINT |
byte[] dizisinin ilk baytı |
bytes[0] |
SMALLINT |
Bytes::toBytes(short) |
Bytes::toShort |
INT |
Bytes::toBytes(int) |
Bytes::toInt |
BIGINT |
Bytes::toBytes(long) |
Bytes::toLong |
FLOAT |
Bytes::toBytes(float) |
Bytes::toFloat |
DOUBLE |
Bytes::toBytes(double) |
Bytes::toDouble |
DATE |
1970-01-01 tarihinden itibaren gün sayısı ile Bytes::toBytes(int) |
1970-01-01 tarihinden itibaren gün sayısı → Bytes::toInt |
TIME |
00:00:00'dan itibaren milisaniye sayısı ile Bytes::toBytes(int) |
00:00:00'dan itibaren milisaniye sayısı → Bytes::toInt |
TIMESTAMP |
1970-01-01 00:00:00'dan itibaren milisaniye sayısı ile Bytes::toBytes(long) |
1970-01-01 00:00:00'dan itibaren milisaniye sayısı → Bytes::toLong |
Bytes yöntemleri com.alibaba.lindorm.client.core.utils.Bytes sınıfındadır. StringData yöntemleri (CHAR/VARCHAR satırları) org.apache.flink.table.data.StringData sınıfındadır.
Ölçümler
Aşağıdaki alıcı ölçümleri kullanılabilir. Ayrıntılar için bkz. Metrics.
| Ölçüm | Açıklama |
|---|---|
numBytesOut |
Alıcıya yazılan toplam bayt sayısı |
numBytesOutPerSecond |
Saniye başına yazılan bayt sayısı |
numRecordsOut |
Alıcıya yazılan toplam kayıt sayısı |
numRecordsOutPerSecond |
Saniye başına yazılan kayıt sayısı |