このトピックでは、マテリアライズドテーブルを使用して、ストリームとバッチを統合したレイクハウス分析パイプラインを構築する手順を説明します。また、マテリアライズドテーブルの鮮度を調整してバッチ処理からストリーム処理に切り替え、リアルタイムのデータ更新を可能にする方法についても説明します。
マテリアライズドテーブルとは
マテリアライズドテーブルは、Flink SQL で導入された新しいテーブルタイプです。バッチ処理とストリーム処理の両方のデータパイプラインを簡素化し、統一された開発エクスペリエンスを提供します。マテリアライズドテーブルを作成する際、フィールドやその型を宣言する必要はありません。代わりに、希望するデータの鮮度とクエリ文を指定します。Flink エンジンはクエリからスキーマを自動的に推論し、指定された鮮度の要件を満たすための対応するデータリフレッシュパイプラインを作成します。詳細については、「マテリアライズドテーブルの管理」をご参照ください。
リアルタイムレイクハウスのパイプライン図
-
Flink はソースから Apache Paimon にデータを書き込み、オペレーショナルデータストア (ODS) 層を形成します。
-
Flink はテーブル結合によって ODS 層のデータをエンリッチ化、ワイド化し、その結果をマテリアライズドテーブルに書き込んで DWD 層を形成します。
-
鮮度の設定が異なる複数のマテリアライズドテーブルが多次元のビジネス集計を実行して、アプリケーションからのクエリに対応するデータウェアハウスサービス (DWS) 層を形成します。
前提条件
-
Flink ワークスペースが作成済みであること。詳細については、「Realtime Compute for Apache Flink のアクティベート」をご参照ください。
-
Resource Access Management (RAM) ユーザーまたは RAM ロールとしてリソースにアクセスする場合、Flink コンソールに必要な権限が付与されていることを確認してください。詳細については、「権限管理」をご参照ください。
ステップ1:テストデータの準備
-
Paimon カタログの作成
マテリアライズドテーブルはApache Paimonを基盤としています。メタストアタイプが Filesystemの Paimon カタログを作成する必要があります。すでに作成済みの場合は、このステップをスキップしてください。詳細については、「Paimon カタログの作成」をご参照ください。
-
ユーザー行動ログテーブル ods_user_log と商品情報テーブル ods_dim_product を作成します。
-
Realtime Compute 管理コンソールにログインします。
-
対象のワークスペースの [Actions] 列にある [Console] をクリックします。
-
左側メニューで、 を選択します。次のコードをコピーして貼り付け、ソーステーブルを作成します。
この例では、paimon という名前の Paimon カタログをすでに作成済みで、デフォルトのデータベースを使用していることを前提としています。
CREATE TABLE `paimon`.`default`.`ods_user_log` ( item_id INT NOT NULL, user_id INT NOT NULL, vtime TIMESTAMP(6), ds VARCHAR(10) NOT NULL ) PARTITIONED BY(ds) WITH ( 'bucket' = '4', -- バケット数を 4 に設定します。 'bucket-key' = 'item_id' -- バケット割り当てを決定するために使用されるキーを指定します。同じ item_id を持つ行は同じバケットに入ります。 ); CREATE TABLE `paimon`.`default`.`ods_dim_product` ( item_id INT NOT NULL, title VARCHAR(255), pict_url VARCHAR(255), brand_id INT, seller_id INT, PRIMARY KEY(item_id) NOT ENFORCED ) WITH ( 'bucket' = '4', 'bucket-key' = 'item_id' ); -
右上隅にある [Run] をクリックしてテーブルを作成します。
-
左側メニューで [Data Management] を選択し、Paimon カタログをクリックしてから [Refresh] をクリックして新しいテーブルを表示します。
-
-
「シミュレーションデータ生成のためのFakerコネクタ」を使用してモックデータを生成し、Paimon テーブルに書き込みます。
-
左側メニューで、 を選択します。
-
[New] をクリックし、[Blank stream draft] を選択して [Next] をクリックし、次に [Create] をクリックします。
-
次のSQL文をSQLエディターにコピーします。
CREATE TEMPORARY TABLE `user_log` ( item_id INT, -- 商品ID user_id INT, -- ユーザーID vtime TIMESTAMP, ds AS DATE_FORMAT(CURRENT_DATE,'yyyyMMdd') ) WITH ( 'connector' = 'faker', -- Fakerコネクタ 'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}', -- 0から1000までの乱数を生成します 'fields.user_id.expression'='#{number.numberBetween ''0'',''100''}', 'fields.vtime.expression'='#{date.past ''5'',''HOURS''}', -- 現在時刻から最大 5 時間前までのデータを生成します 'rows-per-second' = '3' -- 毎秒 3 行を生成します ); CREATE TEMPORARY TABLE `dim_product` ( item_id INT NOT NULL, title VARCHAR(255), pict_url VARCHAR(255), brand_id INT, seller_id INT, PRIMARY KEY(item_id) NOT ENFORCED ) WITH ( 'connector' = 'faker', -- Fakerコネクタ 'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}', 'fields.title.expression'='#{book.title}', 'fields.pict_url.expression'='#{internet.domainName}', 'fields.brand_id.expression'='#{number.numberBetween ''1000'',''10000''}', 'fields.seller_id.expression'='#{number.numberBetween ''1000'',''10000''}', 'rows-per-second' = '3' -- 毎秒 3 行を生成します ); BEGIN STATEMENT SET; INSERT INTO `paimon`.`default`.`ods_user_log` SELECT item_id, user_id, vtime, CAST(ds AS VARCHAR(10)) AS ds FROM `user_log`; INSERT INTO `paimon`.`default`.`ods_dim_product` SELECT item_id, title, pict_url, brand_id, seller_id FROM `dim_product`; END; -
右上隅にある [Deploy] をクリックしてジョブをデプロイします。
-
左側メニューで、 を選択します。対象のジョブの [Actions] 列にある [Start] をクリックし、[Stateless start] を選択してから [Start] をクリックします。
-
-
シミュレーションデータをクエリします。
左側メニューで、 を選択します。次のSQL文をSQLエディターにコピーし、右上隅にある [Run] をクリックします。
SELECT * FROM `paimon`.`default`.ods_dim_product LIMIT 10; SELECT * FROM `paimon`.`default`.ods_user_log LIMIT 10;
ステップ2:マテリアライズドテーブルの作成
このセクションでは、ソーステーブルをワイド化して dwd_user_log_product という名前の DWD 層のマテリアライズドテーブルを構築します。次に、dwd_user_log_product に基づいて下流のマテリアライズドテーブルを構築し、ビジネス集計を行い、DWS 層を完成させます。
-
dwd_user_log_product マテリアライズドテーブルを作成して、データウェアハウスの DWD 層を構築します。
-
左側メニューで [Data Management] を選択し、対象の Paimon カタログをクリックします。
-
対象のデータベース (この例では default) をクリックし、[Create Materialized Table] をクリックします。次のSQL文をSQLエディターにコピーし、[Create] をクリックします。
-- DWD層のワイド化ロジック CREATE MATERIALIZED TABLE dwd_user_log_product( PRIMARY KEY (item_id) NOT ENFORCED ) PARTITIONED BY(ds) WITH ( 'partition.fields.ds.date-formatter' = 'yyyyMMdd' ) FRESHNESS = INTERVAL '1' HOUR -- 1 時間ごとに更新 AS SELECT l.ds, l.item_id, l.user_id, l.vtime, r.brand_id, r.seller_id FROM `paimon`.`default`.`ods_user_log` l INNER JOIN `paimon`.`default`.`ods_dim_product` r ON l.item_id = r.item_id;
-
-
dwd_user_log_product マテリアライズドテーブルに基づいて多次元のビジネス集計を実行し、DWS 層を構築します。
このトピックでは、日ごとの時間単位のPV/UVカウントを集計する dws_overall マテリアライズドテーブルの作成方法を示します。前の手順と同様に dws_overall マテリアライズドテーブルを作成します。
// 日次でPV/UVを集計 CREATE MATERIALIZED TABLE dws_overall( PRIMARY KEY(ds, hh) NOT ENFORCED ) PARTITIONED BY(ds) WITH ( 'partition.fields.ds.date-formatter' = 'yyyyMMdd' ) FRESHNESS = INTERVAL '1' HOUR -- 1 時間ごとに更新 AS SELECT ds, COALESCE(hh, 'day') AS hh, count(*) AS pv, count(distinct user_id) AS uv FROM (SELECT ds, date_format(vtime, 'HH') AS hh, user_id FROM `paimon`.`default`.`dwd_user_log_product`) tmp GROUP BY GROUPING SETS(ds, (ds, hh));
ステップ3:マテリアライズドテーブルの更新
更新の開始
この例では、データの鮮度は 1 時間に設定されています。[Start Update] をクリックすると、データの更新はベーステーブルの更新から少なくとも 1 時間遅れます。
-
左側メニューで、 を選択し、対象のマテリアライズドテーブルを検索します。
-
マテリアライズドテーブルビューをクリックし、ページ右下隅にある [Start Update] をクリックします。
データバックフィル
データバックフィルは、履歴データを特定のパーティションまたはテーブル全体に書き換えます。ストリーム処理の結果を修正したり、まだスケジュールされた時間に達していないバッチジョブのデータを即座に更新したりするために使用されます。
dwd_user_log_product マテリアライズドテーブルビューを選択し、右下隅にある [Manual Update] をクリックします。現在の日付 (例:20241216) をパーティション名として入力し、[Cascade update downstream associated materialized tables] にチェックを入れ、[Confirm] をクリックします。確認ダイアログボックスで [Confirm] をクリックして、データを即座に上書きします。
データバックフィルの詳細については、「履歴データのバックフィル」をご参照ください。
データ鮮度の変更
ビジネスニーズに応じて、データの鮮度を調整してマテリアライズドテーブルを日次、時間単位、分単位、さらには秒単位で更新できます。
dwd_user_log_product と dws_overall の両方のマテリアライズドテーブルの鮮度設定を更新します。マテリアライズドテーブルビューをクリックし、右下隅にある [Modify Data Freshness] をクリックします。リアルタイム更新のために鮮度を分単位に設定します。
データ鮮度の変更に関する詳細については、「データ鮮度の変更」をご参照ください。
ステップ4:マテリアライズドテーブルのクエリ
データプレビュー
マテリアライズドテーブルの最新 100 行をプレビューできます。
-
左側メニューで、 を選択し、対象のマテリアライズドテーブルを検索します。
-
マテリアライズドテーブルビューをクリックし、ページ右下隅にある [Details] をクリックします。
-
マテリアライズドテーブルの [Data Preview] タブで、[Query] アイコンをクリックします。
データクエリ
左側メニューで、 を選択します。次のSQL文をSQLエディターにコピーし、コードスニペットを選択して [Run] をクリックして、dws_overall マテリアライズドテーブルをクエリします。
SELECT * FROM `paimon`.`default`.dws_overall ORDER BY hh;
関連ドキュメント
-
マテリアライズドテーブルの詳細については、「マテリアライズドテーブルの管理」をご参照ください。
-
マテリアライズドテーブルの作成と使用に関する詳細については、「マテリアライズドテーブルの作成と使用」をご参照ください。