Hologres コネクタの使用方法を説明します。
背景情報
Hologres は、大規模なデータセットの取り込み、更新、分析を行うための統合リアルタイムデータウェアハウスです。標準 SQL (PostgreSQL プロトコル互換)、ペタバイト規模のオンライン分析処理 (OLAP)、アドホック分析、高コンカレンシーかつ低レイテンシーのデータサービングをサポートしています。Hologres は MaxCompute、Realtime Compute for Apache Flink、DataWorks と密接に連携し、オフラインおよびオンラインのデータウェアハウス向けに、フルスタックの統合ソリューションを提供します。次の表に、Hologres コネクタの機能を示します。
|
カテゴリ |
説明 |
|
対応タイプ |
ソーステーブル、ディメンションテーブル、シンクテーブル |
|
実行モード |
ストリームモードとバッチモード |
|
データ形式 |
非対応 |
|
固有の監視メトリクス |
|
|
API タイプ |
DataStream と SQL |
|
シンクテーブルでのデータ更新・削除のサポート |
はい |
機能
|
機能 |
説明 |
|
CDC モードと非 CDC モードの両方で、バイナリログの有無を問わず、Hologres データの読み取りをサポートします。 |
|
|
完全(フル)、増分(インクリメンタル)、および 統合された完全(フル)と増分(インクリメンタル) の消費をサポートします。 |
|
|
新しいデータを無視する、行全体を置換する、または 特定のフィールド のみを更新できます。 |
|
|
行全体ではなく、変更された列 のみを更新します。 |
|
|
物理パーティションテーブルと論理パーティションテーブルの両方からのバイナリログ消費をサポートします。物理パーティションテーブルの場合、単一のジョブで、新たに追加されたもの を含むすべてのパーティションを監視できます。 |
|
|
親テーブルに書き込むことで、対応する子パーティションを 自動的に作成できます。 |
|
|
単一テーブルまたはデータベース全体のリアルタイム同期 |
単一テーブルまたはデータベース全体のリアルタイム同期をサポートします。主な機能は次のとおりです:
詳細については、「CREATE TABLE AS (CTAS) ステートメント」および「リアルタイムデータベース同期のクイックスタート」をご参照ください。 |
制約と推奨事項
制約
-
外部テーブルの非サポート:Hologres コネクタは、MaxCompute 外部テーブルなどの Hologres 外部テーブル をサポートしていません。
-
時刻型の制約:Hologres コネクタは現在、
TIMESTAMPデータのリアルタイム消費をサポートしていません。テーブルを作成する際は、TIMESTAMPTZ型のみを使用してください。 -
ソーステーブルのスキャンモード (Ververica Runtime (VVR) 8 以前):デフォルトでは、コネクタはバッチモードでデータを読み取り、テーブル全体を 1 回だけスキャンします。そのため、新たに追加されたデータは消費されません。
-
ウォーターマークの制約 (Ververica Runtime (VVR) 8 以前):CDC モードはウォーターマーク定義をサポートしていません。ウィンドウ集約を実行する場合は、代わりに 非ウィンドウ集約ソリューション を使用してください。
-
COPY モードにおける時間関数の挙動:
COPY_STREAMまたはCOPY_BULK_LOADの書き込みモードを使用する場合、CURRENT_TIMESTAMPまたはNOW()をデフォルトとして使用するテーブル列の値は接続開始時刻に固定され、行ごとに更新されません。hg_binlog_timestamp_usのバイナリログメタデータ列には、実際のインジェスト時間が格納されます。
推奨事項
-
ストレージフォーマットの選択
-
ディメンションテーブルのポイントルックアップの場合:行指向ストレージを使用します。プライマリキーとクラスタリングキーを設定する必要があります。
-
ディメンションテーブルに対する 1 対多のクエリの場合:列指向ストレージを使用します。パフォーマンスを最適化するため、分散キー と セグメントキー を適切に設定してください。
-
頻繁な更新と分析クエリが必要なテーブルの場合:テーブルでリアルタイムのバイナリログ消費と OLAP 分析の両方をサポートする必要がある場合は、行列混在ストレージの使用を強く推奨します。
重要Hologres でテーブルを作成する際にストレージフォーマットを指定しない場合、デフォルトで 列指向ストレージ になります。テーブル作成後にストレージフォーマットを変更することはできません。詳細については、「Create a Table in Hologres」および「Table Storage Formats: Row-oriented, Column-oriented, and Row-column Hybrid」をご参照ください。
-
-
ジョブの並列度の設定:Flink ジョブの並列度は、Hologres テーブルのシャード数と一致するように設定してください。
-- HoloWeb で次の文を実行してテーブルのシャード数を確認します。<tablename> をテーブル名に置き換えてください。 select tg.property_value from hologres.hg_table_properties tb join hologres.hg_table_group_properties tg on tb.property_value = tg.tablegroup_name where tb.property_key = 'table_group' and tg.property_key = 'shard_count' and table_name = '<tablename>'; -
バージョンと機能:既知の問題、機能アップデート、バージョン互換性に関する情報については、Hologres コネクタのリリースノート を定期的に確認してください。
注意事項
-
Hologres と VVR の消費モードの互換性と制約
ソーステーブル
-
VVR 8 以前では、
sdkModeパラメーターを使用して消費モードを選択します。 -
VVR 11 以降では、
source.binlog.read-modeパラメーターを使用して消費モードを選択します。
VVR バージョン
Hologres バージョン
デフォルト値/推奨値
実際の消費モード
注意事項
≥ 6.0.7
< 2.0
カスタム
holohub (デフォルト)
値を
jdbcに設定することをお勧めします。6.0.7 ~ 8.0.4
≥ 2.0
jdbc (自動切り替え、設定不要)
jdbc (強制)
Hologres 2.0 以降では、
holohubサービスは非推奨になりました。システムは自動的にjdbcモードに切り替わり、権限の問題が発生する可能性があります。権限設定については、「権限の問題」をご参照ください。≥ 8.0.5
≥ 2.1
jdbc (自動切り替え、設定不要)
jdbc (強制)
権限の問題はありません。Hologres 2.1.27 以降では、モードは
jdbc_fixedに切り替わります。≥ 11.1
すべてのバージョン
AUTO (デフォルト)
Hologres バージョンに基づいて自動選択
-
Hologres 2.1.27 以降では、
jdbcモードが選択され、デフォルトで軽量接続が有効になります (connection.fixed.enabledパラメーターはtrueに設定されています)。 -
Hologres のバージョン 2.1.0 から 2.1.26 では、
jdbcモードが選択されます。 -
Hologres 2.0 以前では、
holohubモードが選択されます。
重要VVR 11.1 以降では、コネクタはデフォルトで binlog データを消費します。binlog が有効になっていることを確認してください。有効になっていない場合、エラーが発生する可能性があります。
シンクテーブル
-
VVR 8 以前の場合は、
sdkModeパラメーターを使用してデータ書き込みモードを選択します。 -
VVR 11 以降では、
sink.write-modeパラメーターを使用してデータ書き込みモードを選択します。
VVR バージョン
Hologres バージョン
RPC モードへの影響
実際の書き込みモード
デフォルト値/推奨値
注意事項
6.0.4 ~ 8.0.2
< 2.0
なし
rpc
カスタム
該当なし
6.0.4 ~ 8.0.2
≥ 2.0
あり
jdbc_fixed (自動切り替え)
カスタム
重複排除を防ぐため、
'jdbcWriteBatchSize'='1'に設定してください。8.0.3 ~ 8.0.4
すべてのバージョン
あり
jdbc_fixed (自動切り替え)
カスタム
モードを
rpcとして設定すると、重複排除を防ぐために、モードは自動的にjdbc_fixedに切り替わり、'jdbcWriteBatchSize'='1' が設定されます。≥ 8.0.5
すべてのバージョン
あり
jdbc_fixed (自動切り替え)
カスタム
モードを
rpcに設定すると、システムはモードを自動的にjdbc_fixedに切り替え、重複排除を防ぐために 'deduplication.enabled'='false' に設定します。重要-
Hologres 2.0 以降では、
rpcサービスは非推奨です。このパラメーターをrpcに設定した場合、Flink は値を自動的にjdbc_fixedに切り替えます。パラメーターに別の値を設定した場合、Flink は指定された値を使用します。 -
VVR 11.1 以降では、
rpcモードは削除されています。接続にはjdbcモードの使用を推奨します。 -
高同時実行シナリオにおける書き込み操作では、
jdbc_copyまたはCOPY_STREAMモードを使用することをお勧めします。
ディメンションテーブル
VVR バージョン
Hologres バージョン
RPC モードへの影響
実際の消費モード
デフォルト値/推奨値
注意事項
6.0.4 ~ 8.0.2
< 2.0
なし
rpc
カスタム
該当なし
6.0.4 ~ 8.0.2
≥ 2.0
あり
jdbc_fixed (自動切り替え)
カスタム
バージョン 2.0 以降の Hologres インスタンスでは、
rpcサービスは非推奨です。このパラメーターをrpcに設定した場合、Flink は値を自動的にjdbc_fixedに切り替えます。ただし、パラメーターに別の値を設定した場合、Flink は指定した値を使用します。≥ 8.0.3
すべてのバージョン
あり
jdbc_fixed (自動切り替え)
カスタム
≥ 8.0.5
すべてのバージョン
あり
jdbc_fixed (自動切り替え)
カスタム
重要VVR 11.1 以降では
rpcモードが削除され、デフォルトで接続にjdbcモードが使用されます。また、connection.fixed.enabledパラメーターを設定して、軽量接続モードを有効にすることもできます。 -
-
JDBC モードにおける binlog ソーステーブルからの
JSONBデータ読み取りと GUC パラメーターの有効化-- データベースレベルで GUC パラメーターを有効にします。このコマンドはスーパーユーザーのみが実行できます。各データベースで一度だけ実行する必要があります。 alter database <db_name> set hg_experimental_enable_binlog_jsonb = on; -
UPDATE操作は、まず更新前のデータに対するupdate_beforeレコード、次に更新後のデータに対するupdate_afterレコードという、2 つの連続した binlog レコードを生成します。 -
binlog ソーステーブルでは、
TRUNCATEやその他のテーブル再構築操作を実行しないでください。 詳細については、「よくある質問」をご参照ください。 -
エラーを回避するため、Flink と Hologres の間で
DECIMAL型の精度を一致させてください。 詳細については、「よくある質問」をご参照ください。 -
ソーステーブルから全量データと増分データを統合して消費するために
initialモードを使用する場合、グローバルな順序は保証されません。下流システムが時間ベースの計算に依存する場合は、別の binlog-only 消費モードを使用してください。
バイナリログの有効化
新規テーブルの場合
リアルタイムデータ読み取り機能はデフォルトでは無効になっています。そのため、HoloWeb で DDL 文を使用してテーブルを作成する際は、binlog.level および binlog.ttl パラメーターを設定する必要があります。以下に例を示します。
begin;
create table test_table(
id int primary key,
title text not null,
body text);
call set_table_property('test_table', 'orientation', 'row');-- test_table という名前の行指向テーブルを作成します。
call set_table_property('test_table', 'clustering_key', 'id');-- id 列にクラスタリングキーを作成します。
call set_table_property('test_table', 'binlog.level', 'replica');-- バイナリログ機能を有効にします。
call set_table_property('test_table', 'binlog.ttl', '86400');-- バイナリログの Time-to-Live (TTL) を秒単位で設定します。
commit;
既存テーブルの場合
HoloWeb では、次の文を使用して既存テーブルのバイナリログを有効化し、Time-to-Live (TTL) を設定できます。table_name は、バイナリログを有効にするテーブルの名前です。
-- バイナリログ機能を有効にします。
begin;
call set_table_property('<table_name>', 'binlog.level', 'replica');
commit;
-- バイナリログの Time-to-Live (TTL) を秒単位で設定します。
begin;
call set_table_property('<table_name>', 'binlog.ttl', '2592000');
commit;
WITH パラメーター
VVR 11 以降、Hologres のコネクタオプションが更新されました。一部のパラメーターは名前が変更されたか、削除された可能性があります。VVR 11 は VVR 8 と下位互換性があります。お使いの VVR バージョンのパラメータードキュメントをご参照ください。
データ型マッピング
Flink と Hologres 間のデータ型マッピングについては、「Flink と Hologres 間のデータ型マッピング」をご参照ください。
Hologres は、生成列を定義するための GENERATED ALWAYS AS 構文をサポートしています。 例:
ds TIMESTAMP NOT NULL GENERATED ALWAYS AS (date_trunc('month', create_time)) STORED
生成列の NOT NULL 制約は、期待どおり、null 値許容フィールドにマッピングされます。 生成列の値は Hologres によって計算されるため、Flink はこのフィールドに値を書き込みません。 NOT NULL 制約が保持された場合、書き込み操作は Hologres クライアントでの検証に失敗します。 この動作は、通常の列の NOT NULL 制約 (たとえば、ds TIMESTAMP NOT NULL) には影響を与えません。
例
ソーステーブルの例
バイナリログソーステーブル
CDC モード
このモードでは、ソースはバイナリログデータを消費し、hg_binlog_event_type に基づいて各行に適切な Flink RowKind タイプを自動的に設定するため、明示的な宣言は不要です。これらのタイプには、INSERT、DELETE、UPDATE_BEFORE、UPDATE_AFTER が含まれます。これにより、MySQL や PostgreSQL などのデータベースの変更データキャプチャ (CDC) 機能と同様に、テーブルデータのミラーリングが可能になります。以下に、ソーステーブルの DDL の例を示します。
VVR 11+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password'='${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog.change-log-mode'='ALL', -- INSERT、DELETE、UPDATE_BEFORE、UPDATE_AFTER を含むすべてのチェンジログタイプを消費します。
'retry-count'='10', -- バイナリログの読み取りエラーに対するリトライ回数。
'retry-sleep-step-ms'='5000', -- リトライ間のインクリメンタルバックオフ時間。最初のリトライは 5 秒、2 回目は 10 秒待機し、以降同様です。
'source.binlog.batch-size'='512' -- バイナリログデータを消費するためのバッチサイズ。
);
VVR 8+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'cdcMode' = 'true',
'sdkMode'='jdbc',
'binlogMaxRetryTimes' = '10', -- バイナリログの読み取りエラーに対するリトライ回数。
'binlogRetryIntervalMs' = '500', -- バイナリログの読み取りエラー後の再試行間隔 (ミリ秒)。
'binlogBatchReadSize' = '100' -- バイナリログデータを消費するためのバッチサイズ。
);
非 CDC モード
このモードでは、ソースは消費したバイナリログデータを通常の Flink データとしてダウンストリームノードに渡し、すべてのレコードを INSERT タイプとして扱います。ビジネス要件に基づいて、特定の hg_binlog_event_type を持つレコードを処理できます。以下に、ソーステーブルの DDL の例を示します。
VVR 11+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog.change-log-mode'='ALL_AS_APPEND_ONLY', -- すべてのチェンジログタイプを INSERT 操作として扱います。
'retry-count'='10', -- バイナリログの読み取りエラーに対するリトライ回数。
'retry-sleep-step-ms'='5000', -- リトライ間のインクリメンタルバックオフ時間。最初のリトライは 5 秒、2 回目は 10 秒待機し、以降同様です。
'source.binlog.batch-size'='512' -- バイナリログデータを消費するためのバッチサイズ。
);
VVR 8+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'binlogMaxRetryTimes' = '10', -- バイナリログの読み取りエラーに対するリトライ回数。
'binlogRetryIntervalMs' = '500', -- バイナリログの読み取りエラー後の再試行間隔 (ミリ秒)。
'binlogBatchReadSize' = '100' -- バイナリログデータを消費するためのバッチサイズ。
);
非バイナリログソーステーブル
VVR 11+
VVR 11.1 以降、コネクタはデフォルトでバイナリログデータを消費します。非バイナリログソーステーブルから読み取るには、source.binlog を false に明示的に設定する必要があります。詳細については、「バイナリログソーステーブル」をご参照ください。
CREATE TEMPORARY TABLE hologres_source (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog'='false' -- バイナリログデータを消費するかどうかを指定します。
);
VVR 8+
CREATE TEMPORARY TABLE hologres_source (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キーの漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'sdkMode' = 'jdbc'
);
シンクテーブル
CREATE TEMPORARY TABLE datagen_source(
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='datagen'
);
CREATE TEMPORARY TABLE hologres_sink (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- AK/SK キー漏洩を防ぐため、変数管理を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>'
);
INSERT INTO hologres_sink SELECT * from datagen_source;
ディメンションテーブルの例
CREATE TEMPORARY TABLE datagen_source (
a INT,
b BIGINT,
c STRING,
proctime AS PROCTIME()
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE hologres_dim (
a INT,
b VARCHAR,
c VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- キー漏洩を防ぐため、AccessKey ペアには変数を使用します。
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>'
);
CREATE TEMPORARY TABLE blackhole_sink (
a INT,
b STRING
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink SELECT T.a,H.b
FROM datagen_source AS T JOIN hologres_dim FOR SYSTEM_TIME AS OF T.proctime AS H ON T.a = H.a;
高度な機能
統合された全量および増分インジェスト
シナリオ
-
この機能は、プライマリキーを持つソーステーブルにのみ適用されます。CDC モードを使用する Hologres ソーステーブルに推奨されます。
-
Hologres では、オンデマンドで Binlog を有効にできます。すでにデータが含まれている既存のテーブルに対してBinlog を有効化できます。
コード例
VVR 11+
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'source.binlog.startup-mode' = 'INITIAL', --すべての履歴データを読み取った後、Binlog を増分で読み取ります。
'retry-count'='10', --Binlog データの読み取り中にエラーが発生した場合のリトライ回数。
'retry-sleep-step-ms'='5000', --リトライ間の増分待機時間。最初のリトライは 5 秒、2 回目は 10 秒待機し、以降同様です。
'source.binlog.batch-size'='512' --1 回のバッチで Binlog から読み取る行数。
);
-
source.binlog.startup-modeをINITIALに設定すると、テーブルの初期全量読み取りを実行してから、Binlog の増分読み取りに切り替わります。 -
startTimeパラメーターが、直接、または起動 UI で開始時間を選択することによって設定された場合、startTimeパラメーターは優先度が高いため、他のモード設定よりも優先され、binlogStartUpModeはtimestampモードに設定されます。
VVR 8+
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'cdcMode' = 'true',
'binlogStartUpMode' = 'initial', --すべての履歴データを読み取った後、Binlog を増分で読み取ります。
'binlogMaxRetryTimes' = '10', --Binlog データの読み取り中にエラーが発生した場合のリトライ回数。
'binlogRetryIntervalMs' = '500', --Binlog 読み取りエラー後のリトライ間隔 (ミリ秒)。
'binlogBatchReadSize' = '100' --1 回のバッチで Binlog から読み取る行数。
);
-
binlogStartUpModeをinitialに設定すると、テーブルの初期全量読み取りを実行してから、Binlog の増分読み取りに切り替わります。 -
startTimeパラメーターが直接、または起動 UI で開始時間を選択して設定されると、その設定が優先され、binlogStartUpModeがtimestampモードに設定され、他のモード設定が上書きされます。これは、startTimeパラメーターの優先度が高いためです。
プライマリキーの競合の解決
Hologres にデータを書き込む際、コネクタはプライマリキーが重複するレコードを処理するための 3 つの戦略を提供します。
VVR 11+
sink.on-conflict-action パラメーターを設定することで、戦略を指定できます。
|
値 |
説明 |
|
INSERT_OR_IGNORE |
最初に到着したレコードを保持し、後続の重複レコードを無視します。 |
|
INSERT_OR_REPLACE |
既存のレコードを新しいレコードで上書きします。 |
|
INSERT_OR_UPDATE (デフォルト) |
シンクテーブルで指定された列のみを更新し、既存のレコードの他の列は変更しません。 |
VVR 8+
mutatetype パラメーターを設定することで、戦略を指定できます。
|
値 |
説明 |
|
insertorignore (デフォルト) |
最初に到着したレコードを保持し、後続の重複レコードを無視します。 |
|
insertorreplace |
既存のレコードを新しいレコードで上書きします。 |
|
insertorupdate |
シンクテーブルで指定された列のみを更新し、既存のレコードの他の列は変更しません。 |
例えば、テーブルに列 a、b、c、d があり、a がプライマリキーであるとします。シンクテーブルが列 a と b のみを提供する場合、戦略を INSERT_OR_UPDATE に設定すると、列 b のみが更新されます。列 c と d は変更されません。
ただし、シンクテーブルで省略された物理テーブルの列は、NULL 値を許容する必要があります。そうでない場合、書き込み操作は失敗します。
パーティションテーブルへの書き込み
デフォルトでは、Hologres シンクは単一の非パーティションテーブルにデータを書き込みます。その親テーブルをターゲットとしてパーティションテーブルに書き込むには、以下のオプションを有効にする必要があります。
VVR 11+
コネクタが存在しない子パーティションを自動的に作成できるようにするには、sink.create-missing-partition を true に設定します。
-
VVR 11.1 以降のバージョンは、デフォルトでパーティションテーブルへの書き込みをサポートし、データを正しい子パーティションに自動的にルーティングします。
-
tablenameパラメーターを親テーブルの名前に設定します。 -
必要な子パーティションが存在せず、
sink.create-missing-partition=trueが設定されていない場合、書き込み操作は失敗します。
VVR 8+
-
データを対応する子パーティションに自動的にルーティングするには、
partitionRouterをtrueに設定します。 -
コネクタが存在しない子パーティションを自動的に作成できるようにするには、
createparttableをtrueに設定します。
-
tablenameパラメーターを親テーブルの名前に設定します。 -
必要な子パーティションが存在せず、
createparttable=trueが設定されていない場合、書き込み操作は失敗します。
ストリームのマージと部分更新
複数のデータストリームを単一の Hologres ワイドテーブルに書き込む際、コネクタは同じプライマリキーを共有するレコードを自動的にマージできます。また、行全体を置き換えるのではなく、変更された列のみを更新する部分更新も実行できます。これにより、書き込みパフォーマンスとデータの一貫性が向上します。
制限事項
-
ワイドテーブルにはプライマリキーが必要です。
-
各データストリームには、プライマリキーを構成するすべての列を含める必要があります。
-
列指向ストレージを使用するワイドテーブルの場合、高い秒間リクエスト数 (RPS) でストリームをマージすると、高い CPU 使用率を引き起こす可能性があります。これを軽減するには、テーブルの列のディクショナリエンコーディングを無効にすることを検討してください。
例
2 つの Flink データストリームがあるとします。最初のストリームには列 a、b、c が含まれます。2 番目のストリームには列 a、d、e が含まれます。Hologres ワイドテーブル WIDE_TABLE には列 a、b、c、d、e が含まれ、列 a がプライマリキーです。
VVR 11+
// source1 と source2 はすでに定義されています。
CREATE TEMPORARY TABLE hologres_sink ( -- 列 a、b、c、d、e を宣言します。
a BIGINT,
b STRING,
c STRING,
d STRING,
e STRING,
primary key(a) not enforced
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourWideTablename>', -- Hologres ワイドテーブル。列 a、b、c、d、e を含みます。
'username' = '${secret_values.ak_id}',
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'sink.on-conflict-action'='INSERT_OR_UPDATE', -- プライマリキーに基づいて特定の列を更新します。
'sink.delete-strategy'='IGNORE_DELETE', -- リトラクションメッセージを処理するための戦略。IGNORE_DELETE は、削除操作が不要な追記専用またはアップサートストリームに適しています。
'sink.partial-insert.enabled'='true' -- 部分更新を有効にします。INSERT ステートメントで指定された列のみがコネクタに送信されます。
);
BEGIN STATEMENT SET;
INSERT INTO hologres_sink(a,b,c) select * from source1; -- 列 a、b、c のみが挿入されることを宣言します。
INSERT INTO hologres_sink(a,d,e) select * from source2; -- 列 a、d、e のみが挿入されることを宣言します。
END;
VVR 8+
// source1 と source2 はすでに定義されています。
CREATE TEMPORARY TABLE hologres_sink ( -- 列 a、b、c、d、e を宣言します。
a BIGINT,
b STRING,
c STRING,
d STRING,
e STRING,
primary key(a) not enforced
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourWideTablename>', -- Hologres ワイドテーブル。列 a、b、c、d、e を含みます。
'username' = '${secret_values.ak_id}',
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'mutatetype'='insertorupdate', -- プライマリキーに基づいて特定の列を更新します。
'ignoredelete'='true', -- リトラクションメッセージによって生成された DELETE リクエストを無視します。
'partial-insert.enabled'='true' -- 部分更新を有効にして、INSERT ステートメントで宣言された列のみを更新します。
);
BEGIN STATEMENT SET;
INSERT INTO hologres_sink(a,b,c) select * from source1; -- 列 a、b、c のみが挿入されることを宣言します。
INSERT INTO hologres_sink(a,d,e) select * from source2; -- 列 a、d、e のみが挿入されることを宣言します。
END;
リトラクションメッセージによって生成される Delete リクエストを無視するには、ignoredelete を true に設定します。VVR 8.0.8 以降では、部分更新のさまざまな戦略を設定するために sink.delete-strategy を使用することを推奨します。
パーティションテーブルからのバイナリログの消費 (Beta)
パーティションテーブルは、データのアーカイブとクエリパフォーマンスの向上に役立ちます。Hologres コネクタは、物理パーティションテーブルと論理パーティションテーブルの両方からバイナリログを消費できます。物理パーティションテーブルと論理パーティションテーブルの違いについては、「CREATE LOGICAL PARTITION TABLE」をご参照ください。
物理パーティションテーブルからのバイナリログの消費
Hologres コネクタは、パーティションテーブルからバイナリログを消費し、単一のジョブ内で新しいパーティションを動的に監視できます。これにより、リアルタイムのデータ処理の効率と使いやすさが大幅に向上します。
注意事項
-
この機能は、JDBC モードでバイナリログを使用するソーステーブルでのみ利用可能です。VVR 8.0.11 以降、および Hologres インスタンスのバージョン 2.1.27 以降が必要です。
-
パーティション名は、
{parent_table}_{partition_value}という形式に厳密に従う必要があります。この形式に従わないパーティションは、コネクタが消費しない可能性があります。詳細については、「動的パーティショニング」をご参照ください。重要-
DYNAMIC モードの場合、VVR バージョン 8.0.11 は
-区切り文字を使用するパーティション列 (YYYY-MM-DD など) に対応していません。 -
VVR 11.1 以降では、カスタム形式を使用するパーティション列からデータを消費できます。
-
この制限は、パーティションテーブルへの書き込み時には適用されません。
-
-
Flink で Hologres ソーステーブルを宣言する際は、パーティション列を含める必要があります。
-
DYNAMIC モードでは、パーティションテーブルで動的パーティショニングが有効になっている必要があります。さらに、パーティション事前作成パラメーター
auto_partitioning.num_precreateが 1 より大きい必要があります。そうでない場合、ジョブは最新のパーティションを消費しようとすると例外をスローします。 -
DYNAMIC モードでは、新しいパーティションが追加されると、コネクタは古いパーティションからの以降のデータ変更を消費しなくなります。
例
|
モード |
機能 |
説明 |
|
DYNAMIC |
動的パーティションの消費 |
新しいパーティションを時系列順に自動的に監視して消費します。このモードは、リアルタイムのデータストリーミングシナリオに適しています。 |
|
STATIC |
静的パーティションの消費 |
既存のパーティション (または手動で指定されたパーティション) のみを消費し、新しいパーティションを自動的に検出しません。このモードは、固定範囲内の履歴データを処理する場合に適しています。 |
動的モード
VVR 11+
次の DDL で Hologres パーティションテーブルを作成し、バイナリログと動的パーティショニングが有効になっていると仮定します。
CREATE TABLE "test_message_src1" (
id int,
title text,
body text,
dt text,
PRIMARY KEY (id, dt)
)
PARTITION BY LIST (dt) WITH (
binlog_level = 'replica',
auto_partitioning_enable = 'true', -- 動的パーティショニングを有効にします。
auto_partitioning_time_unit = 'DAY', -- パーティションは毎日作成されます。パーティション名の例: test_message_src1_20250512, test_message_src1_20250513。
auto_partitioning_num_precreate = '2' -- 2 つのパーティションを事前作成します。
);
-- 既存のパーティションテーブルの場合、ALTER TABLE を使用して動的パーティショニングを有効にすることもできます。
Flink では、次の SQL ステートメントを使用して、パーティションテーブル test_message_src1 を DYNAMIC モードで消費します。
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
dt VARCHAR -- Hologres パーティションテーブルのパーティション列。
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src1', -- 動的パーティショニングが有効になっている親テーブル。
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'source.binlog.partition-binlog-mode' = 'DYNAMIC', -- 最新のパーティションを動的に監視します。
'source.binlog.startup-mode' = 'initial' -- すべての既存データを消費してから、バイナリログから増分データを消費します。
);
VVR 8.0.11
次の DDL で Hologres パーティションテーブルを作成し、バイナリログと動的パーティショニングが有効になっていると仮定します。
CREATE TABLE "test_message_src1" (
id int,
title text,
body text,
dt text,
PRIMARY KEY (id, dt)
)
PARTITION BY LIST (dt) WITH (
binlog_level = 'replica',
auto_partitioning_enable = 'true', -- 動的パーティショニングを有効にします。
auto_partitioning_time_unit = 'DAY', -- パーティションは毎日作成されます。パーティション名の例: test_message_src1_20241027, test_message_src1_20241028。
auto_partitioning_num_precreate = '2' -- 2 つのパーティションを事前作成します。
);
-- 既存のパーティションテーブルの場合、ALTER TABLE を使用して動的パーティショニングを有効にすることもできます。
Flink では、次の SQL ステートメントを使用して、パーティションテーブル test_message_src1 のデータを DYNAMIC モードで消費します。
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
dt VARCHAR -- Hologres パーティションテーブルのパーティション列。
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src1', -- 動的パーティショニングが有効になっている親テーブル。
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'binlog' = 'true',
'partition-binlog.mode' = 'DYNAMIC', -- 最新のパーティションを動的に監視します。
'binlogstartUpMode' = 'initial', -- すべての既存データを消費してから、バイナリログから増分データを消費します。
'sdkMode' = 'jdbc_fixed' -- 接続制限の問題を回避するため、このモードを使用します。
);
静的モード
VVR 11+
次の DDL で Hologres パーティションテーブルを作成し、バイナリログが有効になっていると仮定します。
CREATE TABLE test_message_src2 (
id int,
title text,
body text,
color text,
PRIMARY KEY (id, color)
)
PARTITION BY LIST (color) WITH (
binlog_level = 'replica'
);
create table test_message_src2_red partition of test_message_src2 for values in ('red');
create table test_message_src2_blue partition of test_message_src2 for values in ('blue');
create table test_message_src2_green partition of test_message_src2 for values in ('green');
create table test_message_src2_black partition of test_message_src2 for values in ('black');
Flink では、次の SQL ステートメントを使用して、パーティションテーブル test_message_src2 を STATIC モードで消費します。
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
color VARCHAR -- Hologres パーティションテーブルのパーティション列。
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src2', -- パーティションテーブル。
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'source.binlog.partition-binlog-mode' = 'STATIC', -- 固定されたパーティションセットを消費します。
'source.binlog.partition-values-to-read' = 'red,blue,green', -- 指定された 3 つのパーティションのみを消費します。'black' パーティションは消費されません。新しいパーティションも消費されません。このオプションを指定しない場合、ジョブは親テーブルのすべてのパーティションを消費します。
'source.binlog.startup-mode' = 'initial' -- すべての既存データを消費してから、バイナリログから増分データを消費します。
);
VVR 8.0.11
次の DDL で Hologres パーティションテーブルを作成し、バイナリログが有効になっていると仮定します。
CREATE TABLE test_message_src2 (
id int,
title text,
body text,
color text,
PRIMARY KEY (id, color)
)
PARTITION BY LIST (color) WITH (
binlog_level = 'replica'
);
create table test_message_src2_red partition of test_message_src2 for values in ('red');
create table test_message_src2_blue partition of test_message_src2 for values in ('blue');
create table test_message_src2_green partition of test_message_src2 for values in ('green');
create table test_message_src2_black partition of test_message_src2 for values in ('black');
Flink では、次の SQL ステートメントを使用して、パーティションテーブル test_message_src2 のデータを STATIC モードで消費します。
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
color VARCHAR -- Hologres パーティションテーブルのパーティション列。
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src2', -- パーティションテーブル。
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'binlog' = 'true',
'partition-binlog.mode' = 'STATIC', -- 固定されたパーティションセットを消費します。
'partition-values-to-read' = 'red,blue,green', -- 指定された 3 つのパーティションのみを消費します。'black' パーティションは消費されません。新しいパーティションも消費されません。このオプションを指定しない場合、ジョブは親テーブルのすべてのパーティションを消費します。
'binlogstartUpMode' = 'initial', -- すべての既存データを消費してから、バイナリログから増分データを消費します。
'sdkMode' = 'jdbc_fixed' -- 接続制限の問題を回避するため、このモードを使用します。
);
論理パーティションテーブルからのバイナリログの消費
Hologres コネクタは、論理パーティションテーブルからバイナリログを消費でき、オプションで消費するパーティションを指定できます。
注意事項
-
論理パーティションテーブルの特定のパーティションからバイナリログを消費するには、VVR 11.0.0 以降、および Hologres インスタンスのバージョン V3.1 以降が必要です。
-
論理パーティションテーブルのすべてのパーティションからバイナリログを消費することは、パーティション化されていない Hologres テーブルからバイナリログを消費することと同じです。詳細については、「ソーステーブル」をご参照ください。
例
|
パラメーター |
説明 |
例 |
|
source.binlog.logical-partition-filter-column-names |
消費するパーティションを指定するパーティション列名。列名は二重引用符 (") で囲みます。複数の列名はカンマ (,) で区切ります。列名に二重引用符が含まれている場合は、追加の二重引用符でエスケープします。 |
'source.binlog.logical-partition-filter-column-names'='"Pt","id"' Pt と id の 2 つのパーティション列が使用されます。 |
|
source.binlog.logical-partition-filter-column-values |
消費するパーティションを指定するパーティション値。パーティションは、各パーティション列に 1 つずつ対応する値のセットで指定されます。各値は二重引用符 (") で囲みます。同じパーティションの値はカンマ (,) で区切ります。パーティションはセミコロン (;) で区切ります。値に二重引用符が含まれている場合は、追加の二重引用符でエスケープします。 |
'source.binlog.logical-partition-filter-column-values'='"20240910","0";"special""value","9"' これにより、消費する 2 つのパーティションが指定されます。1 つ目のパーティション値は (20240910, 0)、2 つ目は (special"value, 9) です。 |
Hologres で次のテーブルを作成したと仮定します。
CREATE TABLE holo_table (
id int not null,
name text,
age numeric(18,4),
"Pt" text,
primary key(id, "Pt")
)
LOGICAL PARTITION BY LIST ("Pt", id)
WITH (
binlog_level ='replica'
);
Flink でこのテーブルのバイナリログを消費するには、次のようにします。
CREATE TEMPORARY TABLE test_src_binlog_table(
id INTEGER,
name VARCHAR,
age decimal(18,4),
`Pt` VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='holo_table',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'source.binlog'='true',
'source.binlog.logical-partition-filter-column-names'='"Pt","id"',
'source.binlog.logical-partition-filter-column-values'='<yourPartitionColumnValues>',
'source.binlog.change-log-mode'='ALL', -- INSERT、DELETE、UPDATE_BEFORE、UPDATE_AFTER を含むすべての変更ログタイプを読み取ります。
'retry-count'='10', -- バイナリログ読み取りエラーの再試行回数。
'retry-sleep-step-ms'='5000', -- 再試行間の増分バックオフ時間。最初の再試行では 5 秒、2 回目では 10 秒待機し、以降も同様に増加します。
'source.binlog.batch-size'='512' -- 1 回のバッチでバイナリログから読み取る行数。
);
DataStream API
DataStream API を使用して Hologres からの読み取りまたは Hologres への書き込みを行うには、対応する DataStream コネクタを使用して Realtime Compute for Apache Flink に接続します。DataStream コネクタの設定方法については、「DataStream コネクタの使用方法」をご参照ください。Hologres DataStream コネクタは Maven Central で利用できます。ローカルデバッグには、対応する Uber JAR を使用します。詳細については、「コネクタを含むジョブのローカルでの実行とデバッグ」をご参照ください。
Hologres ソーステーブル
Binlog ソーステーブル
VVR は、Hologres の Binlog データを読み取るための HologresBinlogSource クラスを提供します。次の例では、Hologres Binlog ソースをビルドする方法を説明します。
VVR 11.3+
VVR 11.1.2 以降、JDBCOptions および startTimeMs パラメーターは HologresBinlogSource コンストラクターから削除されました。VVR 11.3 以降、List<Subscribe.BinlogFilter> パラメーターが追加されました。VVR 11 以降を使用する場合は、VVR 11.3 以降を使用することを推奨します。
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 読み取るテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// 読み取るテーブルの名前。
String sourceTableName = "sourceTableName";
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, sourceTableName);
config.set(HologresConfigs.BINLOG, true);
config.set(HologresConfigs.BINLOG_CHANGE_LOG_MODE, BinlogChangeLogMode.ALL);
// Hologres Binlog ソースをビルドします。
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
StartupMode.INITIAL,
sourceTableName,
"",
Collections.emptyList(),
-1,
Collections.emptySet(),
Collections.emptyList()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 8.0.11+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 読み取るテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// JDBCOptions をビルドします。
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// Hologres Binlog ソースをビルドします。
long startTimeMs = 0;
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.INITIAL,
"",
"",
-1,
Collections.emptySet(),
new ArrayList<>()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 8.0.7+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 読み取るテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// JDBCOptions をビルドします。
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// Hologres Binlog ソースをビルドします。
long startTimeMs = 0;
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.INITIAL,
"",
"",
-1,
Collections.emptySet()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 6.0.7+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 読み取るテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// JDBCOptions をビルドします。
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// デフォルトのスロット名を設定または作成します。
config.setString(HologresBinlogConfigs.JDBC_BINLOG_SLOT_NAME, HoloBinlogUtil.getOrCreateDefaultSlotForJDBCBinlog(jdbcOptions));
boolean cdcMode = config.get(HologresBinlogConfigs.BINLOG_CDC_MODE) && config.get(HologresBinlogConfigs.OPTIONAL_BINLOG);
// JDBCBinlogRecordConverter をビルドします。
JDBCBinlogRecordConverter recordConverter = new JDBCBinlogRecordConverter(
jdbcOptions.getTable(),
schema,
new HologresConnectionParam(config),
cdcMode,
Collections.emptySet());
// Hologres Binlog ソースをビルドします。
long startTimeMs = 0;
HologresJDBCBinlogSource source = new HologresJDBCBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.TIMESTAMP,
recordConverter,
"",
-1);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
8.0.5 より前の Realtime Compute for Apache Flink エンジンバージョン、または 2.1 より前の Hologres バージョンを使用する場合は、ユーザーがスーパーユーザーであるか、Replication ロール権限を持っている必要があります。詳細については、「Hologres の権限の問題」をご参照ください。
非 Binlog ソーステーブル
VVR は、Hologres テーブルからデータを読み取るための RichInputFormat の実装である HologresBulkreadInputFormat クラスを提供します。次の例では、Hologres ソースをビルドする方法を説明します。
public class Sample {
public static void main(String[] args) throws Exception {
// Java DataStream API をセットアップします
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 読み取るテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
// JDBCOptions をビルドします。
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
HologresBulkreadInputFormat inputFormat = new HologresBulkreadInputFormat(
new HologresConnectionParam(config),
jdbcOptions,
schema,
"",
-1);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(schema.toRowDataType().getLogicalType());
env.addSource(new InputFormatSourceFunction<>(inputFormat, typeInfo)).returns(typeInfo).print();
env.execute();
}
}
Maven 依存関係
Hologres DataStream コネクタは Maven Central で利用できます。
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-hologres</artifactId>
<version>${vvr-version}</version>
</dependency>
Hologres シンクテーブル
VVR 11+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 書き込むテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema tableSchema = TableSchema.builder()
.field("a", DataTypes.INT().notNull())
.field("b", DataTypes.STRING())
.primaryKey("a")
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.set(HologresConfigs.ENDPOINT, "yourEndpoint");
config.set(HologresConfigs.USERNAME, "yourUserName");
config.set(HologresConfigs.PASSWORD, "yourPassword");
config.set(HologresConfigs.DATABASE, "yourDatabaseName");
config.set(HologresConfigs.TABLE, "yourTableName");
HologresConnectionParam connectionParam = new HologresConnectionParam(config);
HologresTableSchema hologresTableSchema =
HologresTableSchema.get(connectionParam.getJDBCOptions());
// シンクに書き込む列のインデックス。
Integer[] targetColumnIndexes = {0, 1};
// Hologres シンクをビルドします。
HologresSinkFunction sinkFunction =
new HologresSinkFunction(
connectionParam, tableSchema, targetColumnIndexes, hologresTableSchema);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(tableSchema.toRowDataType().getLogicalType());
env.fromElements((RowData) GenericRowData.of(101, StringData.fromString("name"))).returns(typeInfo).addSink(sinkFunction);
env.execute();
}
}
VVR 8+
public class Sample {
public static void main(String[] args) throws Exception {
// Java DataStream API をセットアップします
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 書き込むテーブルのスキーマを初期化します。スキーマは Hologres テーブルスキーマのフィールドと一致する必要があります。フィールドのサブセットを定義できます。
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.build();
// Hologres 接続のパラメーター。
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
HologresConnectionParam hologresConnectionParam = new HologresConnectionParam(config);
// RowData としてデータを書き込む Hologres ライターを作成します。
AbstractHologresWriter<RowData> hologresWriter = HologresJDBCWriter.createRowDataWriter(
hologresConnectionParam,
schema,
HologresTableSchema.get(hologresConnectionParam),
new Integer[0]);
// Hologres シンクをビルドします。
HologresSinkFunction sinkFunction = new HologresSinkFunction(hologresConnectionParam, hologresWriter);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(schema.toRowDataType().getLogicalType());
env.fromElements((RowData) GenericRowData.of(101, StringData.fromString("name"))).returns(typeInfo).addSink(sinkFunction);
env.execute();
}
}
メタデータ列
Realtime Compute for Apache Flink VVR 8.0.11 以降では、Binlog ソーステーブルがメタデータ列をサポートしています。このバージョン以降、hg_binlog_event_type などのバイナリログフィールドをメタデータ列として宣言することを推奨します。メタデータ列は SQL 標準の拡張機能です。これにより、ソースデータベース名、テーブル名、変更タイプ、イベントタイムスタンプなどの特定の情報にアクセスできます。このメタデータを使用して、DELETE イベントをフィルタリングするなど、カスタムロジックを実装できます。
|
パラメーター |
タイプ |
説明 |
|
db_name |
STRING NOT NULL |
行を含むデータベースの名前。 |
|
table_name |
STRING NOT NULL |
行を含むテーブルの名前。 |
|
hg_binlog_lsn |
BIGINT NOT NULL |
バイナリログシーケンス番号のシステムフィールド。値はシャード内で単調に増加しますが、連続ではありません。シャード間での一意性と順序は保証されません。 |
|
hg_binlog_timestamp_us |
BIGINT NOT NULL |
データベース内の変更イベントのタイムスタンプ (マイクロ秒単位)。 |
|
hg_binlog_event_type |
BIGINT NOT NULL |
行の変更タイプ。有効な値は次のとおりです:
|
|
hg_shard_id |
INT NOT NULL |
行を含むデータシャードの ID。テーブルグループとシャードの詳細については、「テーブルグループとシャード」をご参照ください。 |
DDL ステートメントでは、<meta_column_name> <datatype> METADATA VIRTUAL を使用してメタデータ列を宣言できます。以下に例を示します:
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn bigint METADATA VIRTUAL,
hg_binlog_event_type bigint METADATA VIRTUAL,
hg_binlog_timestamp_us bigint METADATA VIRTUAL,
hg_shard_id int METADATA VIRTUAL,
db_name string METADATA VIRTUAL,
table_name string METADATA VIRTUAL,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
...
);
よくある質問
参考資料
-
Hologres カタログの作成方法と使用方法については、「Hologres カタログの管理」をご参照ください。
-
Hologres は Flink と統合して、リアルタイムデータウェアハウスを構築するための統合ソリューションを提供します。詳細については、「Hologres でリアルタイムデータウェアハウスを構築する」をご参照ください。
-
Hologres は効率的なデータの更新と修正をサポートしており、マルチストリーム書き込みシナリオでのワイドテーブルの構築に適しています。詳細については、「Flink、MongoDB、Hologres を使用したユーザー行動分析」をご参照ください。