SelectDB コネクタは、Realtime Compute for Apache Flink と Alibaba Cloud 上のフルマネージド型 Apache Doris 互換リアルタイムデータウェアハウスである ApsaraDB for SelectDB を統合します。このコネクタを使用して、SelectDB からの読み取り、SelectDB への書き込み、SelectDB 内でのルックアップを行うリアルタイムパイプラインを構築したり、YAML ベースのデータインジェストジョブで完全なデータベース同期を実行したりできます。
サポートされる機能:
| カテゴリ | 詳細 |
|---|---|
| テーブルタイプ | ソーステーブル、結果テーブル、ディメンションテーブル、データインジェスト結果 |
| 実行モード | ストリームおよびバッチ |
| データフォーマット | JSON および CSV |
| API タイプ | DataStream、SQL、およびデータインジェスト YAML ジョブ |
| 更新/削除のサポート | はい |
| 監視メトリック | なし |
主な特徴:
-
完全データベースのデータ同期
-
2 相コミット(2PC)による 1 回限りのセマンティクス — レコードの重複や喪失が発生しない
-
Apache Doris 1.0 以降との互換性
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
-
Ververica Runtime (VVR) 8.0.10 以降を搭載した Realtime Compute for Apache Flink
-
ApsaraDB for SelectDB インスタンス。詳細については、「インスタンスの作成」をご参照ください。
-
インスタンスに設定された IP アドレスホワイトリスト。詳細については、「ホワイトリストの設定」をご参照ください。
コネクタの設定
SelectDB コネクタは VVR 11.1 以降に組み込まれており、手動でのインストールは不要です。
VVR 8.0.10 ~ 11.0 の場合は、手動でコネクタをインストールしてください。
-
Maven Central から JAR パッケージをダウンロードします(Flink バージョン 1.15~1.17 対応)。
-
JAR を Realtime Compute for Apache Flink 開発コンソールにアップロードします。詳細については、「カスタムコネクタの管理」をご参照ください。
-
SQL ジョブ内で
'connector' = 'doris'を使用してコネクタを参照します。
SQL
構文
ソーステーブル、結果テーブル、ディメンションテーブルの 3 種類のテーブルタイプは、すべて同じ DDL 構文を共有します。含まれるパラメーターによってテーブルのロールを指定します。
SelectDB をソーステーブルとして使用するには、まずダイレクトクラスター接続を有効にしてください。ApsaraDB for SelectDB コンソールで、インスタンス詳細 > ネットワーク情報 に移動し、ダイレクトクラスター接続の有効化 をクリックします。これにより、Arrow Flight SQL プロトコルが有効になり、高スループットの並列読み取りが可能になります。
CREATE TABLE selectdb_source (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****'
);
パラメーター
共通
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
connector |
はい | — | doris に固定されます。 |
fenodes |
はい | — | SelectDB インスタンスの HTTP エンドポイント:<VPC アドレスまたはパブリックアドレス>:<HTTP プロトコルポート>。両方とも SelectDB コンソールの インスタンス詳細 > ネットワーク情報 から取得できます。例:selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080。 |
jdbc-url |
いいえ | — | ディメンションテーブルのルックアップおよびメタデータクエリ用の Java Database Connectivity (JDBC) 接続文字列:jdbc:mysql://<VPC アドレスまたはパブリックアドレス>:<MySQL プロトコルポート>。例:jdbc:mysql://selectdb-cn-***.selectdbfe.rds.aliyuncs.com:9030。 |
table.identifier |
はい | — | <データベース>.<テーブル> 形式の対象テーブル。例:db.tbl。 |
username |
はい | — | データベースユーザー名。インスタンス詳細 ページの右上隅からパスワードをリセットできます(必要に応じて)。 |
password |
はい | — | データベースユーザー名のパスワード。 |
doris.request.retries |
いいえ | 3 |
失敗したリクエストの再試行回数。 |
doris.request.connect.timeout |
いいえ | 30s |
接続タイムアウト。 |
doris.request.read.timeout |
いいえ | 30s |
読み取りタイムアウト。 |
ソーステーブル
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
doris.request.query.timeout |
いいえ | 21600s |
クエリタイムアウト(デフォルトは 6 時間)。 |
doris.request.tablet.size |
いいえ | 1 |
パーティションごとのタブレット数。値を小さくすると Flink の並列度が向上しますが、データベースへの負荷が増加します。 |
doris.batch.size |
いいえ | 4064 |
1 回のリクエストで Backend (BE) ノードから読み取る最大行数。接続オーバーヘッドおよびネットワーク遅延を低減するために増加させます。 |
doris.exec.mem.limit |
いいえ | 8192mb |
クエリあたりのメモリ制限(バイト単位、デフォルトは 8 GB)。 |
source.use-flight-sql |
いいえ | false |
設定不要 — SelectDB コンソールで ダイレクトクラスター接続 を有効にすると、Arrow Flight SQL が自動的に有効になります。 |
source.flight-sql-port |
いいえ | — | Frontend (FE) ノードの Arrow Flight SQL ポート(arrow_flight_sql_port)。 |
結果テーブル
書き込みモードは、配信保証およびフラッシュ動作に影響します。一貫性要件に基づいて選択してください。
| ストリーミング書き込み | バッチ書き込み | |
|---|---|---|
| トリガー条件 | Flink チェックポイント間隔に従う | データ量または時間しきい値による定期的なフラッシュ |
| 配信保証 | 1 回限り(2PC 経由) | 少なくとも 1 回。べき等性は Unique モデルで実現 |
| レイテンシ | チェックポイント間隔に制限される | 柔軟で、チェックポイントとは独立 |
| フォールトトレランス | Flink ステートの完全な復旧 | Unique モデルによる重複排除に依存 |
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
sink.label-prefix |
いいえ | — | Stream Load インポートのラベルプレフィックス。すべてのジョブ間でグローバルに一意である必要があります — 同じラベルは 1 回しかコミットできません。ジョブ再起動時にも 1 回限りのセマンティクスを保証するために必須です。 |
sink.properties.* |
いいえ | — | SelectDB Stream Load API に直接渡される Stream Load インポートパラメーター。以下の例を参照してください。 |
sink.enable-delete |
いいえ | true |
DELETE 操作を伝播します。Doris テーブルでバッチ削除が有効になっている必要があり、Unique モデルでのみ機能します。 |
sink.enable-2pc |
いいえ | true |
明示的トランザクション操作1 回限りのセマンティクスのための 2 相コミット(2PC)を有効にします。「」をご参照ください。 |
sink.buffer-size |
いいえ | 1 MB |
書き込みキャッシュバッファーサイズ(バイト単位)。デフォルト値のままにしてください。 |
sink.buffer-count |
いいえ | 3 |
書き込みキャッシュバッファー数。デフォルト値のままにしてください。 |
sink.max-retries |
いいえ | 3 |
コミット失敗後の最大再試行回数。 |
sink.enable.batch-mode |
いいえ | false |
バッチ書き込みモードに切り替えます。フラッシュは下記の 3 つの sink.buffer-flush.* パラメーターによって制御され、チェックポイントとは無関係になります。1 回限りの保証はありません。べき等性には Unique モデルを使用してください。 |
sink.flush.queue-size |
いいえ | 2 |
バッチモード時のキャッシュキューのサイズ。 |
sink.buffer-flush.max-rows |
いいえ | 500000 |
バッチモード時の 1 回のフラッシュあたりの最大行数。 |
sink.buffer-flush.max-bytes |
いいえ | 100 MB |
バッチモード時の 1 回のフラッシュあたりの最大バイト数。 |
sink.buffer-flush.interval |
いいえ | 10s |
バッチモード時のフラッシュ間隔。 |
sink.ignore.update-before |
いいえ | true |
Flink CDC からの update-before イベントを無視します。 |
sink.properties.* の例:
CSV フォーマット:
'sink.properties.column_separator' = ','
-- 値にカンマが含まれる可能性がある場合は、印刷不可能な区切り文字を使用します:
-- 'sink.properties.column_separator' = '\x01'
JSON フォーマット:
'sink.properties.format' = 'json',
'sink.properties.read_json_by_line' = 'true'
-- 代替: 'sink.properties.strip_outer_array' = 'true'
ディメンションテーブル
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
lookup.cache.max-rows |
いいえ | -1 |
ルックアップキャッシュの最大行数。-1 はキャッシュを無効にします。 |
lookup.cache.ttl |
いいえ | 10s |
キャッシュエントリの生存時間(TTL)。 |
lookup.max-retries |
いいえ | 1 |
ルックアップクエリ失敗後の再試行回数。 |
lookup.jdbc.async |
いいえ | false |
非同期ルックアップを有効にします。 |
lookup.jdbc.read.batch.size |
いいえ | 128 |
非同期ルックアップモード時の 1 回のクエリあたりの最大バッチサイズ。 |
lookup.jdbc.read.batch.queue-size |
いいえ | 256 |
非同期ルックアップモード時の中間バッファーキューのサイズ。 |
lookup.jdbc.read.thread-size |
いいえ | 3 |
非同期ルックアップモード時のタスクごとの JDBC ルックアップスレッド数。 |
使用例
ソーステーブル
CREATE TEMPORARY TABLE selectdb_source (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****'
);
結果テーブル
CREATE TEMPORARY TABLE selectdb_sink (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****',
'sink.label-prefix' = 'flink_orders' -- ジョブ間でグローバルに一意である必要があります
);
ディメンションテーブル
SelectDB は、ストリーミングファクトテーブルに対して結合されるルックアップディメンションテーブルとして機能します。
-- Kafka からのファクトテーブル
CREATE TEMPORARY TABLE fact_table (
`id` BIGINT,
`name` STRING,
`city` STRING,
`process_time` AS proctime()
) WITH (
'connector' = 'kafka',
...
);
-- SelectDB からのディメンションテーブル
CREATE TEMPORARY TABLE dim_city (
`city` STRING,
`level` INT,
`province` STRING,
`country` STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'jdbc-url' = 'jdbc:mysql://selectdb-cn-***.selectdbfe.rds.aliyuncs.com:9030',
'table.identifier' = 'dim.dim_city',
'username' = 'admin',
'password' = '****'
);
-- 時系列結合
SELECT a.id, a.name, a.city, c.province, c.country, c.level
FROM fact_table a
LEFT JOIN dim_city FOR SYSTEM_TIME AS OF a.process_time AS c
ON a.city = c.city;
データインジェスト
YAML ベースのデータインジェストジョブで SelectDB コネクタを結果として使用し、完全なデータベース同期を実行します。
構文
source:
type: <source-type>
sink:
type: doris
name: Doris Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
username: root
password: ""
パラメーター
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
type |
はい | — | doris に固定されます。 |
name |
いいえ | — | シンクの説明的な名前。 |
fenodes |
はい | — | HTTP エンドポイント:<VPC アドレスまたはパブリックアドレス>:<HTTP プロトコルポート>。両方とも SelectDB コンソールの インスタンス詳細 > ネットワーク情報 から取得できます。例:selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080。 |
jdbc-url |
いいえ | — | JDBC 接続文字列。例:jdbc:mysql://selectdb-cn-***.selectdbfe.rds.aliyuncs.com:9030。 |
username |
はい | — | データベースユーザー名。 |
password |
はい | — | データベースユーザー名のパスワード。 |
sink.enable.batch-mode |
いいえ | true |
データインジェストジョブではバッチモードがデフォルトで有効になっています。フラッシュは 3 つの sink.buffer-flush.* パラメーターによって制御されます。1 回限りの保証はありません。べき等性には Unique モデルを使用してください。 |
sink.flush.queue-size |
いいえ | 2 |
キャッシュキューのサイズ。 |
sink.buffer-flush.max-rows |
いいえ | 500000 |
1 回のフラッシュあたりの最大行数。 |
sink.buffer-flush.max-bytes |
いいえ | 100 MB |
1 回のフラッシュあたりの最大バイト数。 |
sink.buffer-flush.interval |
いいえ | 10s |
フラッシュ間隔。最小値:1s。 |
sink.properties.* |
いいえ | — | Stream Load インポートパラメーター。 |
sink.properties.* の例:
CSV フォーマット:
sink.properties.column_separator: ','
# 値にカンマが含まれる可能性がある場合は、印刷不可能な区切り文字を使用します:
# sink.properties.column_separator: '\x01'
JSON フォーマット:
sink.properties.format: 'json'
sink.properties.read_json_by_line: 'true'
型マッピング
Flink から SelectDB
| Flink CDC 型 | SelectDB 型 | 注記 |
|---|---|---|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INT |
INT |
|
BIGINT |
BIGINT |
|
DECIMAL |
DECIMAL |
|
FLOAT |
FLOAT |
|
DOUBLE |
DOUBLE |
|
BOOLEAN |
BOOLEAN |
|
DATE |
DATE |
|
TIMESTAMP[(p)] |
DATETIME[(p)] |
|
TIMESTAMP_LTZ[(p)] |
DATETIME[(p)] |
|
CHAR(n) |
CHAR(n*3) |
SelectDB は文字列を UTF-8 で格納します。英字は 1 バイト、漢字は 3 バイトを占有します。CHAR の最大長は 255 であり、これを超える値は自動的に VARCHAR に変換されます。 |
VARCHAR(n) |
VARCHAR(n*3) |
UTF-8 の乗数は同様に適用されます。VARCHAR の最大長は 65533 であり、これを超える値は自動的に STRING に変換されます。 |
BINARY(n) |
STRING |
|
VARBINARY(n) |
STRING |
|
STRING |
STRING |