Tablestore konektörü, streaming modunda çalışan Flink SQL işlerinde Tablestore tablolarını kaynak tablo, boyut tablosu ve hedef tablo olarak kullanmanıza olanak tanır.
Konektör yetenekleri
| Öğe | Açıklama |
|---|---|
| Çalışma modu | Streaming modu |
| API türü | SQL API |
| Tablo türü | Kaynak tablo, boyut tablosu ve hedef tablo |
| Veri biçimi | Yok |
| Hedef tablo ölçümleri | numBytesOut, numBytesOutPerSecond, numRecordsOut, numRecordsOutPerSecond, currentSendTime |
| Hedef tabloda veri güncelleme veya silme | Desteklenir |
Hedef ölçümler hakkında ayrıntılı bilgi için bkz. Monitoring metrics .
Önkoşullar
Başlamadan önce aşağıdaki öğelere sahip olduğunuzdan emin olun:
Bir Tablestore örneği ve bir Tablestore tablosu. Bkz. Use Tablestore.
Kullanım sınırlamaları
Tablestore örneklerine hesaplar arası erişim desteklenir. Bir VPC uç noktası kullanırken, Tablestore örneği Flink ile aynı bölgede olmalıdır. accessId ve accessKey değerlerini, Tablestore örneğinin sahibi olan hesabın AccessKey çiftine ayarlayın.
Söz dizimi
Üç tablo türünün tümü, WITH yan tümcesinde türüne özel seçeneklerle birlikte 'connector'='ots' ifadesini kullanır.
Hedef tablo
CREATE TABLE ots_sink (
name VARCHAR,
age BIGINT,
birthday BIGINT,
PRIMARY KEY (name, age) NOT ENFORCED
) WITH (
'connector'='ots',
'instanceName'='<yourInstanceName>',
'tableName'='<yourTableName>',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'endPoint'='<yourEndpoint>',
'valueColumns'='birthday'
);
Bir Tablestore hedef tablosu birincil anahtar gerektirir. Her çıktı kaydı, mevcut verileri güncellemek üzere tabloya eklenir.
Boyut tablosu
CREATE TABLE ots_dim (
id INT,
len INT,
content STRING
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='<yourInstanceName>',
'tableName'='<yourTableName>',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}'
);
Kaynak tablo
CREATE TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-source',
'tableName'='flink_source_table',
'tunnelName'='flinksourcestream',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='false'
);
Kullanılabilir meta veriler
Tablestore kaynak tablosu, METADATA anahtar sözcüğü aracılığıyla iki meta veri alanını sunar. Bu alanları, her değişiklik olayının işlem türünü ve zamanlamasını izlemek için kullanın.
| Meta veri anahtarı | Flink veri türü | Açıklama |
|---|---|---|
type |
STRING | Veri işlemi türü (OtsRecordType ile eşleşir). |
timestamp |
BIGINT | Mikrosaniye cinsinden veri işlemi zamanı (OtsRecordTimestamp ile eşleşir). Tam veri okumaları için 0 olarak ayarlanır. |
Meta veri alanlarını okumak için bunları METADATA FROM söz dizimiyle bildirin:
CREATE TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR,
record_type STRING METADATA FROM 'type',
record_timestamp BIGINT METADATA FROM 'timestamp'
) WITH (
...
);
Konektör seçenekleri
Genel seçenekler
Tüm tablo türleri aşağıdaki seçenekleri paylaşır.
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
connector |
String | Evet | — | ots olarak ayarlayın. |
instanceName |
String | Evet | — | Tablestore örneğinin adı. |
endPoint |
String | Evet | — | Tablestore örneğinin uç noktası. Bkz. Endpoints. |
tableName |
String | Evet | — | Tablonun adı. |
accessId |
String | Evet | — | Alibaba Cloud hesabınızın veya bir Resource Access Management (RAM) kullanıcısının AccessKey ID'si. Bkz. How do I view the AccessKey ID and AccessKey secret? |
accessKey |
String | Evet | — | Alibaba Cloud hesabınızın veya bir RAM kullanıcısının AccessKey gizli anahtarı. |
connectTimeout |
Integer | Hayır | 30000 | Milisaniye cinsinden bağlantı zaman aşımı. |
socketTimeout |
Integer | Hayır | 30000 | Milisaniye cinsinden soket zaman aşımı. |
ioThreadCount |
Integer | Hayır | 4 | G/Ç iş parçacığı sayısı. |
callbackThreadPoolSize |
Integer | Hayır | 4 | Geri arama iş parçacığı havuzunun boyutu. |
AccessKey çiftinizi sabit kodlamak yerine saklamak için variables kullanın.
Kaynak tablo seçenekleri
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
tunnelName |
String | Evet | — | Tablestore tünelinin adı. Bu seçeneği kullanmadan önce tüneli Tablestore konsolunda oluşturun. Desteklenen tünel türleri: Artımlı, Tam ve Farklı. Bkz. Quick start içindeki "Create a tunnel" bölümü. |
ignoreDelete |
Boolean | Hayır | false | Silme işlemlerinin atlanıp atlanmayacağı. true: atla; false: silme işlemlerini işle. |
skipInvalidData |
Boolean | Hayır | false | Hatalı verilerin atlanıp atlanmayacağı. true: hatalı verileri atla; false: hata bildir. Ververica Runtime (VVR) 8.0.4 veya sonraki sürümler gerektirir. |
retryStrategy |
Enum | Hayır | TIME | Yeniden deneme ilkesi. TIME: retryTimeoutMs süresi dolana kadar yeniden dene; COUNT: retryCount sayısına ulaşılana kadar yeniden dene. |
retryCount |
Integer | Hayır | 3 | Maksimum yeniden deneme sayısı. retryStrategy değeri COUNT olduğunda uygulanır. |
retryTimeoutMs |
Integer | Hayır | 180000 | Milisaniye cinsinden yeniden deneme zaman aşımı. retryStrategy değeri TIME olduğunda uygulanır. |
streamOriginColumnMapping |
String | Hayır | — | Orijinal sütun adlarından gerçek sütun adlarına eşleme. Biçim: origin_col1:col1,origin_col2:col2. |
outputSpecificRowType |
Boolean | Hayır | false | Belirli satır türünün geçirilip geçirilmeyeceği. false: tüm satırlar INSERT olarak işlenir; true: satırlar INSERT, DELETE veya UPDATE_AFTER olabilir. |
dataFetchTimeoutMs |
Integer | Hayır | 10000 | Tek bir bölümden veri getirmek için milisaniye cinsinden maksimum süre. Çok sayıda bölüm senkronize ederken genel senkronizasyon gecikmesini azaltmak için bu değeri düşürün. VVR 8.0.10 veya sonraki sürümler gerektirir. |
enableRequestCompression |
Boolean | Hayır | false | İstek sıkıştırmasının etkinleştirilip etkinleştirilmeyeceği. Daha yüksek CPU yükü pahasına bant genişliği kullanımını azaltır. VVR 8.0.10 veya sonraki sürümler gerektirir. |
Hedef tablo seçenekleri
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
valueColumns |
String | Evet | — | Yazılacak sütunların adları. Birden fazla sütun adını virgülle (,) ayırın. |
retryIntervalMs |
Integer | Hayır | 1000 | Milisaniye cinsinden yeniden deneme aralığı. |
maxRetryTimes |
Integer | Hayır | 10 | Maksimum yeniden deneme sayısı. |
bufferSize |
Integer | Hayır | 5000 | Bir yazma işlemi tetiklenmeden önce arabelleğe alınan maksimum kayıt sayısı. |
batchWriteTimeoutMs |
Integer | Hayır | 5000 | Milisaniye cinsinden yazma zaman aşımı. Arabellekteki kayıtlar bu süre içinde bufferSize değerine ulaşmazsa, arabellekteki tüm kayıtlar yazılır. |
batchSize |
Integer | Hayır | 100 | Toplu iş başına yazılan kayıt sayısı. Maksimum: 200. |
ignoreDelete |
Boolean | Hayır | false | Silme işlemlerinin atlanıp atlanmayacağı. |
autoIncrementKey |
String | Hayır | — | Otomatik artan birincil anahtar sütununun adı. Yalnızca hedef tabloda otomatik artan birincil anahtar sütunu varsa yapılandırın. VVR 8.0.4 veya sonraki sürümler gerektirir. |
overwriteMode |
Enum | Hayır | PUT | Yazma modu. PUT: PUT modunda üzerine yaz; UPDATE: UPDATE modunda üzerine yaz. Dinamik sütun modu UPDATE gerektirir. |
defaultTimestampInMillisecond |
Long | Hayır | -1 | Yazmalar için varsayılan zaman damgası. Ayarlanmazsa geçerli sistem saati kullanılır. |
dynamicColumnSink |
Boolean | Hayır | false | Dinamik sütun modunun etkinleştirilip etkinleştirilmeyeceği. Bu modda hiçbir sütun önceden tanımlanmaz; sütunlar çalışma zamanı değerlerine göre eklenir. İlk N sütun birincil anahtarı tanımlar. Sondan ikinci sütun sütun adını, son sütun ise değerini tutar; her ikisi de STRING olmalıdır. Etkinleştirilirse, overwriteMode değeri UPDATE olmalı ve otomatik artan birincil anahtarlar desteklenmez. |
checkSinkTableMeta |
Boolean | Hayır | true | Tablestore tablosunun birincil anahtarının CREATE TABLE deyimi içinde bildirilen birincil anahtarla eşleştiğinin doğrulanıp doğrulanmayacağı. |
enableRequestCompression |
Boolean | Hayır | false | Yazma sırasında istek sıkıştırmasının etkinleştirilip etkinleştirilmeyeceği. |
maxColumnsCount |
Integer | Hayır | 128 | Hedef tabloya yazılan maksimum sütun sayısı. 128'in üzerinde ayarlanırsa The count of attribute columns exceeds the maximum hatası oluşur. VVR 8.0.10 veya sonraki sürümler gerektirir. |
storageType |
String | Hayır | WIDE_COLUMN |
Hedef tablo türü. WIDE_COLUMN: geniş sütunlu tablo; TIMESERIES: zaman serisi tablosu. |
Boyut tablosu seçenekleri
Önbelleğin çalışma şekli
Boyut tablosu önbelleği, Tablestore'a yönelik tekrarlayan aramaları azaltır. Tablo boyutunuza ve sorgu kalıplarınıza göre bir önbellek ilkesi seçin:
None: Önbellek yok. Her arama doğrudan Tablestore'a gider. Verilerin sık değiştiği ve güncelliğin kritik olduğu durumlarda kullanın.
LRU: Son erişilen sabit sayıda kaydı önbelleğe alır. Bir arama önbellekte bulunamazsa, konektör Tablestore'u sorgular ve sonucu önbellekle günceller. Bu ilkeyi kullanırken
cacheSizevecacheTTLMsdeğerlerini ayarlayın.ALL (varsayılan): İş başlamadan önce tüm boyut tablosunu önbelleğe yükler. Sonraki tüm aramalar önbellekten karşılanır. Önbelleğin süresi dolduğunda (
cacheTTLMs), konektör tüm verileri yeniden yükler. Tablo küçükse ve çok sayıda eksik anahtar araması bekliyorsanız ALL kullanın. ALL kullanırken, join düğümünün belleğini artırın; önbellek, uzak tablonun yaklaşık iki katı büyüklükte yer kaplar.
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
retryIntervalMs |
Integer | Hayır | 1000 | Milisaniye cinsinden yeniden deneme aralığı. |
maxRetryTimes |
Integer | Hayır | 10 | Maksimum yeniden deneme sayısı. |
cache |
String | Hayır | ALL | Önbellek ilkesi: None, LRU veya ALL. |
cacheSize |
Integer | Hayır | — | Maksimum önbelleğe alınan kayıt sayısı. cache değeri LRU olduğunda uygulanır. |
cacheTTLMs |
Integer | Hayır | — | Milisaniye cinsinden önbellek TTL'si. LRU için: giriş başına zaman aşımı. ALL için: tam önbellek yenileme aralığı. Süre sonunu devre dışı bırakmak için ayarlamayın. |
cacheEmpty |
Boolean | Hayır | — | Boş (eşleşme yok) sonuçların önbelleğe alınıp alınmayacağı. true: önbelleğe al; false: önbelleğe alma. |
cacheReloadTimeBlackList |
String | Hayır | — | ALL önbelleğinin yenilenmediği zaman pencereleri. Biçim: 2017-10-24 14:00 -> 2017-10-24 15:00, 2017-11-10 23:30 -> 2017-11-11 08:00. Birden fazla pencereyi virgülle ayırın; başlangıç ve bitiş saatleri arasında -> kullanın. |
async |
Boolean | Hayır | false | Eşzamansız aramanın etkinleştirilip etkinleştirilmeyeceği. true: eşzamansız aramalar (sonuçlar sıralı değildir); false: eşzamanlı aramalar. |
Veri türü eşlemeleri
Kaynak tablo
| Tablestore türü | Flink SQL türü |
|---|---|
| INTEGER | BIGINT |
| STRING | STRING |
| BOOLEAN | BOOLEAN |
| DOUBLE | DOUBLE |
| BINARY | BINARY |
Hedef tablo
| Flink SQL türü | Tablestore türü |
|---|---|
| BINARY | BINARY |
| VARBINARY | BINARY |
| CHAR | STRING |
| VARCHAR | STRING |
| TINYINT | INTEGER |
| SMALLINT | INTEGER |
| INTEGER | INTEGER |
| BIGINT | INTEGER |
| FLOAT | DOUBLE |
| DOUBLE | DOUBLE |
| BOOLEAN | BOOLEAN |
Örnekler
Tablestore'dan okuma ve Tablestore'a yazma
Bu örnekte, Tunnel Service aracılığıyla bir Tablestore kaynak tablosundan sipariş verileri okunur ve bir Tablestore hedef tablosuna yazılır. Hedef tablo, otomatik artan bir birincil anahtar sütunu kullanır.
CREATE TEMPORARY TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-source',
'tableName'='flink_source_table',
'tunnelName'='flinksourcestream',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='false',
'skipInvalidData'='false'
);
CREATE TEMPORARY TABLE ots_sink (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR,
PRIMARY KEY (`order`, orderid) NOT ENFORCED
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-sink',
'tableName'='flink_sink_table',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'valueColumns'='customerid,customername',
'autoIncrementKey'='${auto_increment_primary_key_name}'
);
INSERT INTO ots_sink
SELECT `order`, orderid, customerid, customername FROM tablestore_stream;
Geniş sütunlu tabloyu zaman serisi tablosuna senkronize etme
Bu örnekte, geniş sütunlu bir kaynak tablosundan okuma yapılır ve zaman serisi bir hedef tabloya yazılır. Hedef tablonun tags sütunu, etiket anahtar-değer çiftlerini tutmak için MAP<STRING, STRING> kullanır ve storageType değeri TIMESERIES olarak ayarlanır.
CREATE TEMPORARY TABLE timeseries_source (
measurement STRING,
datasource STRING,
tag_a STRING,
`time` BIGINT,
binary_value BINARY,
bool_value BOOLEAN,
double_value DOUBLE,
long_value BIGINT,
string_value STRING,
tag_b STRING,
tag_c STRING,
tag_d STRING,
tag_e STRING,
tag_f STRING
) WITH (
'connector'='ots',
'endPoint'='https://iotstore-test.cn-hangzhou.vpc.tablestore.aliyuncs.com',
'instanceName'='iotstore-test',
'tableName'='test_ots_timeseries_2',
'tunnelName'='timeseries_source_tunnel_2',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='true'
);
CREATE TEMPORARY TABLE timeseries_sink (
measurement STRING,
datasource STRING,
tags MAP<STRING, STRING>,
`time` BIGINT,
binary_value BINARY,
bool_value BOOLEAN,
double_value DOUBLE,
long_value BIGINT,
string_value STRING,
tag_b STRING,
tag_c STRING,
tag_d STRING,
tag_e STRING,
tag_f STRING,
PRIMARY KEY (measurement, datasource, tags, `time`) NOT ENFORCED
) WITH (
'connector'='ots',
'endPoint'='https://iotstore-test.cn-hangzhou.vpc.tablestore.aliyuncs.com',
'instanceName'='iotstore-test',
'tableName'='test_timeseries_sink_table_2',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'storageType'='TIMESERIES'
);
-- Build the tags map from individual tag columns and insert into the time series sink table
INSERT INTO timeseries_sink
SELECT
measurement,
datasource,
MAP['tag_a', tag_a, 'tag_b', tag_b, 'tag_c', tag_c, 'tag_d', tag_d, 'tag_e', tag_e, 'tag_f', tag_f] AS tags,
`time`,
binary_value,
bool_value,
double_value,
long_value,
string_value,
tag_b,
tag_c,
tag_d,
tag_e,
tag_f
FROM timeseries_source;