Tüm Ürünler
Search
Belge Merkezi

Realtime Compute for Apache Flink:MaxCompute connector

Son Güncelleme:Oct 04, 2026

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.

Ölçümler

Tablo türü Ölçümler
Kaynak numRecordsIn, numRecordsInPerSecond, numBytesIn, numBytesInPerSecond
Havuz numRecordsOut, numRecordsOutPerSecond, numBytesOut, numBytesOutPerSecond
Boyut tablosu dim.odps.cacheSize
Daha fazla bilgi için bkz. İzleme ölçümleri .

Önkoşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

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 partition seç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çin startPartition kullanarak 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=ALL gerektirir . 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ıyla SHUFFLE_HASH ipucunu 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
Önemli

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:

Önemli

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.

Not

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.

Önemli

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

Önemli
  • 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=true ile 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>

Sonraki adımlar