MaxCompute Flink コネクタを使用すると、Flink のデータを MaxCompute の標準テーブルおよび Delta テーブルに書き込むことができ、データインジェストが簡素化されます。このトピックでは、コネクタの機能について説明し、データ書き込みの手順の概要を示します。
背景情報
サポートされている書き込みモード
Flink コネクタは、
アップサートと挿入の 2 つの書き込みモードをサポートしています。アップサートモードでは、次のいずれかの方法でデータストリームをグループ化できます。プライマリキーによるグループ化
パーティションフィールドによるグループ化
パーティションフィールドによるグループ化は、多数のパーティションに適していますが、データスキューを引き起こす可能性があります。
アップサートの書き込み手順と推奨パラメーターについては、「データウェアハウスへのリアルタイムデータインジェスト」をご参照ください。書き込みモードは Flink コネクタのパラメーターを使用して指定します。コネクタパラメーターの完全なリストについては、「付録: Flink コネクタのパラメーター」をご参照ください。
Flink のアップサート書き込みジョブのチェックポイント間隔は、3 分以上に設定してください。間隔が短いと、書き込み効率が低下し、多数の小規模ファイルが作成される可能性があります。
次の表は、Realtime Compute for Apache Flink と MaxCompute の間のデータ型のマッピングを示しています。
Flink データ型
MaxCompute データ型
CHAR(p)
CHAR(p)
VARCHAR(p)
VARCHAR(p)
STRING
STRING
BOOLEAN
BOOLEAN
TINYINT
TINYINT
SMALLINT
SMALLINT
INT
INT
BIGINT
BIGINT
FLOAT
FLOAT
DOUBLE
DOUBLE
DECIMAL(p, s)
DECIMAL(p, s)
DATE
DATE
TIMESTAMP(9) WITHOUT TIME ZONE, TIMESTAMP_LTZ(9)
TIMESTAMP
TIMESTAMP(3) WITHOUT TIME ZONE, TIMESTAMP_LTZ(3)
DATETIME
BYTES
BINARY
ARRAY<T>
ARRAY<T>
MAP<K, V>
MAP<K, V>
ROW
STRUCT
説明Flink の TIMESTAMP データ型にはタイムゾーン情報が含まれていませんが、MaxCompute の TIMESTAMP データ型には含まれています。この違いにより、8 時間の時間のずれが生じる可能性があります。タイムスタンプを揃えるには、TIMESTAMP_LTZ(9) を使用してください。
-- Flink SQL CREATE TEMPORARY TABLE odps_source( id BIGINT NOT NULL COMMENT 'ID', created_time TIMESTAMP NOT NULL COMMENT '作成時間', updated_time TIMESTAMP_LTZ(9) NOT NULL COMMENT '更新時間', PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'maxcompute', ... );
自己管理 Flink クラスターからのデータ書き込み
前提条件: MaxCompute テーブルの作成
まず、Flink がデータを書き込むための MaxCompute テーブルを作成する必要があります。次の例では、2 つのテーブル (非パーティション化 Delta テーブルとパーティションテーブル) を作成することで、このプロセスを示しています。テーブルプロパティの設定については、「Delta テーブルのパラメーター」をご参照ください。
-- 非パーティション化 Delta テーブルを作成します。 CREATE TABLE mf_flink_tt ( id BIGINT not null, name STRING, age INT, status BOOLEAN, primary key (id) ) tblproperties ("transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="12") ; --パーティション化 Delta テーブルを作成します。 CREATE TABLE mf_flink_tt_part ( id BIGINT not null, name STRING, age INT, status BOOLEAN, primary key (id) ) partitioned by (dd string, hh string) tblproperties ("transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="12") ;オープンソース Flink クラスターをセットアップします。コネクタは Flink 1.13、1.15、1.16、および 1.17 をサポートしています。ご利用の Flink バージョンに一致する Flink コネクタを選択してください。
説明Flink 1.16 用の Flink コネクタは Flink 1.17 と互換性があります。
このトピックでは、Flink 1.13 用の Flink コネクタを例として使用します。パッケージをダウンロードして解凍してください。
Flink コネクタをダウンロードし、Flink クラスターパッケージに追加します。
Flink コネクタの JAR パッケージをローカル環境にダウンロードします。
解凍した Flink インストールパッケージの lib ディレクトリに Flink コネクタの JAR パッケージを追加します。
mv flink-connector-odps-1.13-shaded.jar $FLINK_HOME/lib/flink-connector-odps-1.13-shaded.jar
Flink インスタンスサービスを開始します。
cd $FLINK_HOME/bin ./start-cluster.shFlink クライアントを開始します。
cd $FLINK_HOME/bin ./sql-client.shFlink テーブルを作成し、Flink コネクタのパラメーターを設定します。
Flink SQL または DataStream API のいずれかを使用して、Flink テーブルを作成し、そのパラメーターを設定できます。次のセクションでは、両方のアプローチの主要な例を示します。
Flink SQL
Flink SQL エディターで、次のコマンドを実行してテーブルを作成し、パラメーターを設定します。
-- Flink SQL に非パーティション化テーブルを登録します。 CREATE TABLE mf_flink ( id BIGINT, name STRING, age INT, status BOOLEAN, PRIMARY KEY(id) NOT ENFORCED ) WITH ( 'connector' = 'maxcompute', 'table.name' = 'mf_flink_tt', 'sink.operation' = 'upsert', 'odps.access.id'='LTAI****************', 'odps.access.key'='********************', 'odps.end.point'='http://service.cn-beijing.maxcompute.aliyun.com/api', 'odps.project.name'='mf_mc_bj' ); -- Flink SQL にパーティション化テーブルを登録します。 CREATE TABLE mf_flink_part ( id BIGINT, name STRING, age INT, status BOOLEAN, dd STRING, hh STRING, PRIMARY KEY(id) NOT ENFORCED ) PARTITIONED BY (`dd`,`hh`) WITH ( 'connector' = 'maxcompute', 'table.name' = 'mf_flink_tt_part', 'sink.operation' = 'upsert', 'odps.access.id'='LTAI****************', 'odps.access.key'='********************', 'odps.end.point'='http://service.cn-beijing.maxcompute.aliyun.com/api', 'odps.project.name'='mf_mc_bj' );Flink テーブルにデータを書き込み、MaxCompute テーブルをクエリして結果を確認します。
-- Flink SQL クライアントで非パーティション化テーブルにデータを挿入します。 INSERT INTO mf_flink VALUES (1,'Danny',27, false); -- MaxCompute でのクエリ結果。 SELECT * FROM mf_flink_tt; +------------+------+------+--------+ | id | name | age | status | +------------+------+------+--------+ | 1 | Danny | 27 | false | +------------+------+------+--------+ -- Flink SQL クライアントで非パーティション化テーブルにデータを挿入してレコードを更新します。 INSERT INTO mf_flink VALUES (1,'Danny',28, false); -- MaxCompute でのクエリ結果。 SELECT * FROM mf_flink_tt; +------------+------+------+--------+ | id | name | age | status | +------------+------+------+--------+ | 1 | Danny | 28 | false | +------------+------+------+--------+ -- Flink SQL クライアントでパーティション化テーブルにデータを挿入します。 INSERT INTO mf_flink_part VALUES (1,'Danny',27, false, '01','01'); -- MaxCompute でのクエリ結果。 SELECT * FROM mf_flink_tt_part WHERE dd=01 AND hh=01; +------------+------+------+--------+----+----+ | id | name | age | status | dd | hh | +------------+------+------+--------+----+----+ | 1 | Danny | 27 | false | 01 | 01 | +------------+------+------+--------+----+----+ -- Flink SQL クライアントでパーティション化テーブルにデータを挿入してレコードを更新します。 INSERT INTO mf_flink_part VALUES (1,'Danny',30, false, '01','01'); -- MaxCompute でのクエリ結果。 SELECT * FROM mf_flink_tt_part WHERE dd=01 AND hh=01; +------------+------+------+--------+----+----+ | id | name | age | status | dd | hh | +------------+------+------+--------+----+----+ | 1 | Danny | 30 | false | 01 | 01 | +------------+------+------+--------+----+----+
DataStream API
DataStream API を使用するには、次の依存関係を追加します。
<dependency> <groupId>com.aliyun.odps</groupId> <artifactId>flink-connector-maxcompute</artifactId> <version>xxx</version> <scope>system</scope> <systemPath>${mvn_project.basedir}/lib/flink-connector-maxcompute-xxx-shaded.jar</systemPath> </dependency>説明「xxx」を実際のバージョン番号に置き換えてください。
次のサンプルコードは、テーブルを作成し、パラメーターを設定する方法を示しています。
package com.aliyun.odps.flink.examples; import org.apache.flink.configuration.Configuration; import org.apache.flink.odps.table.OdpsOptions; import org.apache.flink.odps.util.OdpsConf; import org.apache.flink.odps.util.OdpsPipeline; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.data.RowData; public class Examples { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(120 * 1000); StreamTableEnvironment streamTableEnvironment = StreamTableEnvironment.create(env); Table source = streamTableEnvironment.sqlQuery("SELECT * FROM source_table"); DataStream<RowData> input = streamTableEnvironment.toAppendStream(source, RowData.class); Configuration config = new Configuration(); config.set(OdpsOptions.SINK_OPERATION, "upsert"); config.set(OdpsOptions.UPSERT_COMMIT_THREAD_NUM, 8); config.set(OdpsOptions.UPSERT_MAJOR_COMPACT_MIN_COMMITS, 100); OdpsConf odpsConfig = new OdpsConf("accessid", "accesskey", "endpoint", "project", "tunnel endpoint"); OdpsPipeline.Builder builder = OdpsPipeline.builder(); builder.projectName("sql2_isolation_2a") .tableName("user_ledger_portfolio") .partition("") .configuration(config) .odpsConf(odpsConfig) .sink(input, false); env.execute(); } }
Flink 完全管理からのデータ書き込み
前提条件: MaxCompute テーブルの作成
Flink データ用のターゲット MaxCompute テーブルを作成する必要があります。次の例では、Delta テーブルを作成する方法を示しています。
SET odps.sql.type.system.odps2=true; DROP TABLE mf_flink_upsert; CREATE TABLE mf_flink_upsert ( c1 int not null, c2 string, gt timestamp, primary key (c1) ) PARTITIONED BY (ds string) tblproperties ("transactional"="true", "write.bucket.num" = "64", "acid.data.retain.hours"="12") ;Flink コネクタは Flink 完全管理にプリロードされているため、手動でのインストールは不要です。コネクタの詳細は、Realtime Compute for Apache Flink コンソールで確認できます。
Flink テーブルを作成し、Flink SQL ジョブを使用してリアルタイムの Flink データを構築し、開発後にジョブをデプロイします。
Flink ジョブ開発ページで、SQL ジョブを作成および編集します。次の例では、ランダムデータを生成するソーステーブル、MaxCompute に接続する結果テーブル、およびデータを転送するための INSERT 文を定義しています。SQL ジョブの開発方法の詳細については、「ジョブ開発マップ」をご参照ください。
-- Flink ソーステーブルを作成します。 CREATE TEMPORARY TABLE fake_src_table ( c1 int, c2 VARCHAR, gt AS CURRENT_TIMESTAMP ) WITH ( 'connector' = 'faker', 'fields.c2.expression' = '#{superhero.name}', 'rows-per-second' = '100', 'fields.c1.expression' = '#{number.numberBetween ''0'',''1000''}' ); -- Flink に一時的な結果テーブルを作成します。 CREATE TEMPORARY TABLE test_c_d_g ( c1 int, c2 VARCHAR, gt TIMESTAMP, ds varchar, PRIMARY KEY(c1) NOT ENFORCED ) PARTITIONED BY(ds) WITH ( 'connector' = 'maxcompute', 'table.name' = 'mf_flink_upsert', 'sink.operation' = 'upsert', 'odps.access.id'='LTAI****************', 'odps.access.key'='********************', 'odps.end.point'='http://service.cn-beijing.maxcompute.aliyun.com/api', 'odps.project.name'='mf_mc_bj', 'upsert.write.bucket.num'='64' ); -- Flink 計算ロジック。 INSERT INTO test_c_d_g SELECT c1 AS c1, c2 AS c2, gt AS gt, date_format(gt, 'yyyyMMddHH') AS ds FROM fake_src_table;パラメーター:
odps.end.point:対応するリージョンの内部ネットワークエンドポイントを使用します。upsert.write.bucket.num:この値は、MaxCompute で作成された Delta テーブルのwrite.bucket.num プロパティの値と一致している必要があります。MaxCompute テーブルをクエリして、データが書き込まれたことを確認します。
SELECT * FROM mf_flink_upsert WHERE ds=2023061517; -- ソースデータはランダムに生成されるため、結果は異なる場合があります。 +------+----+------+----+ | c1 | c2 | gt | ds | +------+----+------+----+ | 0 | Skaar | 2023-06-16 01:59:41.116 | 2023061517 | | 21 | Supah Century | 2023-06-16 01:59:59.117 | 2023061517 | | 104 | Dark Gorilla Grodd | 2023-06-16 01:59:57.117 | 2023061517 | | 126 | Leader | 2023-06-16 01:59:39.116 | 2023061517 |
付録: Flink コネクタのパラメーター
基本パラメーター
パラメーター
必須
デフォルト値
説明
connector
はい
—
コネクタのタイプを
MaxComputeに設定します。odps.project.name
はい
—
MaxCompute プロジェクト名。
odps.access.id
はい
—
アカウントの AccessKey ID。「AccessKey ペアページ」をご参照ください。
odps.access.key
はい
—
アカウントの AccessKey Secret。「AccessKey ペアページ」をご参照ください。
odps.end.point
はい
—
MaxCompute エンドポイント。リージョンごとのエンドポイントのリストについては、「エンドポイント」をご参照ください。
odps.tunnel.end.point
いいえ
—
Tunnel サービスのパブリックエンドポイント。デフォルトでは、リクエストは適切な Tunnel エンドポイントに自動的にルーティングされます。このパラメーターを設定すると、特定のエンドポイントが使用され、自動ルーティングが無効になります。
異なるリージョンとネットワークにおける Tunnel エンドポイントの詳細については、「エンドポイント」をご参照ください。
odps.tunnel.quota.name
いいえ
—
MaxCompute へのアクセスに使用される Tunnel クォータの名前。
table.name
はい
—
MaxCompute テーブルの名前を
[project.][schema.]tableの形式で指定します。odps.namespace.schema
いいえ
false
3層モデルを使用するかどうかを指定します。3層モデルの詳細については、「スキーマ操作」をご参照ください。
sink.operation
はい
insert
書き込みタイプ。有効な値は
insertまたはupsertです。説明アップサートモードは、MaxCompute Delta テーブルでのみサポートされます。sink.parallelism
いいえ
—
書き込みの並列度。設定されていない場合、デフォルトでアップストリームソースの並列度が使用されます。
説明最適な書き込みパフォーマンスとシンクノードでのメモリ節約を最大化するために、テーブルプロパティ
write.bucket.numが設定値の整数倍であることを確認してください。sink.meta.cache.time
いいえ
400
メタデータキャッシュのサイズ。
sink.meta.cache.expire.time
いいえ
1200
メタデータのキャッシュ有効期限 (秒単位)。
sink.coordinator.enable
いいえ
true
コーディネーターモードを有効にするかどうかを指定します。
パーティションパラメーター
パラメーター
必須
デフォルト値
説明
sink.partition
いいえ
—
データが書き込まれるパーティションの名前。
動的パーティション分割を使用する場合、このパラメーターは動的パーティションの親パーティションの名前を指定します。
sink.partition.default-value
いいえ
__DEFAULT_PARTITION__
動的パーティション分割が使用される場合のデフォルトのパーティション名。
sink.dynamic-partition.limit
いいえ
100
動的パーティション分割中に、1 つのチェックポイントで同時に書き込むことができるパーティションの最大数。
説明この値を大幅に増やすと、シンクノードでメモリ不足 (OOM) エラーが発生する可能性があります。同時パーティションの数がこの制限を超えると、ジョブは失敗します。
sink.group-partition.enable
いいえ
false
動的パーティション分割を使用する際に、パーティションでグループ化するかどうかを指定します。
sink.partition.assigner.class
いいえ
—
PartitionAssignerの実装クラス。FileCached モードの書き込みパラメーター
多数の動的パーティションを持つジョブには、ファイルキャッシュモードを使用します。次のパラメーターでこのモードを設定します。
パラメーター
必須
デフォルト値
説明
sink.file-cached.enable
いいえ
false
FileCached モードを有効にします。多数の動的パーティションを持つジョブに推奨されます。
false: FileCached モードは無効です。
true: FileCached モードは有効です。
説明動的パーティションの数が多い場合は、ファイルキャッシュモードを使用できます。
sink.file-cached.tmp.dirs
いいえ
./local
FileCached モードでのデフォルトのファイルキャッシュディレクトリ。
sink.file-cached.writer.num
いいえ
16
FileCached モードでの単一タスクの同時データアップロードスレッド数。
説明このパラメーターの値を大幅に増やさないでください。過剰な数のパーティションが同時に書き込まれると、OOM エラーが発生する可能性が高くなります。
sink.bucket.check-interval
いいえ
60000
FileCached モードでファイルサイズをチェックする間隔。単位:ミリ秒 (ms)。
sink.file-cached.rolling.max-size
いいえ
16 M
単一のキャッシュファイルの最大サイズ。
ファイルがこのサイズを超えると、アップロードされます。
sink.file-cached.memory
いいえ
64 M
FileCached モードでファイル書き込みに使用されるオフヒープメモリの最大サイズ。
sink.file-cached.memory.segment-size
いいえ
128 KB
FileCached モードでファイル書き込みに使用されるバッファーサイズ。
sink.file-cached.flush.always
いいえ
true
FileCached モードでファイル書き込みにキャッシュを使用するかどうかを指定します。
sink.file-cached.write.max-retries
いいえ
3
FileCached モードでデータをアップロードする際のリトライ回数。
InsertまたはUpsertの書き込みパラメーターUpsert 書き込みパラメーター
パラメーター
必須
デフォルト値
説明
upsert.writer.max-retries
いいえ
3
アップサートライターがバケットへのデータ書き込みに失敗した後のリトライ回数。
upsert.writer.buffer-size
いいえ
64 MB
Flink での単一のアップサートライターのキャッシュサイズ。
説明すべてのバケットのバッファーサイズの合計が事前設定されたしきい値に達すると、システムは自動的にフラッシュ操作をトリガーしてサーバーにデータを更新します。
アップサートライターは複数のバケットに同時にデータを書き込みます。書き込み効率を向上させるために、このパラメーターの値を増やすことを推奨します。
多数のパーティションにデータが書き込まれる場合、OOM エラーが発生する可能性があります。この場合、このパラメーターの値を減らすことができます。
upsert.writer.bucket.buffer-size
いいえ
1 MB
Flink での単一バケットのキャッシュサイズ。Flink サーバーのメモリリソースが不足している場合は、このパラメーターの値を減らすことができます。
upsert.write.bucket.num
はい
—
送信先テーブルのバケット数は、
write.bucket.numの値と同じでなければなりません。upsert.write.slot-num
いいえ
1
単一セッションで使用される Tunnel スロットの数。
upsert.commit.max-retries
いいえ
3
アップサートセッションコミットのリトライ回数。
upsert.commit.thread-num
いいえ
16
アップサートセッションコミットの並列度。
この値を高く設定しすぎないでください。同時コミット数が多くなるとリソース消費が増加し、パフォーマンスの問題や過剰なリソース消費を引き起こす可能性があります。
upsert.major-compact.min-commits
いいえ
100
メジャーコンパクションをトリガーするために必要な最小コミット数。
upsert.commit.timeout
いいえ
600
アップサートセッションコミットのタイムアウト期間。単位:秒 (s)。
upsert.major-compact.enable
いいえ
false
メジャーコンパクションを有効にするかどうかを指定します。
upsert.flush.concurrent
いいえ
2
単一パーティション内で同時にデータを書き込むことができるバケットの最大数。
説明バケット内のデータがフラッシュされると、Tunnel スロットが占有されます。
説明アップサート書き込みの推奨パラメーター設定の詳細については、「アップサート書き込みの推奨パラメーター設定」をご参照ください。
Insert 書き込みパラメーター
パラメーター
必須
デフォルト値
説明
insert.commit.thread-num
いいえ
16
コミットセッションの並列度。
insert.arrow-writer.enable
いいえ
false
Arrow フォーマットを使用するかどうかを指定します。
insert.arrow-writer.batch-size
いいえ
512
Arrow バッチ内の最大行数。
insert.arrow-writer.flush-interval
いいえ
100000
ライターのフラッシュ間隔。単位:ミリ秒 (ms)。
insert.writer.buffer-size
いいえ
64 MB
バッファー付きライターのキャッシュサイズ。