DataHub connector, akış verilerini Alibaba Cloud DataHub'dan Flink işlerine okumanızı ve işlenmiş sonuçları tekrar DataHub konularına yazmanızı sağlar. Hem Flink SQL hem de DataStream API'yi destekler.
DataHub, Kafka protokolüyle uyumludur. Flink'i Kafka protokolü üzerinden DataHub'a bağlamak için Upsert Kafka connector yerine standart Kafka connector kullanın. Ayrıntılar için bkz.
.
Özellikler
| Öğe | Açıklama |
|---|---|
| Desteklenen tür | Kaynak ve havuz (source and sink) |
| Çalıştırma modu | Akış ve toplu iş |
| Veri biçimi | Yok |
| Ölçümler | Yok |
| API türü | DataStream ve SQL |
| Havuzda veri güncelleme/silme desteği | Desteklenmez. Havuz, hedef konuya yalnızca ekleme (insert-only) satırları yazar. |
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bir DataHub projesi ve konusu. Bkz. DataHub ile çalışmaya başlayın.
Bir DataHub aboneliği (kaynak için gereklidir). Bkz. Abonelik oluşturun.
Bir Alibaba Cloud AccessKey ID'si ve AccessKey secret'ı. Bkz. Konsol işlemleri.
Sınırlamalar
Toplu işle bir DataHub kaynak tablosunu okumanız önerilmez. Toplu modda, bir DataHub kaynak tablosu tamamlanmış durumuna ulaşamaz ve iş tamamlanmak yerine beklemeye devam eder.
Söz dizimi
CREATE TEMPORARY TABLE datahub_input (
`time` BIGINT,
`sequence` STRING METADATA VIRTUAL,
`shard-id` BIGINT METADATA VIRTUAL,
`system-time` TIMESTAMP METADATA VIRTUAL
) WITH (
'connector' = 'datahub',
'subId' = '<yourSubId>',
'endPoint' = '<yourEndPoint>',
'project' = '<yourProjectName>',
'topic' = '<yourTopicName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}'
);
Connector seçenekleri
Genel
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
| connector | String | Evet | (yok) | Connector türü. Bu değeri datahub olarak ayarlayın. |
| endPoint | String | Evet | (yok) | DataHub projesinin uç noktası. Değer bölgeye göre değişir. Bkz. Uç noktalar. |
| project | String | Evet | (yok) | DataHub proje adı. |
| topic | String | Evet | (yok) | DataHub konu adı. BLOB konuları (türü belirtilmemiş, yapılandırılmamış veriler) için Flink tablosunda tam olarak bir VARBINARY sütunu bulunmalıdır. |
| accessId | String | Evet | (yok) | Alibaba Cloud hesabınızın AccessKey ID'si. Sabit kodlamak yerine bir değişken olarak saklayın. Bkz. Değişkenleri yönetin. |
| accessKey | String | Evet | (yok) | Alibaba Cloud hesabınızın AccessKey secret'ı. |
| retryTimeout | Integer | Hayır | 1800000 | Bir yeniden deneme girişimi için maksimum zaman aşımı (milisaniye cinsinden). |
| retryInterval | Integer | Hayır | 1000 | Yeniden deneme girişimleri arasındaki süre (milisaniye cinsinden). |
| CompressType | String | Hayır | lz4 | Okuma ve yazma işlemleri için sıkıştırma algoritması. Geçerli değerler: lz4, deflate, "" (devre dışı). VVR 6.0.5 veya sonraki sürümler gerektirir. |
Kaynağa özel
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
| subId | String | Evet | (yok) | DataHub abonelik kimliği. |
| maxFetchSize | Integer | Hayır | 50 | İstek başına getirilen kayıt sayısı. Okuma aktarım hızını artırmak için bu değeri artırın. |
| maxBufferSize | Integer | Hayır | 50 | Eşzamansız okumalardan önbelleğe alınan maksimum kayıt sayısı. Okuma aktarım hızını artırmak için bu değeri artırın. |
| fetchLatestDelay | Integer | Hayır | 500 | Veri olmadığında bekleme süresi (milisaniye cinsinden). Düşük trafikli konularda okuma gecikme süresini azaltmak için bu değeri düşürün. |
| lengthCheck | String | Hayır | NONE | Ayrıştırılan alan sayısının tanımlanan sütun sayısıyla eşleşmediği satırları işlemek için kullanılan kural. Geçerli değerler: NONE, SKIP, EXCEPTION, PAD. Bkz. Alan sayısı doğrulama kuralları. |
| columnErrorDebug | Boolean | Hayır | false | Alan ayrıştırma hataları için hata ayıklama günlüğünün etkinleştirilip etkinleştirilmeyeceğini belirtir. Ayrıştırma istisna günlüklerini yazdırmak için true olarak ayarlayın. |
| startTime | String | Hayır | (yok) | Tüketimin başlayacağı zaman damgası. Biçim: yyyy-MM-dd hh:mm:ss. |
| endTime | String | Hayır | (yok) | Tüketimin duracağı zaman damgası. Biçim: yyyy-MM-dd hh:mm:ss. |
| startTimeMs | Long | Hayır | -1 | Tüketimin başlayacağı zaman damgası (milisaniye cinsinden). startTime seçeneğine göre önceliklidir. Bkz. Tüketim başlangıç konumu. |
Tüketim başlangıç konumu
startTimeMs seçeneği, kaynağın okumaya nereden başlayacağını kontrol eder:
-1 (varsayılan): Konudaki en son ofsetten başlar. Ofset yoksa en eski ofsete geri döner.
Belirli bir zaman damgası: Belirtilen zaman damgasında veya sonrasında bulunan ilk kayıttan başlar.
-1 varsayılan değeri veri kaybına neden olabilir. İşiniz ilk kontrol noktasından önce başarısız olursa, konudaki en son ofset ilerlemiş olabilir ve bu pencere sırasında yazılan kayıtlar atlanır. Başlangıç konumunu kontrol etmek için startTimeMs değerini açıkça belirli bir zaman damgasına ayarlayın.
Alan sayısı doğrulama kuralları
lengthCheck seçeneği, bir satırdaki ayrıştırılan alan sayısının tanımlanan sütun sayısıyla eşleşmediğinde ne olacağını belirler:
| Değer | Davranış |
|---|---|
NONE (varsayılan) |
Ayrıştırılan alanlar > tanımlanan sütunlar ise: Tanımlanan sayıya kadar soldan sağa okur. Ayrıştırılan alanlar < tanımlanan sütunlar ise: Satırı atlar. |
SKIP |
Ayrıştırılan alan sayısı tanımlanan sütun sayısından farklı olan satırları atlar. |
EXCEPTION |
Ayrıştırılan alan sayısı tanımlanan sütun sayısından farklı olduğunda bir istisna fırlatır. |
PAD |
Soldan sağa okur. Ayrıştırılan alanlar > tanımlanan sütunlar ise: Tanımlanan sayıya kadar soldan sağa okur. Ayrıştırılan alanlar < tanımlanan sütunlar ise: Eksik alanları null ile doldurur. |
Havuza özel
| Seçenek | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
| batchCount | Integer | Hayır | 500 | Yazma partisi başına maksimum satır sayısı. |
| batchSize | Integer | Hayır | 512000 | Yazma partisinin maksimum boyutu (bayt cinsinden). |
| flushInterval | Integer | Hayır | 5000 | Flush aralığı (milisaniye cinsinden). |
| hashFields | String | Hayır | null | Satırları parçalara yönlendirmek için kullanılan virgülle ayrılmış sütun adı listesi. Bu sütunlarda aynı değerlere sahip satırlar aynı parçaya yazılır. Varsayılan (null) rastgele yazma kullanır. Örnek: hashFields=a,b. |
| timeZone | String | Hayır | (yok) | TIMESTAMP alanlarını dönüştürürken kullanılan saat dilimi. |
| schemaVersion | Integer | Hayır | -1 | Kayıtlı şema kayıt defterindeki şema sürümü. |
Yazma partisi flush davranışı
Aşağıdaki koşullardan herhangi biri ilk olarak karşılandığında yazma partisi DataHub'a flush edilir:
Arabelleğe alınan satır sayısı
batchCountdeğerine ulaştığında.Arabelleğe alınan verilerin toplam boyutu
batchSizedeğerine ulaştığında.Son flush'tan bu yana geçen süre
flushIntervaldeğerini aştığında.
batchCount, batchSize veya flushInterval değerlerini artırmak, daha yüksek gecikme süresi pahasına yazma aktarım hızını iyileştirir.
Veri türü eşlemeleri
| Flink türü | DataHub türü |
|---|---|
| TINYINT | TINYINT |
| BOOLEAN | BOOLEAN |
| INTEGER | INTEGER |
| BIGINT | BIGINT |
| BIGINT | TIMESTAMP |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| DECIMAL | DECIMAL |
| VARCHAR | STRING |
| SMALLINT | SMALLINT |
| VARBINARY | BLOB |
Meta veriler
Meta veri alanları salt okunurdur (R). Bunları sorgulara dahil etmek ancak DataHub'a geri yazmamak için kaynak tablo tanımında METADATA VIRTUAL olarak bildirin.
Meta veri alanları yalnızca VVR 3.0.1 veya sonraki sürümler kullanılırken mevcuttur.
| Anahtar | Veri türü | Açıklama | R/W |
|---|---|---|---|
| shard-id | BIGINT METADATA VIRTUAL | Kaydın parça kimliği. | R |
| sequence | STRING METADATA VIRTUAL | Kaydın parça içindeki sıra numarası. | R |
| system-time | TIMESTAMP METADATA VIRTUAL | DataHub'ın kaydı aldığı saat. | R |
Örnekler
Kaynak
Aşağıdaki örnek, bir DataHub konusundan veri okur ve konsola yazdırır.
CREATE TEMPORARY TABLE datahub_input (
`time` BIGINT,
`sequence` STRING METADATA VIRTUAL,
`shard-id` BIGINT METADATA VIRTUAL,
`system-time` TIMESTAMP METADATA VIRTUAL
) WITH (
'connector' = 'datahub',
'subId' = '<yourSubId>',
'endPoint' = '<yourEndPoint>',
'project' = '<yourProjectName>',
'topic' = '<yourTopicName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}'
);
CREATE TEMPORARY TABLE test_out (
`time` BIGINT,
`sequence` STRING,
`shard-id` BIGINT,
`system-time` TIMESTAMP
) WITH (
'connector' = 'print',
'logger' = 'true'
);
INSERT INTO test_out
SELECT
`time`,
`sequence`,
`shard-id`,
`system-time`
FROM datahub_input;
Havuz
Aşağıdaki örnek, bir DataHub konusundan okur, name alanını küçük harfe dönüştürür ve sonuçları başka bir DataHub konusuna yazar.
CREATE TEMPORARY TABLE datahub_source (
name VARCHAR
) WITH (
'connector' = 'datahub',
'endPoint' = '<endPoint>',
'project' = '<yourProjectName>',
'topic' = '<yourTopicName>',
'subId' = '<yourSubId>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'startTime' = '2018-06-01 00:00:00'
);
CREATE TEMPORARY TABLE datahub_sink (
name VARCHAR
) WITH (
'connector' = 'datahub',
'endPoint' = '<endPoint>',
'project' = '<yourProjectName>',
'topic' = '<yourTopicName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'batchSize' = '512000',
'batchCount' = '500'
);
INSERT INTO datahub_sink
SELECT
LOWER(name)
FROM datahub_source;
DataStream API
DataHub ile DataStream API'yi kullanmak için Realtime Compute for Apache Flink üzerinde bir DataStream connector yapılandırın. Bkz. DataStream connector'ların ayarları.
DataHub'dan okuyun
VVR, Flink'in SourceFunction arabirimini uygulayan DatahubSourceFunction sınıfını sağlar.
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// Configure the DataHub source
DatahubSourceFunction datahubSource =
new DatahubSourceFunction(
<yourEndPoint>,
<yourProjectName>,
<yourTopicName>,
<yourSubId>,
<yourAccessId>,
<yourAccessKey>,
"public",
<yourStartTime>,
<yourEndTime>
);
datahubSource.setRequestTimeout(30 * 1000);
datahubSource.enableExitAfterReadFinished();
env.addSource(datahubSource)
.map((MapFunction<RecordEntry, Tuple2<String, Long>>) this::getStringLongTuple2)
.print();
env.execute();
private Tuple2<String, Long> getStringLongTuple2(RecordEntry recordEntry) {
Tuple2<String, Long> tuple2 = new Tuple2<>();
TupleRecordData recordData = (TupleRecordData) (recordEntry.getRecordData());
tuple2.f0 = (String) recordData.getField(0);
tuple2.f1 = (Long) recordData.getField(1);
return tuple2;
}
DataHub'a yazın
VVR, DatahubSinkFunction arabirimini uygulayan OutputFormatSinkFunction sınıfını sağlar.
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Configure the DataHub sink
env.generateSequence(0, 100)
.map((MapFunction<Long, RecordEntry>) aLong -> getRecordEntry(aLong, "default:"))
.addSink(
new DatahubSinkFunction<>(
<yourEndPoint>,
<yourProjectName>,
<yourTopicName>,
<yourSubId>,
<yourAccessId>,
<yourAccessKey>,
"public",
<schemaVersion> // If schema registry is enabled, you must specify the schema version. Otherwise, set this to 0.
)
);
env.execute();
private RecordEntry getRecordEntry(Long message, String s) {
RecordSchema recordSchema = new RecordSchema();
recordSchema.addField(new Field("f1", FieldType.STRING));
recordSchema.addField(new Field("f2", FieldType.BIGINT));
recordSchema.addField(new Field("f3", FieldType.DOUBLE));
recordSchema.addField(new Field("f4", FieldType.BOOLEAN));
recordSchema.addField(new Field("f5", FieldType.TIMESTAMP));
recordSchema.addField(new Field("f6", FieldType.DECIMAL));
RecordEntry recordEntry = new RecordEntry();
TupleRecordData recordData = new TupleRecordData(recordSchema);
recordData.setField(0, s + message);
recordData.setField(1, message);
recordEntry.setRecordData(recordData);
return recordEntry;
}
Maven bağımlılığı
DataHub DataStream connector'ını projenize ekleyin. Kullanılabilir tüm sürümler Maven merkezi deposunda listelenmiştir.
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-datahub</artifactId>
<version>${vvr-version}</version>
</dependency>
Sonraki adımlar
Realtime Compute for Apache Flink tarafından desteklenen connector'ların tam listesi için bkz. Desteklenen connector'lar.
Bunun yerine Kafka connector'ını kullanarak DataHub'a bağlanmak için bkz. Message Queue for Apache Kafka.