MaxCompute コネクタを使用すると、Alibaba Cloud のエクサバイト規模のフルマネージドデータウェアハウスプラットフォームである MaxCompute (旧 ODPS) との間で、Flink SQL および DataStream ジョブから直接データの読み書きができます。
機能
| 項目 | 説明 |
|---|---|
| テーブルタイプ | ソーステーブル、ディメンションテーブル、結果テーブル、データインジェストシンク |
| 実行モード | ストリーミングモードとバッチモード |
| API タイプ | DataStream API、SQL API、およびデータインジェスト YAML ジョブ |
| セマンティクス | at-least-once |
| 結果テーブルでのデータの更新または削除 | Batch Tunnel または Streaming Tunnel: 挿入のみ。Upsert Tunnel: 挿入、更新、削除。 |
前提条件
開始する前に、以下を確認してください。
-
MaxCompute テーブルがあること。詳細については、「テーブルの作成」をご参照ください。
制限事項
-
コネクタは at-least-once セマンティクスのみをサポートします。使用するトンネルによっては、MaxCompute に重複したレコードが出現する可能性があります。トンネルの選択に関するガイダンスについては、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「データトンネルの選択方法」セクションをご参照ください。
-
デフォルトでは、ソースはフルモードで動作します。つまり、
partitionオプションで指定されたパーティションからのみデータを読み取ります。すべてのデータが読み取られると、ジョブは終了し、新しいパーティションは監視されません。新しいパーティションを継続的に監視するには、startPartitionを使用して増分ソースを設定する必要があります。 -
ディメンションテーブルのキャッシュがリフレッシュされるたびに、テーブルは最新のパーティションをチェックします。ソースが開始された後、すでに読み取り中のパーティションに新しく追加されたデータは読み取りません。パーティションに完全なデータが含まれた後にのみデプロイメントを実行してください。
トンネルの選択
MaxCompute は、Flink からデータを書き込むための 3 つのトンネルを提供します。ユースケースに基づいて選択してください。
| トンネル | デフォルト | 使用するケース |
|---|---|---|
| MaxCompute Batch Tunnel | はい (useStreamTunnel=false, enableUpsert=false) |
バッチロード。データはチェックポイント後にのみ利用可能になります。スケジュールされたフラッシュを無効にするには、flushIntervalMs=0 を設定します。 |
| MaxCompute Streaming Tunnel | いいえ (useStreamTunnel=true) |
ほぼリアルタイムのインジェスト。フラッシュされたデータは MaxCompute ですぐに利用可能になります。 |
| MaxCompute Upsert Tunnel | いいえ (enableUpsert=true) |
MaxCompute Delta テーブルに対する INSERT、UPDATE、DELETE 操作。VVR 8.0.6 以降が必要です。 |
詳細な比較については、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「データトンネルの選択方法」セクションをご参照ください。
SQL
MaxCompute コネクタは、SQL ベースのジョブでソース、ディメンション、または結果テーブルとして使用できます。
構文
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****'
);
コネクタオプション
一般オプション
| オプション | 必須 | デフォルト | 型 | 説明 |
|---|---|---|---|---|
connector |
はい | — | STRING | odps に設定します。 |
endpoint |
はい | — | STRING | MaxCompute エンドポイント。詳細については、「エンドポイント」をご参照ください。 |
tunnelEndpoint |
いいえ | — | STRING | MaxCompute Tunnel エンドポイント。指定しない場合、MaxCompute は Server Load Balancer (SLB) を介してトンネル接続を割り当てます。 |
project |
はい | — | STRING | MaxCompute プロジェクト名。 |
schemaName |
いいえ | — | STRING | MaxCompute のスキーマ機能が有効になっている場合にのみ必要です。これをテーブルのスキーマ名に設定します。詳細については、「スキーマ操作」をご参照ください。VVR 8.0.6 以降。 |
tableName |
はい | — | STRING | MaxCompute テーブル名。 |
accessId |
はい | — | STRING | MaxCompute へのアクセスに使用する AccessKey ID。詳細については、「AccessKey ID と AccessKey Secret の表示方法 重要
AccessKey ID は変数として保存してください。詳細については、「変数の管理」をご参照ください。 |
accessKey |
はい | — | STRING | MaxCompute へのアクセスに使用する AccessKey Secret。 |
partition |
いいえ | — | STRING | MaxCompute テーブルのパーティション名。非パーティション化テーブルまたは増分ソースには不要です。詳細については、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「partition オプションの設定方法」セクションをご参照ください。 |
compressAlgorithm |
いいえ | SNAPPY |
STRING | MaxCompute Tunnel の圧縮アルゴリズム。有効な値: RAW (圧縮なし)、ZLIB、SNAPPY。テストシナリオでは、SNAPPY は ZLIB と比較してスループットが約 50% 向上します。 |
quotaName |
いいえ | — | STRING | 専用の MaxCompute Tunnel リソースグループのクォータ名。VVR 8.0.3 以降。指定した場合、tunnelEndpoint を削除してください。そうしないと、tunnelEndpoint で指定されたトンネルが優先されます。 |
ソースオプション
| オプション | 必須 | デフォルト | 型 | 説明 |
|---|---|---|---|---|
maxPartitionCount |
いいえ | 100 |
INTEGER | 読み取るパーティションの最大数。超えた場合、エラー "The number of matched partitions exceeds the default limit" が表示されます。あまりにも多くのパーティションから読み取ると、MaxCompute に過負荷がかかり、ジョブの起動が遅くなる可能性があります。この値は、ワークロードで必要な場合にのみ増やしてください。 |
useArrow |
いいえ | false |
BOOLEAN | Arrow フォーマットを使用してデータを読み取ります。これは MaxCompute ストレージ API を呼び出します。バッチデプロイメントのみ。VVR 8.0.8 以降。 |
splitSize |
いいえ | 256 MB |
MEMORYSIZE | Arrow フォーマットを使用する際のスプリットごとにプルされるデータ量。バッチデプロイメントのみ。VVR 8.0.8 以降。 |
compressCodec |
いいえ | "" (なし) |
STRING | Arrow フォーマットで読み取る際の圧縮アルゴリズム。有効な値: "" (なし)、ZSTD、LZ4_FRAME。コーデックを指定すると、圧縮なしの場合よりもスループットが向上します。バッチデプロイメントのみ。VVR 8.0.8 以降。 |
dynamicLoadBalance |
いいえ | false |
BOOLEAN | 動的シャード割り当てを有効にして、処理性能を向上させ、全体の読み取り時間を短縮します。ただし、異なる演算子が不整合な量のデータを読み取るため、データスキューが発生する可能性があることに注意してください。バッチデプロイメントのみ。VVR 8.0.8 以降。 |
増分ソースオプション
増分ソースは、MaxCompute を断続的にポーリングして新しいパーティションを検出します。新しいパーティションを読み取る前に、そのパーティションへのすべてのデータ書き込みが完了している必要があります。詳細については、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「増分ソースがデータ書き込み中に新しいパーティションを検出した場合の対処法」セクションをご参照ください。
パーティションの順序付け: ソースは、アルファベット順で startPartition の値以上であるパーティションを読み取ります。たとえば、year=2023,month=10 はアルファベット順で year=2023,month=9 の前にソートされるため、月の値をゼロパディングして (year=2023,month=9 の代わりに year=2023,month=09 を使用)、正しい順序を確保してください。
| オプション | 必須 | デフォルト | 型 | 説明 |
|---|---|---|---|---|
startPartition |
はい | — | STRING | 増分読み取りの開始パーティション。指定した場合、partition は無視されます。多段パーティション化テーブルの場合、パーティション列の値をレベルの降順で設定します。詳細については、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「startPartition の設定方法」セクションをご参照ください。 |
subscribeIntervalInSec |
いいえ | 30 |
INTEGER | ポーリング間隔 (秒)。 |
modifiedTableOperation |
いいえ | NONE |
Enum | 読み取り中にパーティションが変更された場合のアクション。ダウンロードセッションはチェックポイントに保存されます。セッション開始後にパーティション内のデータが変更されると、チェックポイントからの再開に失敗し、デプロイメントが繰り返し再起動します。有効な値: NONE — startPartition を更新して利用できないパーティションをスキップし、状態なしで再起動します。SKIP — 再開時に利用できないパーティションを自動的にスキップします。VVR 8.0.3 以降。いずれかの値に設定した場合、変更されたパーティションからすでに読み取られたデータは保持され、未読のデータは破棄されます。 |
シンク オプション
| オプション | 必須 | デフォルト | 型 | 説明 |
|---|---|---|---|---|
useStreamTunnel |
いいえ | false |
BOOLEAN | Batch Tunnel の代わりに MaxCompute Streaming Tunnel を使用します。true: Streaming Tunnel、false: Batch Tunnel。詳細については、「トンネルの選択」をご参照ください。 |
flushIntervalMs |
いいえ | 30000 (30 秒) |
LONG | トンネルライターバッファーのフラッシュ間隔 (ミリ秒)。Streaming Tunnel の場合: フラッシュされたデータはすぐに利用可能になります。Batch Tunnel の場合: データはチェックポイント後にのみ利用可能になります。スケジュールされたフラッシュを無効にするには 0 に設定します。flushIntervalMs または batchSize のいずれかに達したときにトリガーされます。 |
batchSize |
いいえ | 67108864 (64 MB) |
LONG | バッファーサイズ (バイト)。バッファーがこのサイズに達するとデータがフラッシュされます。batchSize または flushIntervalMs のいずれかに達したときにトリガーされます。 |
numFlushThreads |
いいえ | 1 |
INTEGER | トンネルライターバッファーをフラッシュするために使用されるスレッド数。1 より大きい値にすると、パーティション間で同時フラッシュが可能になります。 |
slotNum |
いいえ | 0 |
INTEGER | Flink からデータを受信するための Tunnel スロットの数。スロットの制限については、「データ転送サービスの概要」をご参照ください。 |
dynamicPartitionLimit |
いいえ | 100 |
INTEGER | 2 つのチェックポイント間に書き込まれる動的パーティションの最大数。超えた場合、エラー "Too many dynamic partitions" が表示されます。多くのパーティションに書き込むと、MaxCompute への負荷が増加し、チェックポイントが遅くなります。この値は、ワークロードで必要な場合にのみ増やしてください。 |
retryTimes |
いいえ | 3 |
INTEGER | MaxCompute サーバーリクエスト (セッション作成、送信、またはフラッシュの失敗) の最大リトライ回数。 |
sleepMillis |
いいえ | 1000 |
INTEGER | リトライ間隔 (ミリ秒)。 |
enableUpsert |
いいえ | false |
BOOLEAN | MaxCompute Upsert Tunnel を使用します。true: INSERT、UPDATE_AFTER、DELETE レコードを処理します。false: useStreamTunnel で指定されたトンネルを使用します。VVR 8.0.6 以降。アップサートモードでセッションコミット中にシンクでエラーまたは長時間の障害が発生した場合は、シンク演算子の並列度を 10 以下に設定してください。 |
upsertAsyncCommit |
いいえ | false |
BOOLEAN | アップサートセッションをコミットする際に非同期モードを使用します。非同期モードはコミット時間を短縮しますが、コミットされたデータはすぐにクエリできません。VVR 8.0.6 以降。 |
upsertCommitTimeoutMs |
いいえ | 120000 (120 秒) |
INTEGER | アップサートセッションコミットのタイムアウト (ミリ秒)。VVR 8.0.6 以降。 |
sink.operation |
いいえ | insert |
STRING | Delta テーブルの書き込みモード。insert: 追加モード、upsert: 更新モード。VVR 8.0.10 以降。 |
sink.parallelism |
いいえ | — | INTEGER | Delta テーブルの書き込み並列度。デフォルトはアップストリームの並列度です。最適な書き込み性能とメモリ効率のためには、write.bucket.num の値が sink.parallelism の整数倍である必要があります。VVR 8.0.10 以降。 |
sink.file-cached.enable |
いいえ | false |
BOOLEAN | Delta テーブルの動的パーティションへの書き込み時にファイルキャッシュモードを有効にします。サーバーに書き込まれる小さなファイルを減らしますが、書き込みレイテンシが増加します。シンクの並列度が高い場合に有効にしてください。VVR 8.0.10 以降。 |
sink.file-cached.writer.num |
いいえ | 16 |
INTEGER | ファイルキャッシュモードでのタスクごとの同時アップロードスレッド数。この値を高く設定しすぎないでください。多くのパーティションに同時に書き込むと、メモリ不足 (OOM) エラーが発生する可能性があります。sink.file-cached.enable=trueVVR 8.0.10以降。 |
sink.bucket.check-interval |
いいえ | 60000 |
INTEGER | ファイルキャッシュモードでのファイルサイズチェック間隔 (ミリ秒)。sink.file-cached.enable=trueVVR 8.0.10 以降。 |
sink.file-cached.rolling.max-size |
いいえ | 16 MB |
MEMORYSIZE | 単一のキャッシュファイルの最大サイズ。超えた場合、データはサーバーにアップロードされます。sink.file-cached.enable=trueVVR 8.0.10 以降。 |
sink.file-cached.memory |
いいえ | 64 MB |
MEMORYSIZE | ファイルキャッシュモードでのファイル書き込み用の最大オフヒープメモリ。sink.file-cached.enable=trueVVR 8.0.10+。 |
sink.file-cached.memory.segment-size |
いいえ | 128 KB |
MEMORYSIZE | ファイルキャッシュモードでのファイル書き込み用のバッファーセグメントサイズ。sink.file-cached.enable=trueVVR 8.0.10 以降。 |
sink.file-cached.flush.always |
いいえ | true |
BOOLEAN | ファイルキャッシュモードでファイルを書き込む際にキャッシュを使用するかどうか。sink.file-cached.enable=trueVVR 8.0.10+。 |
sink.file-cached.write.max-retries |
いいえ | 3 |
INTEGER | ファイルキャッシュモードでのデータアップロードのリトライ回数。sink.file-cached.enable=trueVVR 8.0.10+。 |
upsert.writer.max-retries |
いいえ | 3 |
INTEGER | Upsert Writer セッションでバケットへの書き込みの最大リトライ回数。VVR 8.0.10 以降。 |
upsert.writer.buffer-size |
いいえ | 64 MB |
MEMORYSIZE | Upsert Writer セッション内のすべてのバケットにわたる合計バッファーサイズ。合計がこのしきい値に達するとデータがフラッシュされます。書き込み効率を向上させるために増やし、多くのパーティションへの書き込みが OOM エラーを引き起こす場合は減らしてください。VVR 8.0.10 以降。 |
upsert.writer.bucket.buffer-size |
いいえ | 1 MB |
MEMORYSIZE | Upsert Writer セッションのバケットごとのバッファーサイズ。Flink サーバーのメモリが不足している場合は減らしてください。VVR 8.0.10 以降。 |
upsert.write.bucket.num |
はい | — | INTEGER | ターゲット Delta テーブルのバケット数。Delta テーブルで設定された write.bucket.num と一致する必要があります。VVR 8.0.10 以降。 |
upsert.write.slot-num |
いいえ | 1 |
INTEGER | アップサートセッションごとのトンネルスロット数。VVR 8.0.10 以降。 |
upsert.commit.max-retries |
いいえ | 3 |
INTEGER | アップサートセッションコミットの最大リトライ回数。VVR 8.0.10 以降。 |
upsert.commit.thread-num |
いいえ | 16 |
INTEGER | アップサートセッションコミットの並列度。大きな値は避けてください。過剰な同時コミットはリソース消費を増加させ、パフォーマンスの問題を引き起こす可能性があります。VVR 8.0.10 以降。 |
upsert.commit.timeout |
いいえ | 600 |
INTEGER | アップサートセッションコミットのタイムアウト (秒)。VVR 8.0.10 以降。 |
upsert.flush.concurrent |
いいえ | 2 |
INTEGER | パーティションごとの最大同時バケットフラッシュ数。各バケットフラッシュは Tunnel スロットを占有します。VVR 8.0.10 以降。 |
insert.commit.thread-num |
いいえ | 16 |
INTEGER | 挿入セッションコミットの並列度。VVR 8.0.10 以降。 |
insert.arrow-writer.enable |
いいえ | false |
BOOLEAN | 挿入に Arrow フォーマットを使用します。VVR 8.0.10 以降。 |
insert.arrow-writer.batch-size |
いいえ | 512 |
INTEGER | Arrow フォーマットバッチごとの最大行数。VVR 8.0.10 以降。 |
insert.arrow-writer.flush-interval |
いいえ | 100000 |
INTEGER | ライターのフラッシュ間隔 (ミリ秒)。VVR 8.0.10 以降。 |
insert.writer.buffer-size |
いいえ | 64 MB |
MEMORYSIZE | バッファードライターのキャッシュサイズ。VVR 8.0.10 以降。 |
upsert.partial-column.enable |
いいえ | false |
BOOLEAN | 特定の列のデータ更新指定された列のみを更新します (部分列更新)。Delta テーブルシンクにのみ適用されます。詳細については、「」をご参照ください。true の場合: 同じプライマリキーを持つレコードが存在する場合、指定された非 null フィールドが上書きされます。一致するレコードが存在しない場合、指定された列に新しい値を持つ新しいレコードが挿入され、指定されていないすべての列は null になります。VVR 8.0.11 以降。 |
ディメンションテーブルオプション
デプロイメントが開始されると、ディメンションテーブルは partition で指定されたパーティションからすべてのデータをロードします。partition オプションは max_pt() 関数をサポートします。キャッシュのリロード時に、最新のパーティションが再読み込みされます。partition を max_two_pt() に設定すると、2 つのパーティションからデータがロードされます。
ディメンションテーブルにはcache=ALLが必要です。join ノードのメモリをリモートテーブルデータのサイズの少なくとも 4 倍に増やしてください。大きなディメンションテーブルの場合は、SHUFFLE_HASHヒントを使用してデータを均等に分散させます。頻繁な Java 仮想マシン (JVM) のガベージコレクション (GC) を引き起こす超大規模テーブルの場合は、LRU (Least Recently Used) キャッシュポリシーを持つキー・バリューディメンションテーブル (例: ApsaraDB for HBase ディメンションテーブル) に変換してください。
| オプション | 必須 | デフォルト | 型 | 説明 |
|---|---|---|---|---|
cache |
はい | — | STRING | キャッシュポリシー。ALL に設定し、DDL 文で明示的に宣言する必要があります。すべてのディメンションテーブルデータは、デプロイメントが実行される前にキャッシュにロードされます。その後のルックアップはキャッシュのみを検索します。エントリの有効期限が切れると、キャッシュは再読み込みされます。 |
cacheSize |
いいえ | 100000 |
LONG | キャッシュする最大行数。超えた場合、エラー "Row count of table <table-name> partition <partition-name> exceeds maxRowCount limit" が表示されます。大きなキャッシュは大量の JVM ヒープメモリを消費し、起動とキャッシュのリフレッシュを遅くします。この値は、ワークロードで必要な場合にのみ増やしてください。 |
cacheTTLMs |
いいえ | Long.MAX_VALUE |
LONG | キャッシュのタイムアウト (ミリ秒)。 |
cacheReloadTimeBlackList |
いいえ | — | STRING | キャッシュがリフレッシュされない期間。ピークトラフィック期間 (プロモーションイベントなど) 中に使用して、キャッシュのリフレッシュによるデプロイメントの不安定性を防ぎます。詳細については、「アップストリームおよびダウンストリームストレージに関するよくある質問」の「cacheReloadTimeBlackList の設定方法」セクションをご参照ください。 |
maxLoadRetries |
いいえ | 10 |
INTEGER | デプロイメント起動時の初期キャッシュロードの最大リトライ回数。リトライ回数を使い切ると、デプロイメントは失敗します。 |
データ型のマッピング
MaxCompute のデータの型の完全なリストについては、「MaxCompute データ型システム バージョン 2.0」をご参照ください。
| MaxCompute 型 | Flink 型 |
|---|---|
| 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 |
MaxCompute 物理テーブルにネストされた複合型フィールド (ARRAY、MAP、または STRUCT) または JSON フィールドが含まれている場合、Realtime Compute for Apache Flink がデータを正しく読み書きできるように、テーブル作成時に tblproperties('columnar.nested.type'='true') を設定してください。
Flink CDC (パブリックプレビュー)
MaxCompute コネクタは、YAML ベースのジョブでシンクとして Change Data Capture (CDC) データをインジェストできます。VVR 11.1 以降が必要です。
構文
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
設定オプション
| オプション | 必須 | デフォルト値 | 型 | 説明 |
|---|---|---|---|---|
type |
はい | — | String | maxcompute に設定します。 |
name |
いいえ | — | String | Sink 名。 |
access-id |
はい | — | String | Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。Resource Access Management (RAM) コンソールから取得します。 |
access-key |
はい | — | String | AccessKey Secret。 |
endpoint |
はい | — | String | エンドポイントMaxCompute エンドポイント。リージョンとネットワーク接続方法に基づいて設定します。詳細は、をご参照ください。 |
project |
はい | — | String | MaxCompute プロジェクト名。確認するには、MaxCompute コンソールにログインし、[ワークスペース] > [プロジェクト] に移動して、プロジェクト名をコピーします。 |
tunnel.endpoint |
いいえ | — | String | MaxCompute Tunnel エンドポイント。通常は自動的に推論されます。プロキシサーバーを使用している場合など、特殊なネットワーク環境で必要になります。 |
quota.name |
いいえ | — | String | 専用リソースグループのクォータ名。指定しない場合は、共有リソースグループが使用されます。 |
sts-token |
いいえ | — | String | RAM ロール認証用の Security Token Service (STS) トークン。RAM ロールで MaxCompute にアクセスする場合に必要です。 |
buckets-num |
いいえ | 16 |
Integer | ほぼリアルタイムのデータウェアハウス自動作成された MaxCompute Delta テーブルのバケット数。詳細は、をご参照ください。 |
compress.algorithm |
いいえ | zlib |
String | データ圧縮アルゴリズム。有効な値: raw (圧縮なし)、zlib、snappy。 |
total.buffer-size |
いいえ | 64 MB |
String | インメモリバッファーサイズ。パーティションテーブルの場合、パーティションごとに適用されます。非パーティション化テーブルの場合、テーブルごとに適用されます。異なるパーティションまたはテーブルのバッファーは独立しています。バッファーがいっぱいになると、データはフラッシュされます。 |
bucket.buffer-size |
いいえ | 4 MB |
String | バケットごとのバッファーサイズ。MaxCompute Delta テーブルへの書き込み時にのみ適用されます。 |
commit.thread-num |
いいえ | 16 |
Integer | チェックポイント作成時に同時にコミットされるパーティションまたはテーブルの最大数。 |
flush.concurrent-num |
いいえ | 4 |
Integer | 同時にフラッシュされるバケットの最大数。MaxCompute Delta テーブルへの書き込み時にのみ適用されます。 |
テーブルロケーションのマッピング
コネクタが MaxCompute でテーブルを自動作成する場合、ロケーションは次のようにマッピングされます。
MaxCompute プロジェクトでスキーマ機能が無効になっている場合、コネクタは tableId.namespace を無視します。この場合、単一のデータベース (またはその論理的な同等物) のみが MaxCompute にインジェストされます。たとえば、MySQL からインジェストする場合、1 つの MySQL データベースのみが対象となります。
| MySQL ロケーション | Flink CDC 抽象 | MaxCompute ロケーション |
|---|---|---|
| N/A | プロジェクト (設定から) | プロジェクト |
| データベース | TableId.namespace |
スキーマ (スキーマが無効な場合は無視) |
| テーブル | TableId.tableName |
テーブル |
データ型のマッピング
| Flink CDC 型 | MaxCompute 型 |
|---|---|
| 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 (精度 > 3) | TIMESTAMP |
| TIMESTAMP_WITH_LOCAL_TIME_ZONE (精度 <= 3) | DATETIME |
| TIMESTAMP_WITH_TIME_ZONE (精度 > 3) | TIMESTAMP |
| TIMESTAMP_WITH_TIME_ZONE (精度 <= 3) | DATETIME |
| ARRAY | ARRAY |
| MAP | MAP |
| ROW | STRUCT |
例
SQL API
ソーステーブル
パーティションからすべてのデータを読み取る
partition で指定されたパーティションからすべてのデータを読み取ります。
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;
増分データを読み取る
startPartition で指定されたパーティションからデータの読み取りを開始し、新しいパーティションを継続的に監視します。
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' -- 20180905 パーティションから読み取りを開始します。
);
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;
結果テーブル
静的パーティションへの書き込み
partition で指定されたパーティションに書き込みます。
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' -- パーティション 20180905 に書き込みます。
);
INSERT INTO odps_sink
SELECT
id, len, content
FROM datagen_source;
動的パーティションへの書き込み
ds 列の値によってランタイムに決定されるパーティションにデータを書き込みます。
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 -- 動的パーティション列。
) WITH (
'connector' = 'odps',
'endpoint' = '<yourEndpoint>',
'project' = '<yourProjectName>',
'tableName' = '<yourTableName>',
'accessId' = '${secret_values.ak_id}',
'accessKey' = '${secret_values.ak_secret}',
'partition' = 'ds' -- 値を省略します。データは ds フィールドに基づいてパーティションにルーティングされます。
);
INSERT INTO odps_sink
SELECT
id,
len,
content,
DATE_FORMAT(c, 'yyMMdd') as ds
FROM datagen_source;
ディメンションテーブル
単一値キー
各キーが正確に 1 つの行にマッピングされる場合にプライマリキーを指定します。
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 -- プライマリキーを指定します。
) 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;
複数値キー
キーが複数の行にマッピングされる可能性がある場合にプライマリキーを省略します。
CREATE TEMPORARY TABLE datagen_source (
k INT,
v VARCHAR
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE odps_dim (
k INT,
v VARCHAR
-- 複数値のルックアップにはプライマリキーは不要です。
) 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 を MaxCompute で使用するには、DataStream コネクタを設定します。詳細については、「DataStream コネクタの統合」をご参照ください。
-
VVR 6.0.6+ は、MaxCompute コネクタを使用した DataStream プログラムのオンプレミスでのデバッグを最大 30 分間サポートします。30 分を超えたセッションはエラーで終了されます。詳細については、「コネクタをローカルでデバッグする」をご参照ください。
-
MaxCompute Delta テーブル (プライマリキーと
transactional=trueで作成されたテーブル) からの読み取りはサポートされていません。
SQL を使用して MaxCompute テーブルを宣言し、Table API または DataStream API を介してアクセスします。
ソーステーブルへの接続
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");
シンクへの接続
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 依存関係
MaxCompute DataStream コネクタをプロジェクトに追加します。すべてのバージョンは Maven セントラルリポジトリで入手できます。
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-odps</artifactId>
<version>${vvr-version}</version>
</dependency>