このチュートリアルでは、具体的な例を用いて、Realtime Compute for Apache Flink の主要な機能を利用したバッチ処理の方法を説明します。
特徴
Realtime Compute for Apache Flink は、Flink バッチ処理をサポートするために、以下の主要な機能を提供します。
ジョブ開発マップ:SQL エディターの [下書き] タブでバッチ下書きを作成し、それをバッチデプロイメントとしてデプロイおよび実行できます。
デプロイメント管理:[デプロイメント] ページで、JAR または Python のバッチデプロイメントを直接デプロイできます。上部のドロップダウンリストから [BATCH] を選択すると、デプロイ済みのバッチデプロイメントが表示されます。対象のバッチデプロイメントを展開すると、そのジョブインスタンスのリストが表示されます。通常、バッチデプロイメントの異なるジョブインスタンスは同じ処理ロジックを共有しますが、処理対象データの日付など、異なるパラメーターを使用します。
データクエリ:SQL エディターの [スクリプト] タブで、DDL ステートメントや短いクエリを実行して、迅速なデータ管理と探索ができます。これらの短いクエリは、事前に作成された Flink セッションで実行されるため、リソースを再利用することで単純なクエリの低レイテンシー実行が可能になります。
データ管理:[カタログ] ページで、カタログ (それに含まれるデータベースやテーブルを含む) を作成および表示できます。また、開発効率を向上させるために、SQL エディターの [カタログ] タブでも表示できます。
タスクオーケストレーション (パブリックプレビュー):[ワークフロー] ページでは、ビジュアルインターフェイスを使用して、バッチデプロイメント間の依存関係をオーケストレーションするワークフローを定義できます。ワークフローは手動でトリガーするか、定期的に実行するようにスケジュールできます。
リソースキューの管理:[キュー管理] ページでは、ワークスペース内のリソースをパーティション分割して、ストリームデプロイメントとバッチデプロイメント間、および優先度の異なるデプロイメント間のリソース競合を防ぐことができます。
前提条件
Realtime Compute for Apache Flink ワークスペースが作成済みであること。詳細については、「Realtime Compute for Apache Flink の有効化」をご参照ください。
Object Storage Service (OSS) が有効化済みであること。詳細については、「コンソールのクイックスタート」をご参照ください。OSS バケットのストレージクラスは標準である必要があります。詳細については、「ストレージクラス」をご参照ください。
このチュートリアルでは、データの保存に Apache Paimon を使用し、Ververica Runtime (VVR) 8.0.5 以降が必要です。
利用シーン
このチュートリアルでは、e コマースプラットフォームを例として使用します。データは Apache Paimon レイクハウスフォーマットで保存されます。オペレーショナルデータストア (ODS)、データウェアハウス詳細 (DWD)、データウェアハウスサービス (DWS) という複数のレイヤーを持つデータウェアハウス構造をシミュレートします。Flink のバッチ処理機能を使用してデータを処理およびクレンジングし、Paimon テーブルに書き込むことで、階層化されたデータ構造を構築します。

事前準備
スクリプトの作成
[スクリプト] タブでは、データベースとテーブルを含むカタログを作成し、テーブルにサンプルデータを挿入できます。
Paimon カタログの作成
[スクリプト] タブのエディターに、以下の SQL ステートメントを入力します。
CREATE CATALOG `my_catalog` WITH ( 'type' = 'paimon', 'metastore' = 'filesystem', 'warehouse' = '<warehouse>', 'fs.oss.endpoint' = '<fs.oss.endpoint>', 'fs.oss.accessKeyId' = '<fs.oss.accessKeyId>', 'fs.oss.accessKeySecret' = '<fs.oss.accessKeySecret>' );パラメーターの説明は次の表をご参照ください。
パラメーター
説明
必須
備考
type
カタログのタイプ。
はい
値を
paimonに設定します。metastore
メタストアのタイプ。
はい
このチュートリアルでは、値を
filesystemに設定します。他のタイプについては、「Paimon カタログの管理」をご参照ください。warehouse
Object Storage Service (OSS) 内のデータウェアハウスのディレクトリ。
はい
フォーマットは
oss://<bucket>/<object>です。各パラメーターの説明は次のとおりです。bucket:ご利用の OSS バケットの名前。object:データが保存されているパス。
OSS コンソールでバケットとオブジェクトパスを確認できます。
fs.oss.endpoint
Object Storage Service (OSS) のエンドポイント。
いいえ
warehouseで指定された OSS バケットが Flink ワークスペースと異なるリージョンにある場合、または異なる Alibaba Cloud アカウントに属している場合に必要です。詳細については、「リージョンとエンドポイント」をご参照ください。
fs.oss.accessKeyId
OSS バケットに対する読み取りおよび書き込み権限を持つ Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
いいえ
warehouseで指定された OSS バケットが Flink ワークスペースと異なるリージョンにある場合、または異なる Alibaba Cloud アカウントに属している場合に必要です。AccessKey ペアの取得方法については、「AccessKey ペアの作成」をご参照ください。fs.oss.accessKeySecret
AccessKey ID に対応する AccessKey Secret。
いいえ
コードを選択し、左側の [実行] をクリックします。
メッセージ
The following statement has been executed successfully!は、カタログが正常に作成されたことを示しています。これで、[カタログ] ページ、または [SQL エディター] ページの [カタログ] タブでカタログを表示できます。
操作手順
ステップ 1: ODS テーブルの作成とテストデータの挿入
このチュートリアルを簡略化するため、ODS テーブルに直接テストデータを挿入し、後続の DWD および DWS テーブルを生成します。本番環境では、通常、Flink ストリーム処理を使用して外部ソースからデータを読み取り、データレイクに ODS レイヤーとして書き込みます。詳細については、「Paimon のクイックスタート:基本機能」をご参照ください。
[スクリプト] タブのエディターに、次の SQL ステートメントを入力し、左側にある [実行] をクリックします。
CREATE DATABASE `my_catalog`.`order_dw`; USE `my_catalog`.`order_dw`; CREATE TABLE orders ( order_id BIGINT, user_id STRING, shop_id BIGINT, product_id BIGINT, buy_fee BIGINT, create_time TIMESTAMP, update_time TIMESTAMP, state INT ); CREATE TABLE orders_pay ( pay_id BIGINT, order_id BIGINT, pay_platform INT, create_time TIMESTAMP ); CREATE TABLE product_catalog ( product_id BIGINT, catalog_name STRING ); -- テストデータの挿入 INSERT INTO orders VALUES (100001, 'user_001', 12345, 1, 5000, TO_TIMESTAMP('2023-02-15 16:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100002, 'user_002', 12346, 2, 4000, TO_TIMESTAMP('2023-02-15 15:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100003, 'user_003', 12347, 3, 3000, TO_TIMESTAMP('2023-02-15 14:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100004, 'user_001', 12347, 4, 2000, TO_TIMESTAMP('2023-02-15 13:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100005, 'user_002', 12348, 5, 1000, TO_TIMESTAMP('2023-02-15 12:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100006, 'user_001', 12348, 1, 1000, TO_TIMESTAMP('2023-02-15 11:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100007, 'user_003', 12347, 4, 2000, TO_TIMESTAMP('2023-02-15 10:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1); INSERT INTO orders_pay VALUES (2001, 100001, 1, TO_TIMESTAMP('2023-02-15 17:40:56')), (2002, 100002, 1, TO_TIMESTAMP('2023-02-15 17:40:56')), (2003, 100003, 0, TO_TIMESTAMP('2023-02-15 17:40:56')), (2004, 100004, 0, TO_TIMESTAMP('2023-02-15 17:40:56')), (2005, 100005, 0, TO_TIMESTAMP('2023-02-15 18:40:56')), (2006, 100006, 0, TO_TIMESTAMP('2023-02-15 18:40:56')), (2007, 100007, 0, TO_TIMESTAMP('2023-02-15 18:40:56')); INSERT INTO product_catalog VALUES (1, 'phone_aaa'), (2, 'phone_bbb'), (3, 'phone_ccc'), (4, 'phone_ddd'), (5, 'phone_eee');説明このチュートリアルで作成されるテーブルは Paimon の追加専用テーブルであり、プライマリキーはありません。プライマリキーテーブルよりもバッチ書き込み性能に優れていますが、キーに基づいた更新操作はサポートしていません。
実行結果には複数のサブタブが含まれ、
The following statement has been executed successfully!というメッセージが表示されたら、対応する DDL ステートメントの実行は成功です。INSERT などの DML ステートメントは JobId を返します。これは、Flink セッションで Flink ジョブが実行されていることを示します。[結果] タブの左側にある [Flink UI] をクリックして、これらの SQL ステートメントの実行ステータスを表示します。完了するまで数秒待ちます。
ODS テーブルデータの探索
[スクリプト] タブのエディターに、次の SQL ステートメントを入力し、左側にある [実行] をクリックします。
SELECT count(*) as order_count FROM `my_catalog`.`order_dw`.`orders`; SELECT count(*) as pay_count FROM `my_catalog`.`order_dw`.`orders_pay`; SELECT * FROM `my_catalog`.`order_dw`.`product_catalog`;これらの SQL ステートメントも Flink セッションで実行されます。結果はそれぞれの結果ページで確認できます。
orders テーブルの
order_countは 7 です。orders_pay テーブルのpay_countは 7 です。product_catalog テーブルには、product_idが 1 から 5 までの 5 つのレコードが含まれ、catalog_nameの値はそれぞれ phone_aaa、phone_bbb、phone_ccc、phone_ddd、phone_eee です。
ステップ 2: DWD および DWS テーブルの作成
[スクリプト] タブのエディターに、次の SQL ステートメントを入力し、左側にある [実行] をクリックします。
USE `my_catalog`.`order_dw`;
CREATE TABLE dwd_orders (
order_id BIGINT,
order_user_id STRING,
order_shop_id BIGINT,
order_product_id BIGINT,
order_product_catalog_name STRING,
order_fee BIGINT,
order_create_time TIMESTAMP,
order_update_time TIMESTAMP,
order_state INT,
pay_id BIGINT,
pay_platform INT COMMENT 'platform 0: phone, 1: pc',
pay_create_time TIMESTAMP
) WITH (
'sink.parallelism' = '2'
);
CREATE TABLE dws_users (
user_id STRING,
ds STRING,
total_fee BIGINT COMMENT 'Total amount paid on the current day'
) WITH (
'sink.parallelism' = '2'
);
CREATE TABLE dws_shops (
shop_id BIGINT,
ds STRING,
total_fee BIGINT COMMENT 'Total amount paid on the current day'
) WITH (
'sink.parallelism' = '2'
);ここで作成されるテーブルも Paimon の追加専用テーブルです。Paimon テーブルを Flink の sink として使用する場合、Flink は並列度を自動的に推論しません。潜在的なエラーを避けるために、並列度を明示的に設定する必要があります。
ステップ 3: DWD および DWS デプロイメントの作成とデプロイ
DWD デプロイメントの作成とデプロイ
DWD テーブル更新デプロイメントの作成
ページで、
dwd_ordersという名前の [空のバッチドラフト] を作成します。推奨タグが付いているエンジンバージョンを選択することをお勧めします。デフォルトの Flink SQL ダイアレクトを使用します。次の SQL ステートメントをエディターにコピーします。DWD テーブルは Paimon の追加専用テーブルであるため、INSERT OVERWRITEステートメントを使用してテーブル全体を上書きします。INSERT OVERWRITE my_catalog.order_dw.dwd_orders SELECT o.order_id, o.user_id, o.shop_id, o.product_id, c.catalog_name, o.buy_fee, o.create_time, o.update_time, o.state, p.pay_id, p.pay_platform, p.create_time FROM my_catalog.order_dw.orders as o, my_catalog.order_dw.product_catalog as c, my_catalog.order_dw.orders_pay as p WHERE o.product_id = c.product_id AND o.order_id = p.order_idページの右上隅で [デプロイ] をクリックし、次に [OK] をクリックして
dwd_ordersデプロイメントをデプロイします。
DWS デプロイメントの作成とデプロイ
DWS テーブル更新デプロイメントの作成
DWD テーブル更新デプロイメントの作成と同じ手順で、
dws_shopsとdws_usersという名前の 2 つのバッチ下書きを作成します。次の SQL ステートメントをそれぞれのエディターにコピーします。INSERT OVERWRITE my_catalog.order_dw.dws_shops SELECT order_shop_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd') as ds, SUM(order_fee) as total_fee FROM my_catalog.order_dw.dwd_orders WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL GROUP BY order_shop_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd');INSERT OVERWRITE my_catalog.order_dw.dws_users SELECT order_user_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd') as ds, SUM(order_fee) as total_fee FROM my_catalog.order_dw.dwd_orders WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL GROUP BY order_user_id, DATE_FORMAT(pay_create_time, 'yyyyMMdd');ページの右上隅で、[Deploy] をクリックし、次に [OK] をクリックして
dws_shopsとdws_usersデプロイメントをデプロイします。
ステップ 4: DWD および DWS デプロイメントの開始と表示
DWD デプロイメントの開始とデータの表示
ページに移動します。 ドロップダウンリストから [BATCH] を選択します。
dwd_ordersデプロイメントを見つけ、[操作] 列の [開始] をクリックします。状態が [STARTING] のジョブインスタンスが、バッチジョブインスタンスのリストに表示されます。
ジョブインスタンスのステータスが [FINISHED] に変わると、データ処理が完了します。
データ結果の探索
[スクリプト] タブのエディターで、次の SQL ステートメントを入力し、左側の [実行] をクリックして DWD テーブルのデータをクエリします。
SELECT * FROM `my_catalog`.`order_dw`.`dwd_orders`;結果は次の図のようになります。

DWS デプロイメントの開始とデータの表示
ページで、ドロップダウンリストから [BATCH] を選択します。
dws_shopsとdws_usersデプロイメントを見つけ、それぞれの [操作] 列で [開始] をクリックします。[スクリプト] タブのエディターで、以下の SQL ステートメントを入力し、左側の [実行] をクリックして DWS テーブルのデータをクエリします。
SELECT * FROM `my_catalog`.`order_dw`.`dws_shops`; SELECT * FROM `my_catalog`.`order_dw`.`dws_users`;結果は次の図のようになります。

ステップ 5: タスクオーケストレーションによるバッチパイプラインの構築
このステップでは、デプロイメントをワークフローにオーケストレーションします。これにより、デプロイメントをまとめてトリガーし、順番に実行できます。
ワークフローの作成
左側のナビゲーションウィンドウで、 を選択し、[ワークフローの作成] をクリックします。
表示されたパネルで、名前に
wf_ordersを入力し、スケジューリングタイプはデフォルト ([手動スケジューリング]) のままにし、[リソースキュー]にdefault-queueを選択して、[作成] をクリックしてワークフローエディターを開きます。ワークフローの編集
最初のノードをクリックし、
v_dwd_ordersという名前を付け、dwd_ordersデプロイメントを選択します。[タスクの追加] をクリックして
v_dws_shopsという名前のノードを作成します。dws_shopsデプロイメントを選択し、v_dwd_ordersを上流ノードとして設定します。再度 [タスクの追加] をクリックして
v_dws_usersという名前のノードを作成します。dws_usersデプロイメントを選択し、v_dwd_ordersを上流ノードとして設定します。右上隅で [保存]、次に [OK] をクリックします。
ワークフローの手動トリガー
説明ワークフローを定期スケジュールで実行するように変更することもできます。[ワークフロー] ページで、ワークフローの右側にある [ワークフローの編集] をクリックし、スケジューリングモードを [定期スケジューリング] に変更します。詳細については、「タスクオーケストレーション (パブリックプレビュー)」をご参照ください。
ワークフローをトリガーする前に、ODS テーブルに新しいデータを挿入して、ワークフローの実行結果を検証します。
[スクリプト] タブのエディターで、次の SQL ステートメントを入力し、左側にある [実行] をクリックします。
USE `my_catalog`.`order_dw`; INSERT INTO orders VALUES (100008, 'user_001', 12346, 1, 10000, TO_TIMESTAMP('2023-02-15 17:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100009, 'user_002', 12347, 2, 20000, TO_TIMESTAMP('2023-02-15 18:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1), (100010, 'user_003', 12348, 3, 30000, TO_TIMESTAMP('2023-02-15 19:40:56'), TO_TIMESTAMP('2023-02-15 18:42:56'), 1); INSERT INTO orders_pay VALUES (2008, 100008, 1, TO_TIMESTAMP('2023-02-15 20:40:56')), (2009, 100009, 1, TO_TIMESTAMP('2023-02-15 20:40:56')), (2010, 100010, 1, TO_TIMESTAMP('2023-02-15 20:40:56'));[結果] タブの左側にある[Flink UI]をクリックして、ジョブのステータスをモニターします。
ページで、前の手順で作成したワークフローを見つけ、[操作] 列の [実行] をクリックし、次に [OK] をクリックしてワークフローをトリガーします。
ワークフロー名をクリックすると、[ワークフローインスタンスリストと詳細] ページに移動し、そこでワークフローインスタンスリストを表示できます。
実行中のワークフローインスタンスの[ID]をクリックして、その実行詳細ページに移動し、各ノードのステータスを監視します。ワークフロー全体が完了するまで待ちます。
ワークフローの実行結果の表示
[スクリプト] タブのエディターで、次の SQL ステートメントを入力し、左側にある [実行] をクリックします。
SELECT * FROM `my_catalog`.`order_dw`.`dws_shops`; SELECT * FROM `my_catalog`.`order_dw`.`dws_users`;ワークフローの実行結果の表示
ワークフローが ODS レイヤーからの新しいデータを処理し、DWS テーブルに書き込んだことがわかります。

関連ドキュメント
Flink バッチ処理の原則と構成チューニングの詳細については、「Flink バッチ処理のチューニングガイド」をご参照ください。
Flink と Paimon を使用してストリーミングデータレイクハウスを構築するには、「Paimon と StarRocks でストリーミングデータレイクハウスを構築」をご参照ください。
Realtime Compute for Apache Flink コンソールでの Flink ジョブの開発に加えて、これらのジョブをローカルで開発することもできます。詳細については、「VS Code 拡張機能を使用した開発」をご参照ください。