このトピックでは、Hologres コネクタを使用して YAML データインジェストデプロイメントでデータを同期する方法について説明します。
背景情報
Hologres は、大規模なリアルタイム書き込み、更新、分析をサポートするリアルタイムデータウェアハウスエンジンです。Hologres は PostgreSQL プロトコルと互換性があり、標準 SQL をサポートしています。ペタバイト規模のデータに対するオンライン分析処理 (OLAP) およびアドホッククエリをサポートし、高い同時実行性と低遅延でデータを提供します。Hologres は MaxCompute、Realtime Compute for Apache Flink、DataWorks と統合され、オンラインおよびオフラインのデータウェアハウスソリューションを提供します。次の表に、Hologres YAML コネクタの機能を示します。
項目 | 説明 |
テーブルタイプ | Sink |
実行モード | ストリーミングモードおよびバッチモード |
データ形式 | 該当なし |
メトリクス |
説明 詳細については、「Metrics」をご参照ください。 |
API タイプ | YAML |
結果テーブルでの更新または削除 | サポートされています |
機能
機能 | 説明 |
データベース全体または複数のテーブルからフルデータおよび増分データをリアルタイムで対応する結果テーブルに同期します。 | |
ソーステーブルのスキーマ変更(列の追加、削除、名前の変更など)をリアルタイムで対応する結果テーブルに同期します。 | |
正規表現を使用して、複数のシャード化されたデータベース間で名前によってソーステーブルをマッチングします。これらのテーブルからのデータはマージされ、対応する名前のダウンストリーム結果テーブルに同期されます。 | |
アップストリームテーブルからのデータを Hologres パーティションテーブルに書き込みます。 | |
複数の戦略を使用して、アップストリームのデータ型をより広い範囲の Hologres データ型にマッピングします。 |
構文
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}パラメーター
パラメーター | 説明 | 型 | 必須 | デフォルト | 備考 |
type | Sink のタイプです。 | String | はい | なし | 値は |
name | Sink の名前です。 | String | いいえ | なし | 該当なし。 |
dbname | データベース名です。 | String | はい | なし | 該当なし。 |
username | データベースアクセス用のユーザー名です。Alibaba Cloud アカウントの AccessKey ID を使用してください。 | String | はい | なし | 詳細については、「AccessKey ID および AccessKey Secret の確認方法」をご参照ください。 重要 AccessKey を公開しないようにするため、変数を使用してその値を指定してください。詳細については、「プロジェクト変数」をご参照ください。 |
password | データベースアクセス用のパスワードです。Alibaba Cloud アカウントの AccessKey Secret を使用してください。 | String | はい | なし | |
endpoint | Hologres サービスのエンドポイントです。 | String | はい | なし | 詳細については、「アクセスエンドポイント」をご参照ください。 |
jdbcRetryCount | 接続が失敗した場合の書き込みおよびクエリ操作のリトライ回数です。 | Integer | いいえ | 10 | 該当なし。 |
jdbcRetrySleepInitMs | 各リトライ試行時の固定待機時間です。 | Long | いいえ | 1000 | 単位:ミリ秒。実際のリトライ待機時間は、次の数式で計算されます: |
jdbcRetrySleepStepMs | 各リトライ試行時の増分待機時間です。 | Long | いいえ | 5000 | 単位:ミリ秒。実際のリトライ待機時間は、次の数式で計算されます: |
jdbcConnectionMaxIdleMs | JDBC 接続の最大アイドル時間です。 | Long | いいえ | 60000 | 単位:ミリ秒。接続がこの期間以上アイドル状態になると、切断されて解放されます。 |
jdbcMetaCacheTTL | ローカルにキャッシュされた TableSchema 情報の有効期限です。 | Long | いいえ | 60000 | 単位:ミリ秒。 |
jdbcMetaAutoRefreshFactor | キャッシュリフレッシュのトリガーを決定する係数です。残りの有効期間がトリガー時間未満になると、システムは自動的にキャッシュをリフレッシュします。 | Integer | いいえ | 4 | 残りのキャッシュ有効期間は次のように計算されます: 残りのキャッシュ有効期間 = キャッシュ有効期限 - キャッシュがアクティブになっている時間。 自動リフレッシュ後、キャッシュのアクティブ時間は 0 にリセットされます。 トリガー時間は次の数式で計算されます: |
mutatetype | データ書き込みモードです。 | String | いいえ | INSERT_OR_UPDATE | Hologres 物理テーブルにプライマリキーが設定されている場合、Hologres sink はプライマリキーに基づいて 1 回限りのセマンティクスを保証します。重複するプライマリキーを持つデータが到着した場合、
|
createparttable | パーティションテーブルへの書き込み時に、存在しないパーティションを自動的に作成するかどうかを指定します。 | Boolean | いいえ | false | 該当なし。 |
sink.delete-strategy | 取り消しメッセージの処理方法を指定します。 | String | いいえ | None | 有効値:
|
jdbcWriteBatchSize | JDBC モードにおいて、バッチ書き込み前に Hologres sink がバッファーするレコードの最大数です。 | Integer | いいえ | 256 | 単位:行。 説明 jdbcWriteBatchSize、jdbcWriteBatchByteSize、および jdbcWriteFlushInterval パラメーターには OR 関係があります。これら 3 つのパラメーターをすべて設定した場合、いずれか 1 つの条件が満たされるとすぐに結果データが書き込まれます。 |
jdbcWriteBatchByteSize | JDBC モードにおいて、このパラメーターは、バッチを送信先に書き込む前に Hologres sink がバッファーするデータの最大サイズ(バイト単位)を指定します。 | Long | いいえ | 2,097,152 バイト (2 MB) | 説明 jdbcWriteBatchSize、jdbcWriteBatchByteSize、および jdbcWriteFlushInterval パラメーターには OR 関係があります。これら 3 つのパラメーターをすべて設定した場合、いずれか 1 つの条件が満たされるとすぐに結果データが書き込まれます。 |
jdbcWriteFlushInterval | JDBC モードにおいて、このパラメーターは、Hologres sink がバッファーされたデータを Hologres に書き込むまでに待機する最大時間を指定します。 | Long | いいえ | 10000 | 単位:ミリ秒。 説明 jdbcWriteBatchSize、jdbcWriteBatchByteSize、および jdbcWriteFlushInterval パラメーターには OR 関係があります。これら 3 つのパラメーターをすべて設定した場合、いずれか 1 つの条件が満たされるとすぐに結果データが書き込まれます。 |
ignoreNullWhenUpdate | | Boolean | いいえ | false | 有効値:
|
jdbcEnableDefaultForNotNullColumn | NOT NULL 列に定義されたデフォルト値がない状態で null が書き込まれる場合に、デフォルト値を挿入するかどうかを指定します。 | Boolean | いいえ | true | 有効値:
|
remove-u0000-in-text.enabled | 書き込み前に文字列からヌル文字 ( | Boolean | いいえ | false | 有効値:
|
deduplication.enabled | jdbc モードおよび jdbc_fixed モードにおいて、書き込み前に各バッチ内で重複排除を実行するかどうかを指定します。 | Boolean | いいえ | true | 有効値:
|
sink.type-normalize-strategy | データ型マッピング戦略です。 | String | いいえ | STANDARD | Hologres sink がアップストリームのデータ型を Hologres 型に変換するために使用する戦略です。
|
sink.insert.legacy-put-handler | Hologres へのデータ書き込みにレガシ Put ハンドラを使用するかどうかを指定します。 | Boolean | いいえ | false | 有効値:
|
table_property.* | Hologres の物理テーブルプロパティです。 | String | いいえ | なし | Hologres テーブルを作成する際に、WITH 句で物理テーブルプロパティを設定できます。適切なテーブルプロパティを設定することで、システムがデータを効率的に整理およびクエリできるようになります。 警告
|
connection.ssl.mode | Secure Sockets Layer (SSL) トランスポート暗号化を有効にするかどうか、およびどのモードを使用するかを指定します。 | String | いいえ | disable |
説明
|
connection.ssl.root-cert.location | トランスポート暗号化モードで証明書が必要な場合、証明書ファイルへのパスを指定します。 | String | いいえ | なし | connection.ssl.mode が verify-ca または verify-full に設定されている場合、CA 証明書へのパスも設定する必要があります。Realtime Compute コンソールの File Management 機能を使用して、プラットフォームに証明書をアップロードできます。証明書をアップロードすると、/flink/usrlib ディレクトリに保存されます。たとえば、CA 証明書ファイルの名前が certificate.crt の場合、パラメーター値は 説明 CA 証明書の取得方法については、「トランスポート暗号化 - CA 証明書のダウンロード」をご参照ください。 |
connection.akv4.enabled | AKV4 モードを有効にして Hologres サーバーに接続するかどうかを指定します。 | Boolean | いいえ | false | 該当なし。 |
connection.akv4.region | AKV4 モードが有効な場合、サーバーが配置されているリージョンを指定します。 | String | いいえ | なし | 例: |
既存のカタログの再利用
VVR 11.5 以降では、Flink CDC データインジェストジョブで Data Management ページに作成済みの組み込み Hologres カタログを直接参照できます。これにより、接続プロパティを手動で指定する必要が軽減されます。
sink:
type: hologres
using.built-in-catalog: my_holo_catalogデータインジェストジョブでは、次の Hologres カタログパラメーターを自動的に再利用できます:
endpoint
username
password
dbname
これらの自動再利用パラメーターを上書きするには、対応する YAML パラメーターを明示的に指定できます。YAML パラメーターの方が優先度が高くなります。
データ型マッピング
sink.type-normalize-strategy パラメーターを使用して、アップストリームデータを Hologres 型に変換する戦略を設定できます。
YAML ジョブを初めて開始する際に
sink.type-normalize-strategyを有効にしてください。ジョブ開始後に有効にした場合、設定を有効にするにはダウンストリームテーブルを削除し、ステートレスでジョブを再起動する必要があります。現在、配列型は INTEGER、BIGINT、FLOAT、DOUBLE、BOOLEAN、CHAR、VARCHAR のみをサポートしています。
Hologres はプライマリキーとして numeric 型をサポートしていません。プライマリキーの型が
numericにマッピングされる場合、システムはそれをvarchar型に変換します。
STANDARD
sink.type-normalize-strategy が STANDARD に設定されている場合、型は次のようにマッピングされます:
Flink CDC 型 | Hologres 型 |
CHAR | bpchar |
STRING | text |
VARCHAR | text (長さ > 10485760 の場合) |
varchar (長さ <= 10485760 の場合) | |
BOOLEAN | bool |
BINARY | bytea |
VARBINARY | |
DECIMAL | numeric |
TINYINT | int2 |
SMALLINT | |
INTEGER | int4 |
BIGINT | int8 |
FLOAT | float4 |
DOUBLE | float8 |
DATE | date |
TIME_WITHOUT_TIME_ZONE | time |
TIMESTAMP_WITHOUT_TIME_ZONE | timestamp |
TIMESTAMP_WITH_LOCAL_TIME_ZONE | timestamptz |
ARRAY | 対応する要素型の配列 |
MAP | サポートされていません |
ROW | サポートされていません |
BROADEN
sink.type-normalize-strategy が BROADEN に設定されている場合、Flink CDC 型はより広い範囲の Hologres 型に変換されます。型は次のようにマッピングされます:
Flink CDC 型 | Hologres 型 |
CHAR | text |
STRING | |
VARCHAR | |
BOOLEAN | bool |
BINARY | bytea |
VARBINARY | |
DECIMAL | numeric |
TINYINT | int8 |
SMALLINT | |
INTEGER | |
BIGINT | |
FLOAT | float8 |
DOUBLE | |
DATE | date |
TIME_WITHOUT_TIME_ZONE | time |
TIMESTAMP_WITHOUT_TIME_ZONE | timestamp |
TIMESTAMP_WITH_LOCAL_TIME_ZONE | timestamptz |
ARRAY | 対応する要素型の配列 |
MAP | サポートされていません |
ROW | サポートされていません |
ONLY_BIGINT_OR_TEXT
sink.type-normalize-strategy が ONLY_BIGINT_OR_TEXT に設定されている場合、すべての Flink CDC 型は Hologres の BIGINT 型または STRING 型に変換されます。データ型マッピングは次のとおりです:
Flink CDC 型 | Hologres 型 |
TINYINT | int8 |
SMALLINT | |
INTEGER | |
BIGINT | |
BOOLEAN | text |
BINARY | |
VARBINARY | |
DECIMAL | |
FLOAT | |
DOUBLE | |
DATE | |
TIME_WITHOUT_TIME_ZONE | |
TIMESTAMP_WITHOUT_TIME_ZONE | |
TIMESTAMP_WITH_LOCAL_TIME_ZONE | |
ARRAY | 対応する要素型の配列 |
MAP | サポートされていません |
ROW | サポートされていません |
パーティションテーブルへの書き込み
変換機能と Hologres sink を使用して、アップストリームデータを Hologres パーティションテーブルに書き込むことができます。
パーティションキーはプライマリキーの一部である必要があります。アップストリームデータのプライマリキー以外の列をパーティションキーとして使用すると、アップストリームテーブルとダウンストリームテーブルのプライマリキーが不整合になり、データ同期中にデータの不一致が発生する可能性があります。Hologres は、TEXT、VARCHAR、および INT データ型の列を
パーティションキーとしてサポートしています。バージョン 1.3.22 以降では、DATE データ型の列もサポートされています。子パーティションテーブルを自動的に作成するには、
createparttableパラメーターをtrueに設定します。設定しない場合は、手動で作成する必要があります。
例については、「パーティションテーブルへのデータ書き込み」をご参照ください。
テーブルスキーマの同期
CDC YAML パイプラインでは、パイプラインレベルの schema.change.behavior パラメーターを使用して、テーブルスキーマ変更を処理するさまざまな戦略を構成できます。schema.change.behavior の有効値は IGNORE、LENIENT、TRY_EVOLVE、EVOLVE、EXCEPTION です。Hologres Sink は現在、TRY_EVOLVE 戦略をサポートしていません。LENIENT および EVOLVE 戦略ではテーブルスキーマ変更が関係します。以下のセクションでは、これら 2 つのモードが異なるスキーマ変更イベントをどのように処理するかについて説明します。
LENIENT (デフォルト)
LENIENT モードでは、スキーマ変更は次のように処理されます:
NULL 許容列の追加:対応する列が結果テーブルの末尾に自動的に追加され、そのデータが同期されます。
NULL 許容列の削除:結果テーブルから列は削除されません。代わりに、その列には自動的に NULL 値が入力されます。
NOT NULL 列の追加:対応する NULL 許容列が結果テーブルの末尾に自動的に追加され、そのデータが同期されます。既存の行については、この新しい列に自動的に NULL が入力されます。
列名の変更:この操作は列の削除と新しい列の追加として扱われます。指定された名前の新しい列が結果テーブルの末尾に追加され、元の名前の列には自動的に NULL 値が入力されます。たとえば、col_a が col_b に名前変更された場合、col_b 列が結果テーブルの末尾に追加され、col_a 列には自動的に NULL 値が入力されます。
列のデータ型の変更:サポートされていません。Hologres は列のデータ型の変更をサポートしていないため、
sink.type-normalize-strategyパラメーターを使用する必要があります。次のスキーマ変更はサポートされていません:
プライマリキーやインデックスなどの制約の変更。
NOT NULL 列の削除。
列の NOT NULL から NULL 許容への変更。
EVOLVE
EVOLVE モードでは、スキーマ変更は次のように処理されます:
NULL 許容列の追加:サポートされています。
NULL 許容列の削除:サポートされていません。
NOT NULL 列を追加します。結果テーブルに新しい NULL 許容の列が追加されます。
列名の変更:サポートされています。結果テーブルで元の列名が変更されます。
列のデータ型の変更:サポートされていません。Hologres は列のデータ型の変更をサポートしていないため、
sink.type-normalize-strategyパラメーターを使用する必要があります。次のスキーマ変更はサポートされていません:
プライマリキーやインデックスなどの制約の変更。
NOT NULL 列の削除。
列の NOT NULL から NULL 許容への変更。
EVOLVE モードでは、結果テーブルを削除せずにステートレスで再起動を行うと、アップストリームデータと結果テーブルのスキーマ間に不整合が生じてパイプラインが失敗する可能性があります。その場合は、手動で結果テーブルのスキーマを調整する必要があります。
例については、「EVOLVE モードの有効化」をご参照ください。
コード例
型の拡張
sink.type-normalize-strategy パラメーターを使用して、型の拡張を構成します。
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
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipelineパーティションテーブルへの書き込み
create_time タイムスタンプフィールドを日付型に変換し、Hologres テーブルのパーティションキーとして使用します。
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
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# 存在しないパーティションテーブルを自動的に作成します。
createparttable: true
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 Hologres PipelineEVOLVE モードの有効化
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
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# 存在しないパーティションテーブルを自動的に作成します。
createparttable: true
pipeline:
name: MySQL to Hologres Pipeline
schema.change.behavior: evolve単一テーブルの同期
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
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipelineフルデータベースの同期
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipelineシャード化されたテーブルのマージ
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.user\.*
server-id: 5401-5499
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
route:
# MySQL test_db データベース内のすべてのシャード化されたテーブルが、test_db.user という名前の単一の Hologres テーブルにマージされます。
- source-table: test_db.user\.*
sink-table: test_db.user
pipeline:
name: MySQL to Hologres Pipeline指定されたスキーマへの同期
Hologres では、スキーマは MySQL のデータベースに対応します。結果テーブルのスキーマを指定できます。
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.user\.*
server-id: 5401-5499
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
route:
# MySQL test_db データベースのすべてのテーブルを Hologres test_db2 スキーマに同期し、元のテーブル名を維持します。
- source-table: test_db.\.*
sink-table: test_db2.<>
replace-symbol: <>
pipeline:
name: MySQL to Hologres Pipeline再起動せずに新規テーブルを同期
ジョブ実行中に新しく追加されたテーブルをリアルタイムで同期するには、scan.binlog.newly-added-table.enable = true を設定します。
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
server-id: 5401-5499
# ジョブ実行中に新しく作成されたテーブルを自動的にキャプチャします。
scan.binlog.newly-added-table.enabled: true
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipeline再起動時に既存のテーブルを追加
同期に既存のテーブルを含めるには、scan.newly-added-table.enabled を true に設定してジョブを再起動します。
以前に scan.binlog.newly-added-table.enabled を使用して実行されたジョブで scan.newly-added-table.enabled を使用しないでください。この組み合わせにより、再起動時にデータが重複する可能性があります。
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
# 再起動時に、`tables` パラメーターに一致する新しいテーブルをスキャンしてスナップショットを実行します。
# 注:このパラメーターは scan.startup.mode: initial と共に使用する必要があります。
scan.newly-added-table.enabled: true
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipelineテーブルの除外
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: flink
password: ${secret_values.password}
tables: test_db.\.*
# この正規表現に一致するテーブルを除外します。
tables.exclude: test_db.table1
server-id: 5401-5499
sink:
type: hologres
name: Hologres Sink
endpoint: <yourEndpoint>
dbname: <yourDbname>
username: ${secret_values.ak_id}
password: ${secret_values.ak_secret}
# CDC データ型をより広い範囲の Hologres 型にマッピングします。
sink.type-normalize-strategy: BROADEN
pipeline:
name: MySQL to Hologres Pipeline関連ドキュメント
ソース、sink、変換、ルートモジュールの詳細については、「Flink CDC データインジェストジョブ開発リファレンス」をご参照ください。
データインジェスト YAML ジョブを開発するには、「Flink CDC データインジェストジョブ開発」をご参照ください。