MaxCompute bağlayıcısı, Alibaba Cloud'un tam yönetilen, eksabayt ölçekli veri ambarı platformu MaxCompute (eski adıyla ODPS) ile doğrudan Flink SQL ve DataStream işlerinden veri okumanızı ve yazmanızı sağlar.
Özellikler
| Öğe | Açıklama |
|---|---|
| Tablo türleri | Kaynak tablosu, boyut tablosu, havuz tablosu ve veri alımı havuzu |
| Çalıştırma modları | Akış modu ve toplu iş modu |
| API türleri | DataStream API, SQL API ve veri alımı YAML işleri |
| Anlambilim | En az bir kez (At-least-once) |
| Havuz tablosunda veri güncelleme veya silme | Toplu İş Tüneli veya Akış Tüneli: yalnızca ekleme. Upsert Tüneli: ekleme, güncelleme ve silme. |
Önkoşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Bir MaxCompute tablosu. Bkz. Tablo oluşturma.
Sınırlamalar
Bağlayıcı yalnızca en az bir kez anlambilimini destekler. Kullandığınız tünele bağlı olarak MaxCompute'te yinelenen kayıtlar görünebilir. Tünel seçimi hakkında rehberlik için Yukarı ve aşağı akış depolama hakkında SSS bölümündeki "Veri tünelini nasıl seçerim?" kısmına bakın.
Varsayılan olarak bir kaynak tam modda çalışır: Yalnızca
partitionseçeneğiyle belirtilen bölümden okur. Tüm veriler okunduktan sonra iş sonlanır ve yeni bölümleri izlemeye devam etmez. Yeni bölümleri sürekli olarak izlemek içinstartPartitionkullanarak bir artımlı kaynak yapılandırın.Boyut tablosunun önbelleği her yenilendiğinde tablo en son bölümü kontrol eder. Kaynak başladıktan sonra, zaten okunan bir bölüme yeni eklenen verileri okumaz; dağıtımı yalnızca bölümde tam veriler bulunduğunda çalıştırın.
Tünel seçin
MaxCompute, Flink'ten veri yazmak için üç tünel sağlar. Kullanım durumunuza göre seçim yapın:
| Tünel | Varsayılan | Ne zaman kullanılır |
|---|---|---|
| MaxCompute Batch Tunnel | Evet (useStreamTunnel=false, enableUpsert=false) |
Toplu yüklemeler; veriler yalnızca checkpointing sonrası kullanılabilir hale gelir. Zamanlanmış flush işlemini devre dışı bırakmak için flushIntervalMs=0 ayarlayın. |
| MaxCompute Streaming Tunnel | Hayır (useStreamTunnel=true) |
Neredeyse gerçek zamanlı veri alımı; flush edilen veriler MaxCompute'te anında kullanılabilir hale gelir. |
| MaxCompute Upsert Tunnel | Hayır (enableUpsert=true) |
MaxCompute Delta tablosunda INSERT, UPDATE ve DELETE işlemleri. VVR 8.0.6+ gerektirir. |
Ayrıntılı karşılaştırma için Yukarı ve aşağı akış depolama hakkında SSS içindeki "Veri tünelini nasıl seçerim?" bölümüne bakın.
SQL
MaxCompute bağlayıcısı, SQL tabanlı işlerde kaynak, boyut veya havuz tablosu olarak kullanılabilir.
Söz dizimi
CREATE TEMPORARY TABLE odps_source(
id INT,
user_name VARCHAR,
content VARCHAR
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'schemaName' = '<yourSchemaName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds=2018****'
);
Bağlayıcı seçenekleri
Genel seçenekler
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
connector |
Evet | — | STRING | odps olarak ayarlayın. |
endpoint |
Evet | — | STRING | MaxCompute uç noktası. Bkz. Uç nokta. |
tunnelEndpoint |
Hayır | — | STRING | MaxCompute Tunnel uç noktası. Belirtilmezse MaxCompute, tünel bağlantılarını Server Load Balancer (SLB) aracılığıyla tahsis eder. |
project |
Evet | — | STRING | MaxCompute proje adı. |
schemaName |
Hayır | — | STRING | Yalnızca MaxCompute şema özelliği etkinleştirildiğinde gereklidir. Bunu tablonun şema adına ayarlayın. Bkz. Şema işlemleri. VVR 8.0.6+. |
tableName |
Evet | — | STRING | MaxCompute tablo adı. |
accessId |
Evet | — | STRING |
MaxCompute'e erişmek için kullanılan AccessKey ID. Bkz.
AccessKey ID'mi ve AccessKey secret'ımı nasıl görüntülerim?
Önemli
AccessKey ID'yi değişken olarak saklayın. Bkz. Değişkenleri yönetin. |
accessKey |
Evet | — | STRING | MaxCompute'e erişmek için kullanılan AccessKey secret. |
partition |
Hayır | — | STRING | MaxCompute tablosundaki bölüm adı. Bölümlenmemiş tablolar veya artımlı kaynaklar için gerekli değildir. Yukarı ve aşağı akış depolama hakkında SSS içindeki "Partition seçeneğini nasıl yapılandırırım?" bölümüne bakın. |
compressAlgorithm |
Hayır | SNAPPY |
STRING | MaxCompute Tunnel için sıkıştırma algoritması. Geçerli değerler: RAW (sıkıştırma yok), ZLIB, SNAPPY. SNAPPY, test senaryolarında ZLIB'e kıyasla aktarım hızını yaklaşık %50 artırır. |
quotaName |
Hayır | — | STRING | Özel MaxCompute Tunnel kaynak grupları için kota adı. VVR 8.0.3+. Bu parametre yalnızca endpoint bir VPC adresine ayarlandığında etkili olur. Genel bir uç nokta kullanılıyorsa veya tunnelEndpoint belirtilmişse bu parametre etkili olmaz. |
Kaynak seçenekleri
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
maxPartitionCount |
Hayır | 100 |
INTEGER | Okunacak maksimum bölüm sayısı. Aşılırsa "The number of matched partitions exceeds the default limit" hatası oluşur. Çok fazla bölümden okumak MaxCompute'i aşırı yükleyebilir ve iş başlatmayı yavaşlatabilir; bu değeri yalnızca iş yükünüz gerektirdiğinde artırın. |
useArrow |
Hayır | false |
BOOLEAN | MaxCompute depolama API'sini çağıran Arrow biçimini kullanarak veri okuyun. Yalnızca toplu iş dağıtımları. VVR 8.0.8+. |
splitSize |
Hayır | 256 MB |
MEMORYSIZE | Arrow biçimi kullanırken parça başına çekilen veri miktarı. Yalnızca toplu iş dağıtımları. VVR 8.0.8+. |
compressCodec |
Hayır | "" (yok) |
STRING | Arrow biçimiyle okurken kullanılan sıkıştırma algoritması. Geçerli değerler: "" (yok), ZSTD, LZ4_FRAME. Bir codec belirtmek, sıkıştırma olmamasına kıyasla aktarım hızını artırır. Yalnızca toplu iş dağıtımları. VVR 8.0.8+. |
dynamicLoadBalance |
Hayır | false |
BOOLEAN | İşleme performansını artırmak ve genel okuma süresini azaltmak için dinamik parça atamayı etkinleştirin. Bu, farklı operatörlerin tutarsız miktarda veri okumasına neden olabileceğinden veri eğrilmesine yol açabilir. Yalnızca toplu iş dağıtımları. VVR 8.0.8+. |
Artımlı kaynak seçenekleri
Artımlı kaynak, yeni bölümleri keşfetmek için MaxCompute'i aralıklı olarak yoklar. Yeni bir bölümü okumadan önce, o bölüme yapılan tüm veri yazma işlemlerinin tamamlanmış olması gerekir. Ayrıntılar için Yukarı ve aşağı akış depolama hakkında SSS içindeki "Artımlı bir kaynak veri yazılırken yeni bir bölüm algılarsa ne yapmalıyım?" bölümüne bakın.
Bölüm sıralaması: Kaynak, alfabetik sırası startPartition değerine eşit veya ondan büyük olan bölümleri okur. Örneğin, year=2023,month=10 alfabetik olarak year=2023,month=9 değerinden önce gelir; doğru sıralamayı sağlamak için ay değerlerini sıfırla doldurun (year=2023,month=9 yerine year=2023,month=09 kullanın).
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
startPartition |
Evet | — | STRING | Artımlı okumalar için başlangıç bölümü. Belirtildiğinde partition yoksayılır. Çok düzeyli bölümlenmiş tablolar için bölüm sütunu değerlerini düzeye göre azalan sırada yapılandırın. Yukarı ve aşağı akış depolama hakkında SSS içindeki "startPartition nasıl yapılandırılır?" bölümüne bakın. |
subscribeIntervalInSec |
Hayır | 30 |
INTEGER | Yoklama aralığı (saniye). |
modifiedTableOperation |
Hayır | NONE |
Enum | Okuma sırasında bir bölüm değiştirildiğinde gerçekleştirilecek eylem. İndirme oturumları checkpoint'lerde kaydedilir; bir oturum başladıktan sonra bir bölümdeki veriler değişirse checkpoint'ten devam etmek başarısız olur ve dağıtım tekrar tekrar yeniden başlar. Geçerli değerler: NONE — kullanılamayan bölümü atlamak ve durumu olmadan yeniden başlatmak için startPartition değerini güncelleyin; SKIP — devam ederken kullanılamayan bölümü otomatik olarak atlayın. VVR 8.0.3+. Her iki değer de ayarlanırsa, değiştirilen bölümden zaten okunan veriler korunur; okunmamış veriler atılır. |
Havuz seçenekleri
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
useStreamTunnel |
Hayır | false |
BOOLEAN | Batch Tunnel yerine MaxCompute Streaming Tunnel kullanın. true: Streaming Tunnel; false: Batch Tunnel. Bkz. Tünel seçin. |
flushIntervalMs |
Hayır | 30000 (30 sn) |
LONG | Tünel yazarı arabelleği için flush aralığı (milisaniye). Streaming Tunnel için: flush edilen veriler anında kullanılabilir hale gelir. Batch Tunnel için: veriler yalnızca checkpointing sonrası kullanılabilir hale gelir; zamanlanmış flush işlemini devre dışı bırakmak için 0 olarak ayarlayın. flushIntervalMs veya batchSize değerlerinden birine ulaşıldığında tetiklenir. |
batchSize |
Hayır | 67108864 (64 MB) |
LONG | Bayt cinsinden arabellek boyutu. Arabellek bu boyuta ulaştığında veriler flush edilir. batchSize veya flushIntervalMs değerlerinden birine ulaşıldığında tetiklenir. |
numFlushThreads |
Hayır | 1 |
INTEGER | Tünel yazarı arabelleğini flush etmek için kullanılan iş parçacığı sayısı. 1'den büyük değerler, bölümler arasında eşzamanlı flush işlemlerine izin verir. |
slotNum |
Hayır | 0 |
INTEGER | Flink'ten veri almak için kullanılan Tunnel slot sayısı. Slot sınırları için Veri aktarım hizmetine genel bakış konusuna bakın. |
dynamicPartitionLimit |
Hayır | 100 |
INTEGER | İki checkpoint arasında yazılan dinamik bölüm sayısı üst sınırı. Aşılırsa "Too many dynamic partitions" hatası oluşur. Çok fazla bölüme yazmak MaxCompute üzerindeki yükü artırır ve checkpointing işlemini yavaşlatır; bu değeri yalnızca iş yükünüz gerektirdiğinde artırın. |
retryTimes |
Hayır | 3 |
INTEGER | MaxCompute sunucu istekleri (oturum oluşturma, gönderme veya flush hataları) için maksimum yeniden deneme sayısı. |
sleepMillis |
Hayır | 1000 |
INTEGER | Yeniden deneme aralığı (milisaniye). |
enableUpsert |
Hayır | false |
BOOLEAN | MaxCompute Upsert Tunnel kullanın. true: INSERT, UPDATE_AFTER ve DELETE kayıtlarını işler; false: useStreamTunnel tarafından belirtilen tüneli kullanır. VVR 8.0.6+. Havuz, upsert modunda oturum commitleri sırasında hatalarla veya uzun süren arızalarla karşılaşırsa havuz operatörü paralelliğini 10 veya daha düşük bir değere ayarlayın. |
upsertAsyncCommit |
Hayır | false |
BOOLEAN | Upsert oturumlarını commit ederken asenkron mod kullanın. Asenkron mod commit süresini azaltır ancak commit edilen veriler hemen sorgulanamaz hale gelir. VVR 8.0.6+. |
upsertCommitTimeoutMs |
Hayır | 120000 (120 sn) |
INTEGER | Upsert oturumu commitleri için zaman aşımı (milisaniye). VVR 8.0.6+. |
sink.operation |
Hayır | insert |
STRING | Delta tablosu için yazma modu. insert: ekleme modu; upsert: güncelleme modu. VVR 8.0.10+. |
sink.parallelism |
Hayır | — | INTEGER | Delta tablosu için yazma paralelliği. Varsayılan olarak yukarı akış paralelliğine eşittir. Optimal yazma performansı ve bellek verimliliği için write.bucket.num değeri sink.parallelism değerinin tam katı olmalıdır. VVR 8.0.10+. |
sink.file-cached.enable |
Hayır | false |
BOOLEAN | Delta tablosunun dinamik bölümlerine yazarken dosya önbellek modunu etkinleştirin. Sunucuya yazılan küçük dosya sayısını azaltır ancak yazma gecikmesini artırır. Havuzun yüksek paralellik gösterdiği durumlarda etkinleştirin. VVR 8.0.10+. |
sink.file-cached.writer.num |
Hayır | 16 |
INTEGER | Dosya önbellek modunda görev başına eşzamanlı yükleme iş parçacığı sayısı. Bu değeri çok yüksek ayarlamaktan kaçının; aynı anda çok fazla bölüme yazmak bellek yetersizliği (OOM) hatalarına neden olabilir. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.bucket.check-interval |
Hayır | 60000 |
INTEGER | Dosya önbellek modunda dosya boyutu kontrol aralığı (milisaniye). Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.file-cached.rolling.max-size |
Hayır | 16 MB |
MEMORYSIZE | Tek bir önbelleğe alınmış dosyanın maksimum boyutu. Aşıldığında veriler sunucuya yüklenir. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.file-cached.memory |
Hayır | 64 MB |
MEMORYSIZE | Dosya önbellek modunda dosya yazmaları için maksimum yığın dışı bellek. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.file-cached.memory.segment-size |
Hayır | 128 KB |
MEMORYSIZE | Dosya önbellek modunda dosya yazmaları için arabellek segment boyutu. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.file-cached.flush.always |
Hayır | true |
BOOLEAN | Dosya önbellek modunda dosya yazarken önbelleğin kullanılıp kullanılmayacağı. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
sink.file-cached.write.max-retries |
Hayır | 3 |
INTEGER | Dosya önbellek modunda veri yüklemeleri için yeniden deneme sayısı. Yalnızca sink.file-cached.enable=true olduğunda etkilidir. VVR 8.0.10+. |
upsert.writer.max-retries |
Hayır | 3 |
INTEGER | Upsert Writer oturumunda bir pakete yazma işlemi için maksimum yeniden deneme sayısı. VVR 8.0.10+. |
upsert.writer.buffer-size |
Hayır | 64 MB |
MEMORYSIZE | Upsert Writer oturumundaki tüm paketler genelinde toplam arabellek boyutu. Toplam bu eşiğe ulaştığında veriler flush edilir. Yazma verimliliğini artırmak için artırın; çok fazla bölüme yazmak OOM hatalarına neden oluyorsa azaltın. VVR 8.0.10+. |
upsert.writer.bucket.buffer-size |
Hayır | 1 MB |
MEMORYSIZE | Upsert Writer oturumunda paket başına arabellek boyutu. Flink sunucusu belleği yetersizse azaltın. VVR 8.0.10+. |
upsert.write.bucket.num |
Evet | — | INTEGER | Hedef Delta tablosu için paket sayısı. Delta tablosunda yapılandırılan write.bucket.num değeriyle eşleşmelidir. VVR 8.0.10+. |
upsert.write.slot-num |
Hayır | 1 |
INTEGER | Upsert oturumu başına Tunnel slotu. VVR 8.0.10+. |
upsert.commit.max-retries |
Hayır | 3 |
INTEGER | Upsert oturumu commitleri için maksimum yeniden deneme sayısı. VVR 8.0.10+. |
upsert.commit.thread-num |
Hayır | 16 |
INTEGER | Upsert oturumu commitleri için paralellik. Büyük değerlerden kaçının; aşırı eşzamanlı commitler kaynak tüketimini artırır ve performans sorunlarına neden olabilir. VVR 8.0.10+. |
upsert.commit.timeout |
Hayır | 600 |
INTEGER | Upsert oturumu commitleri için zaman aşımı (saniye). VVR 8.0.10+. |
upsert.flush.concurrent |
Hayır | 2 |
INTEGER | Bölüm başına maksimum eşzamanlı paket flush sayısı. Her paket flush işlemi bir Tunnel slotu kaplar. VVR 8.0.10+. |
insert.commit.thread-num |
Hayır | 16 |
INTEGER | Insert oturumu commitleri için paralellik. VVR 8.0.10+. |
insert.arrow-writer.enable |
Hayır | false |
BOOLEAN | Insert işlemleri için Arrow biçimini kullanın. VVR 8.0.10+. |
insert.arrow-writer.batch-size |
Hayır | 512 |
INTEGER | Arrow biçimli toplu iş başına maksimum satır sayısı. VVR 8.0.10+. |
insert.arrow-writer.flush-interval |
Hayır | 100000 |
INTEGER | Yazar flush aralığı (milisaniye). VVR 8.0.10+. |
insert.writer.buffer-size |
Hayır | 64 MB |
MEMORYSIZE | Arabellekli yazar için önbellek boyutu. VVR 8.0.10+. |
upsert.partial-column.enable |
Hayır | false |
BOOLEAN | Yalnızca belirtilen sütunları güncelleyin (kısmi sütun güncellemesi). Yalnızca Delta tablosu havuzları için geçerlidir. Bkz. Belirli sütunlardaki verileri güncelleme. true olduğunda: Aynı birincil anahtara sahip bir kayıt varsa belirtilen null olmayan alanların üzerine yazılır; eşleşen bir kayıt yoksa belirtilen sütunlar için yeni değerlerle ve belirtilmemiş tüm sütunlar için null değerlerle yeni bir kayıt eklenir. VVR 8.0.11+. |
Boyut tablosu seçenekleri
Dağıtım başladığında boyut tablosu partition ile belirtilen bölümden tüm verileri yükler. partition seçeneği max_pt() işlevini destekler. Önbellek yeniden yüklendiğinde en son bölüm tekrar okunur. İki bölümden veri yüklemek için partition değerini max_two_pt() olarak ayarlayın.
Boyut tablolarıcache=ALLgerektirir . Birleşim düğümü belleğini uzak tablo verisi boyutunun en az dört katına çıkarın. Büyük boyut tabloları için verileri eşit şekilde dağıtmak amacıylaSHUFFLE_HASHipucunu kullanın. Sık Java Sanal Makinesi (JVM) çöp toplama (GC) işlemlerine neden olan çok büyük tablolar için LRU (En Az Son Kullanılan) önbellek ilkesiyle bir anahtar-değer boyut tablosuna dönüştürün; örneğin, bir ApsaraDB for HBase boyut tablosu.
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
cache |
Evet | — | STRING | Önbellek ilkesi. ALL olarak ayarlanmalı ve DDL ifadesinde açıkça bildirilmelidir. Dağıtım çalıştırılmadan önce tüm boyut tablosu verileri önbelleğe yüklenir. Sonraki aramalar yalnızca önbellekte yapılır. Girişlerin süresi dolduktan sonra önbellek yeniden yüklenir. |
cacheSize |
Hayır | 100000 |
LONG | Önbelleğe alınacak maksimum satır sayısı. Aşılırsa "Row count of table <table-name> partition <partition-name> exceeds maxRowCount limit" hatası oluşur. Büyük önbellekler önemli JVM yığın belleği tüketir ve başlatma ile önbellek yenilemeyi yavaşlatır; bu değeri yalnızca iş yükünüz gerektirdiğinde artırın. |
cacheTTLMs |
Hayır | Long.MAX_VALUE |
LONG | Önbellek zaman aşımı (milisaniye). |
cacheReloadTimeBlackList |
Hayır | — | STRING | Önbelleğin yenilenmediği zaman dilimleri. Önbellek yenilemelerinden kaynaklanan dağıtım kararsızlığını önlemek için yoğun trafik dönemlerinde (promosyon etkinlikleri gibi) kullanın. Yukarı ve aşağı akış depolama hakkında SSS içindeki "cacheReloadTimeBlackList nasıl yapılandırılır?" bölümüne bakın. |
maxLoadRetries |
Hayır | 10 |
INTEGER | Dağıtım başlatıldığında ilk önbellek yükleme için maksimum yeniden deneme sayısı. Yeniden denemeler tükenirse dağıtım başarısız olur. |
Veri türü eşlemeleri
MaxCompute veri türlerinin tam listesi için bkz. MaxCompute veri türü sistemi sürüm 2.0.
| MaxCompute türü | Flink türü |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | TINYINT |
| SMALLINT | SMALLINT |
| INT | INTEGER |
| BIGINT | BIGINT |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| DECIMAL(precision, scale) | DECIMAL(precision, scale) |
| CHAR(n) | CHAR(n) |
| VARCHAR(n) | VARCHAR(n) |
| STRING | STRING |
| BINARY | BYTES |
| DATE | DATE |
| DATETIME | TIMESTAMP(3) |
| TIMESTAMP | TIMESTAMP(9) |
| TIMESTAMP_NTZ | TIMESTAMP(9) |
| ARRAY | ARRAY |
| MAP | MAP |
| STRUCT | ROW |
| JSON | STRING |
| VECTOR | VECTOR |
Bir MaxCompute fiziksel tablosu iç içe geçmiş bileşik tür alanları (ARRAY, MAP veya STRUCT) veya bir JSON alanı içeriyorsa, Realtime Compute for Apache Flink'in verileri doğru şekilde okuyup yazabilmesi için tabloyu oluştururken tblproperties('columnar.nested.type'='true') ayarlayın.
Flink CDC (genel önizleme)
MaxCompute bağlayıcısı, YAML tabanlı işlerde havuz olarak Change Data Capture (CDC) verilerini alabilir. VVR 11.1+ gerektirir.
Söz dizimi
source:
type: xxx
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
Yapılandırma seçenekleri
| Seçenek | Gerekli | Varsayılan | Tür | Açıklama |
|---|---|---|---|---|
type |
Evet | — | String | maxcompute olarak ayarlayın. |
name |
Hayır | — | String | Havuz adı. |
access-id |
Evet | — | String | Alibaba Cloud hesabınızın veya RAM kullanıcınızın AccessKey ID'si. Resource Access Management (RAM) konsolu üzerinden edinin. |
access-key |
Evet | — | String | AccessKey secret. |
endpoint |
Evet | — | String | MaxCompute uç noktası. Bölgeye ve ağ bağlantı yöntemine göre yapılandırın. Bkz. Uç nokta. |
project |
Evet | — | String | MaxCompute proje adı. Bulmak için: MaxCompute konsolu üzerinde oturum açın, Workspace > Projects bölümüne gidin ve proje adını kopyalayın. |
tunnel.endpoint |
Hayır | — | String | MaxCompute Tunnel uç noktası. Genellikle otomatik olarak belirlenir. Proxy sunucusu gibi özel ağ ortamlarında gereklidir. |
quota.name |
Hayır | — | String | Bir özel kaynak grubu için kota adı. Belirtilmezse paylaşılan bir kaynak grubu kullanılır. Bu parametre yalnızca endpoint bir VPC adresine ayarlandığında etkili olur. Genel bir uç nokta kullanılıyorsa veya tunnel.endpoint belirtilmişse bu parametre etkili olmaz. |
sts-token |
Hayır | — | String | RAM rolü kimlik doğrulaması için Security Token Service (STS) belirteci. MaxCompute'e RAM rolüyle erişirken gereklidir. |
buckets-num |
Hayır | 16 |
Integer | Otomatik olarak oluşturulan MaxCompute Delta tablosu için paket sayısı. Bkz. Neredeyse gerçek zamanlı veri ambarı. |
compress.algorithm |
Hayır | zlib |
String | Veri sıkıştırma algoritması. Geçerli değerler: raw (sıkıştırma yok), zlib, snappy. |
total.buffer-size |
Hayır | 64 MB |
String | Bellek içi arabellek boyutu. Bölümlenmiş tablolar için: bölüm başına uygulanır. Bölümlenmemiş tablolar için: tablo başına uygulanır. Farklı bölümler veya tablolar için arabellekler bağımsızdır. Arabellek dolduğunda veriler flush edilir. |
bucket.buffer-size |
Hayır | 4 MB |
String | Paket başına arabellek boyutu. Yalnızca MaxCompute Delta tablolarına yazarken geçerlidir. |
commit.thread-num |
Hayır | 16 |
Integer | Checkpointing sırasında eşzamanlı olarak commit edilen maksimum bölüm veya tablo sayısı. |
flush.concurrent-num |
Hayır | 4 |
Integer | Eşzamanlı olarak flush edilen maksimum paket sayısı. Yalnızca MaxCompute Delta tablolarına yazarken geçerlidir. |
Tablo konumu eşlemeleri
Bağlayıcı MaxCompute'te tabloları otomatik olarak oluşturduğunda konumlar aşağıdaki gibi eşlenir:
MaxCompute projeniz için şema özelliği devre dışı bırakıldıysa bağlayıcı tableId.namespace değerini yoksayar. Bu durumda, MaxCompute'e yalnızca tek bir veritabanı (veya mantıksal eşdeğeri) alınır; örneğin, MySQL'den alınırken yalnızca bir MySQL veritabanı.
| MySQL konumu | Flink CDC soyutlaması | MaxCompute konumu |
|---|---|---|
| Yok | Proje (yapılandırmadan) | Proje |
| Veritabanı | TableId.namespace |
Şema (şema devre dışıysa yoksayılır) |
| Tablo | TableId.tableName |
Tablo |
Veri türü eşlemeleri
| Flink CDC türü | MaxCompute türü |
|---|---|
| CHAR | STRING |
| VARCHAR | STRING |
| BOOLEAN | BOOLEAN |
| BINARY/VARBINARY | BINARY |
| DECIMAL | DECIMAL |
| TINYINT | TINYINT |
| SMALLINT | SMALLINT |
| INTEGER | INTEGER |
| BIGINT | BIGINT |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| TIME_WITHOUT_TIME_ZONE | STRING |
| DATE | DATE |
| TIMESTAMP_WITHOUT_TIME_ZONE | TIMESTAMP_NTZ |
| TIMESTAMP_WITH_LOCAL_TIME_ZONE (precision > 3) | TIMESTAMP |
| TIMESTAMP_WITH_LOCAL_TIME_ZONE (precision <= 3) | DATETIME |
| TIMESTAMP_WITH_TIME_ZONE (precision > 3) | TIMESTAMP |
| TIMESTAMP_WITH_TIME_ZONE (precision <= 3) | DATETIME |
| ARRAY | ARRAY |
| MAP | MAP |
| ROW | STRUCT |
Şema değişiklikleri
Bir CDC YAML pipeline işi şema değişiklikleri için birden çok stratejiyi destekler. Şema değişikliklerinin nasıl senkronize edileceğini belirtmek için pipeline düzeyindeki schema.change.behavior parametresini yapılandırın. Daha fazla bilgi için bkz. Şema evrimi yapılandırmaları. schema.change.behavior için geçerli değerler IGNORE, LENIENT, TRY_EVOLVE, EVOLVE ve EXCEPTION'tır. Yalnızca LENIENT ve EVOLVE şema değişikliklerini içerir. Aşağıdaki bölümlerde şema değişikliği olaylarının bu iki modda nasıl işlendiği açıklanmaktadır.
LENIENT (varsayılan)
LENIENT modu aşağıdaki şema değişikliklerini işler:
Boş bırakılabilir bir sütun ekleme: Sütun, hedef tablonun şemasının sonuna eklenir ve yeni sütunun verileri otomatik olarak senkronize edilir.
Boş bırakılabilir bir sütunu kaldırma: Sütun hedef tablodan kaldırılmaz. Sütunun verileri otomatik olarak NULL değerleriyle doldurulur.
Boş bırakılamaz bir sütun ekleme: Sütun, hedef tablonun şemasının sonuna eklenir ve yeni sütunun verileri otomatik olarak senkronize edilir. Yeni sütun varsayılan olarak boş bırakılabilirdir. Sütun eklenmeden önce oluşturulan veriler NULL olarak ayarlanır.
Bir sütunu yeniden adlandırma: Olay, bir sütun ekleme ve bir sütun kaldırma olarak işlenir. Yeniden adlandırılan sütun hedef tablonun sonuna eklenir ve orijinal sütunun verileri otomatik olarak NULL değerleriyle doldurulur. Örneğin, col_a col_b olarak yeniden adlandırılırsa col_b hedef tablonun sonuna eklenir ve col_a'nın verileri otomatik olarak NULL değerleriyle doldurulur.
Bir sütun veri türünü değiştirme: Sütunun veri türü hedef tabloda değiştirilir.
-
Aşağıdaki şema değişiklikleri desteklenmez:
Bir sütunu NULLABLE'dan NOT NULL'a değiştirme.
EVOLVE
EVOLVE modu aşağıdaki şema değişikliklerini işler:
Boş bırakılabilir bir sütun ekleme: desteklenir.
Boş bırakılabilir bir sütunu kaldırma: desteklenmez.
Boş bırakılamaz bir sütun ekleme: Hedef tabloya boş bırakılabilir bir sütun eklenir.
Bir sütunu yeniden adlandırma: desteklenir. Hedef tablodaki orijinal sütun yeniden adlandırılır.
Bir sütun veri türünü değiştirme: Sütunun veri türü hedef tabloda değiştirilir.
-
Aşağıdaki şema değişiklikleri desteklenmez:
Bir sütunu NULLABLE'dan NOT NULL'a değiştirme.
EVOLVE modunu etkinleştirme örneği için bkz. EVOLVE modunu etkinleştirme.
Hedef MaxCompute tablosu zaten varsa bağlayıcı verileri mevcut tablo şemasına göre yazar ve tabloyu tekrar oluşturmaz. Mevcut tablo şeması kaynak tablonun şemasından farklıysa bir tür doğrulama hatası raporlanır. Boş bir durumdan bir iş başlatırsanız hedef tabloyu önceden silin ve işin tabloyu oluşturmasına izin verin.
Yapılandırma örnekleri
Aşağıdaki örnekler tipik senaryoların yapılandırmalarını göstermektedir.
Bölümlenmiş bir tabloya yazma
Kaynak tablodaki TIMESTAMP türündeki create_time alanı DATE türüne dönüştürülür ve MaxCompute tablosunun bölüm anahtarı olarak kullanılır.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
transform:
- source-table: test_db.test_source_table
projection: \*, DATE_FORMAT(CAST(create_time AS TIMESTAMP), 'yyyy-MM-dd') as partition_key
primary-keys: id, create_time, partition_key
partition-keys: partition_key
description: add partition key
pipeline:
name: MySQL to MaxCompute Pipeline
Tek bir tabloyu senkronize etme
Tek tablo senkronizasyon işlerinde yüksek gerçek zamanlı performans ve kararlılık gerektiren tabloları senkronize edin. Bu, çoklu tablo senkronizasyonundan kaynaklanan karmaşıklık risklerini önler. Aşağıdaki örnek yapılandırmayı göstermektedir:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
pipeline:
name: MySQL to MaxCompute Pipeline
Tüm bir veritabanını senkronize etme
Tüm veritabanı senkronizasyonu, yapılandırmanız ve çalıştırmanız gereken senkronizasyon işi sayısını azaltarak işletme ve bakım maliyetlerini düşürür. Aşağıdaki örnek yapılandırmayı göstermektedir:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
pipeline:
name: MySQL to MaxCompute Pipeline
Tüm bir veritabanını senkronize etme ve veritabanları ile tabloları yeniden adlandırma
Tüm veritabanı senkronizasyonuna dayanarak, veritabanlarını ve tabloları toplu olarak yeniden adlandırmak için route modülünü ekleyebilirsiniz. Aşağıdaki örnek yapılandırmayı göstermektedir:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
route:
# Synchronize all tables in the MySQL test_db database to the MaxCompute test_db2 database and retain the table names.
- source-table: test_db.\.*
sink-table: test_db2.<>
replace-symbol: <>
pipeline:
name: MySQL to MaxCompute Pipeline
Parçalı tabloları birleştirme
Birden çok parçalı tablonun verilerini tek bir hedef tabloya yazmak için aşağıdaki yapılandırma şablonunu kullanın:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.user\.*
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
route:
# All sharded tables in MySQL test_db are merged into one MaxCompute table named test_db.user.
- source-table: test_db.user\.*
sink-table: test_db.user
pipeline:
name: MySQL to MaxCompute Pipeline
Yeniden başlatma sonrası mevcut tabloları senkronize etme
Senkronizasyon için mevcut tabloları eklemek üzere scan.newly-added-table.enabled değerini true olarak ayarlayın ve işi yeniden başlatın.
Bir iş yeni tabloları yakalamak için scan.binlog.newly-added-table.enabled değerini true olarak ayarlarsa mevcut tabloları yakalamak için scan.newly-added-table.enabled değerini true olarak ayarlayarak işi yeniden başlatamazsınız. Aksi takdirde veriler yinelenir.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
scan.startup.mode: initial
# When the job restarts, check the new tables captured by the tables parameter and take a snapshot.
# Note: Use this parameter together with scan.startup.mode: initial.
scan.newly-added-table.enabled: true
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
pipeline:
name: MySQL to MaxCompute Pipeline
Tüm veritabanı senkronizasyonu sırasında belirli tabloları hariç tutma
Tüm veritabanı senkronizasyonu sırasında test tabloları veya sürekli yeniden başlatmalara neden olan tablolar gibi belirli tabloları hariç tutmak için aşağıdaki yapılandırmayı kullanın:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
# Tables that match this regular expression are not synchronized.
tables.exclude: test_db.table1
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
pipeline:
name: MySQL to MaxCompute Pipeline
EVOLVE modunu etkinleştirme
EVOLVE modu, alan kaldırma ve tablo kaldırma gibi işlemler dahil olmak üzere hedef tablonun şemasını kaynak tablonun şemasıyla kesin olarak tutarlı tutar. Bu modda, hedef tablo tüm şema değişikliği olaylarını uygulayamazsa iş başarısız olabilir ve otomatik olarak kurtarılamayabilir. Aşağıdaki örnek iş yapılandırmasını göstermektedir:
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.test_source_table
server-id: 5401-5499
# (Optional) Synchronize the data of tables created in the incremental phase.
scan.binlog.newly-added-table.enabled: true
# (Optional) Synchronize table comments and column comments.
include-comments.enabled: true
# (Optional) Assign unbounded chunks first to prevent possible TaskManager out-of-memory errors.
scan.incremental.snapshot.unbounded-chunk-first.enabled: true
# (Optional) Enable parse filtering to accelerate reads.
scan.only.deserialize.captured.tables.changelog.enabled: true
sink:
type: maxcompute
name: MaxComputeSink
access-id: ${your_accessId}
access-key: ${your_accessKey}
endpoint: ${your_maxcompute_endpoint}
project: ${your_project}
buckets-num: 8
pipeline:
name: MySQL to MaxCompute Pipeline
schema.change.behavior: evolve
Örnekler
SQL API
Kaynak tablosu
Bir bölümden tüm verileri okuma
partition ile belirtilen bölümden tüm verileri okuyun:
CREATE TEMPORARY TABLE odps_source (
cid VARCHAR,
rt DOUBLE
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpointName>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds=201809*'
);
CREATE TEMPORARY TABLE blackhole_sink (
cid VARCHAR,
invoke_count BIGINT
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink
SELECT
cid,
COUNT(*) AS invoke_count
FROM odps_source GROUP BY cid;
Artımlı verileri okuma
startPartition ile belirtilen bölümden başlayarak verileri okuyun ve yeni bölümleri sürekli olarak izleyin:
CREATE TEMPORARY TABLE odps_source (
cid VARCHAR,
rt DOUBLE
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpointName>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'startPartition' = 'yyyy=2018,MM=09,dd=05' -- Start reading from the 20180905 partition.
);
CREATE TEMPORARY TABLE blackhole_sink (
cid VARCHAR,
invoke_count BIGINT
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink
SELECT cid, COUNT(*) AS invoke_count
FROM odps_source GROUP BY cid;
Havuz tablosu
Statik bir bölüme yazma
partition ile belirtilen bölüme yazın:
CREATE TEMPORARY TABLE datagen_source (
id INT,
len INT,
content VARCHAR
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE odps_sink (
id INT,
len INT,
content VARCHAR
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds=20180905' -- Write to partition 20180905.
);
INSERT INTO odps_sink
SELECT
id, len, content
FROM datagen_source;
Dinamik bölümlere yazma
Verileri çalışma zamanında ds sütunundaki değerlere göre belirlenen bölümlere yazın:
CREATE TEMPORARY TABLE datagen_source (
id INT,
len INT,
content VARCHAR,
c TIMESTAMP
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE odps_sink (
id INT,
len INT,
content VARCHAR,
ds VARCHAR -- Dynamic partition column.
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds' -- Omit the value; data is routed to partitions based on the ds field.
);
INSERT INTO odps_sink
SELECT
id,
len,
content,
DATE_FORMAT(c, 'yyMMdd') as ds
FROM datagen_source;
Boyut tablosu
Tek değerli anahtar
Her anahtar tam olarak bir satıra karşılık geldiğinde bir birincil anahtar belirtin:
CREATE TEMPORARY TABLE datagen_source (
k INT,
v VARCHAR
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE odps_dim (
k INT,
v VARCHAR,
PRIMARY KEY (k) NOT ENFORCED -- Specify the primary key.
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds=20180905',
'cache' = 'ALL'
);
CREATE TEMPORARY TABLE blackhole_sink (
k VARCHAR,
v1 VARCHAR,
v2 VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink
SELECT k, s.v, d.v
FROM datagen_source AS s
INNER JOIN odps_dim FOR SYSTEM_TIME AS OF PROCTIME() AS d ON s.k = d.k;
Çok değerli anahtar
Bir anahtar birden çok satıra karşılık gelebiliyorsa birincil anahtarı atlayın:
CREATE TEMPORARY TABLE datagen_source (
k INT,
v VARCHAR
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE odps_dim (
k INT,
v VARCHAR
-- No primary key needed for multi-value lookups.
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds=20180905',
'cache' = 'ALL'
);
CREATE TEMPORARY TABLE blackhole_sink (
k VARCHAR,
v1 VARCHAR,
v2 VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink
SELECT k, s.v, d.v
FROM datagen_source AS s
INNER JOIN odps_dim FOR SYSTEM_TIME AS OF PROCTIME() AS d ON s.k = d.k;
DataStream API
DataStream API'yi MaxCompute ile kullanmak için bir DataStream bağlayıcısı yapılandırın. Bkz. DataStream bağlayıcılarını entegre etme.
VVR 6.0.6+, MaxCompute bağlayıcısıyla DataStream programlarının yerel hata ayıklamasını 30 dakikaya kadar destekler. 30 dakikayı aşan oturumlar bir hatayla sonlandırılır. Bkz. Bağlayıcıları yerel olarak hata ayıklama.
Bir MaxCompute Delta tablosundan (birincil anahtar ve
transactional=trueile oluşturulan bir tablo) okuma desteklenmez.
MaxCompute tablosunu SQL kullanarak bildirin, ardından Table API veya DataStream API aracılığıyla erişin.
Kaynak tablosuna bağlanma
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
tEnv.executeSql(String.join(
"\n",
"CREATE TEMPORARY TABLE IF NOT EXISTS odps_source (",
" cid VARCHAR,",
" rt DOUBLE",
") WITH (",
" 'connector' = 'odps',",
" 'endpoint' = '<yourEndpointName>',",
" 'project' = '<yourProjectName>',",
" 'tableName' = '<yourTableName>',",
" 'accessId' = '<yourAccessId>',",
" 'accessKey' = '<yourAccessPassword>',",
" 'partition' = 'ds=201809*'",
")");
DataStream<Row> source = tEnv.toDataStream(tEnv.from("odps_source"));
source.print();
env.execute("odps source");
Havuza bağlanma
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
tEnv.executeSql(String.join(
"\n",
"CREATE TEMPORARY TABLE IF NOT EXISTS odps_sink (",
" cid VARCHAR,",
" rt DOUBLE",
") WITH (",
" 'connector' = 'odps',",
" 'endpoint' = '<yourEndpointName>',",
" 'project' = '<yourProjectName>',",
" 'tableName' = '<yourTableName>',",
" 'accessId' = '<yourAccessId>',",
" 'accessKey' = '<yourAccessPassword>',",
" 'partition' = 'ds=20180905'",
")");
DataStream<Row> data = env.fromElements(
Row.of("id0", 3.),
Row.of("id1", 4.));
tEnv.fromDataStream(data).insertInto("odps_sink").execute();
Maven bağımlılığı
MaxCompute DataStream bağlayıcısını projenize ekleyin. Tüm sürümler Maven merkezi deposunda mevcuttur.
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-odps</artifactId>
<version>${vvr-version}</version>
</dependency>