すべてのプロダクト
Search
ドキュメントセンター

Realtime Compute for Apache Flink:Paimon と StarRocks によるストリーミングレイクハウス

最終更新日:Jun 23, 2026

Realtime Compute for Apache Flink、Apache Paimon、StarRocks を使用して、ストリーミングデータレイクハウスを構築する方法を説明します。

背景

ビジネスのデジタル化が進むにつれて、タイムリーなデータに対する需要が高まっています。従来のオフラインデータウェアハウスの構築方法では、オフラインジョブをスケジューリングし、新しいデータを ODS、DWD、DWS、ADS などのウェアハウス階層に定期的にマージします。しかし、このアプローチには大きく 2 つの問題があります。レイテンシーが高いことと、コストが高いことです。オフラインジョブは通常、1 時間ごと、または 1 日ごとにスケジューリングされるため、ダウンストリームコンシューマーは、少なくとも 1 時間前、または 1 日前のデータしか参照できません。さらに、更新にはパーティション全体の上書きが必要になることがよくあります。この非効率なプロセスでは、パーティション内の元データをすべて再読み込みして、新しい変更をマージします。

Realtime Compute for Apache Flink と Apache Paimon を使用してストリーミングデータレイクハウスを構築すると、従来のオフラインデータウェアハウスが抱えるレイテンシーとコストの問題を解決できます。Flink のリアルタイム処理機能により、データはウェアハウス階層間を継続的に流れます。一方、Paimon の効率的な更新機能により、データの変更を分レベルのレイテンシーでダウンストリームコンシューマーに届けられます。その結果、ストリーミングデータレイクハウスは、低レイテンシーとコスト効率の両面で大きなメリットを提供します。

Apache Paimon の詳細については、「機能」および「Apache Paimon の公式サイト」をご参照ください。

アーキテクチャとメリット

アーキテクチャ

Realtime Compute for Apache Flink は、膨大な量のリアルタイムデータを効率的に処理できる強力なストリーム処理エンジンです。 Paimon は、ストリーミング処理とバッチ処理の両方に対応した統合レイクストレージ形式で、高スループットの更新と低レイテンシーのクエリをサポートします。 Paimon は Flink と緊密に統合されており、オールインワンのストリーミングレイクハウスソリューションを提供します。以下に、Flink と Paimon を使用してストリーミングレイクハウスを構築するためのアーキテクチャを示します。

  1. Flink はデータソースからのデータを Paimon に書き込み、ODS レイヤーを作成します。

  2. Flink は ODS レイヤーのチェンジログをサブスクライブし、データを変換して、DWD レイヤーとして Paimon に書き戻します。

  3. Flink は DWD レイヤーのチェンジログをサブスクライブし、データを変換して、DWS レイヤーとして Paimon に書き戻します。

  4. 最後に、E-MapReduce 上の StarRocks が Paimon 外部テーブルを読み取り、アプリケーションのクエリを処理します。

image

メリット

このソリューションには、次のメリットがあります:

  • Paimon の各データレイヤーは、変更を数分以内にダウンストリームシステムに伝播します。これにより、従来のオフラインデータウェアハウスのレイテンシーを、数時間、場合によっては数日から数分に短縮できます。

  • Paimon の各データレイヤーは、パーティションを上書きすることなく変更データを直接取り込みます。これにより、従来のオフラインデータウェアハウスにおけるデータ更新と修正のコストを大幅に削減し、中間レイヤーでのデータのクエリ、更新、修正に関する課題を解決します。

  • このソリューションは、統合モデルとシンプルなアーキテクチャを備えています。ETL パイプラインのロジックは Flink SQL を使用して実装します。ODS、DWD、DWS レイヤーのデータは Paimon に格納されます。これにより、アーキテクチャの複雑さを低減し、データ処理の効率を向上させます。

このソリューションは、次の表で詳しく説明する Paimon の 3 つのコア機能に基づいています。

コア機能

説明

プライマリキーテーブルの更新

Paimon は内部で LSM ツリーのデータ構造を使用し、効率的なデータ更新を実現します。

Paimon のプライマリキーテーブルと基盤となるデータ構造の詳細については、「Primary Key Table」および「File Layouts」をご参照ください。

Changelog Producer

Paimon は、任意の入力データストリームに対して完全な増分データを生成できます。このとき、各 update_after レコードには、対応する update_before レコードが存在します。これにより、変更がダウンストリームシステムに確実に伝播します。詳細については、「Changelog Producer」をご参照ください。

マージエンジン

Paimon のプライマリキーテーブルが同一のプライマリキーを持つ複数のレコードを受信した場合、マージエンジンがこれらのレコードを 1 つのレコードにマージし、キーの一意性を維持します。 Paimon は、重複排除、部分更新、事前集約など、幅広いマージ動作をサポートします。詳細については、「Merge Engine」をご参照ください。

ユースケース

この記事では EC プラットフォームを例に、ストリーミングデータレイクハウスの構築方法を紹介します。このソリューションは、データを処理およびクレンジングして、アップストリームアプリケーションからのクエリをサポートします。データ階層化を利用することで、取引ダッシュボード、行動データ分析、ユーザープロファイルタグ、パーソナライズドレコメンデーションなど、複数のビジネスシナリオでデータ再利用を可能にします。

image

  1. ODS 層の構築:ビジネスデータベースからのリアルタイム取り込み
    Flink は、MySQL の 3 つのビジネステーブル ordersorders_payproduct_catalog を OSS にリアルタイムで取り込みます。Paimon フォーマットで格納されたこのデータが、ODS 層を構成します。















  2. DWD 層の構築:テーマ別ワイドテーブル
    ordersorders_payproduct_catalog テーブルを、Paimon の部分更新マージメカニズムを使用して結合し、DWD 層向けのテーマ別ワイドテーブルと、分レベルのレイテンシーのチェンジログを作成します。















  3. DWS 層の構築:メトリック計算
    Flink は、ワイドテーブルのチェンジログをリアルタイムで消費します。Paimon の事前集約マージメカニズムを使用して、中間集約テーブル dwm_users_shops を作成します。このプロセスにより最終的に、DWS 層向けに 2 つのテーブルが生成されます。ユーザー集約メトリック用の dws_users と、ショップ集約メトリック用の dws_shops です。















前提条件

  • Data Lake Formation (DLF) をアクティブ化します。ストレージサービスとして DLF 2.5 の使用を推奨します。詳細については、「DLF の使用開始」をご参照ください。

  • Realtime Compute for Apache Flink ワークスペースを作成します。詳細については、「ワークスペースの作成」をご参照ください。

  • Serverless StarRocks インスタンスを作成します。詳細については、「Serverless StarRocks インスタンスの使用開始」をご参照ください。

説明

お使いの StarRocks インスタンス、DLF、Realtime Compute for Apache Flink ワークスペースは、同じリージョンにある必要があります。

制限

このストリーミングレイクハウスソリューションには、Ververica Runtime (VVR) 11.1.0 以降が必要です。

ストリーミングデータレイクハウスの構築

MySQL 変更データキャプチャ (CDC) データソースの準備

このチュートリアルでは、ApsaraDB RDS for MySQL を例に説明します。order_dw という名前のデータベースと、サンプルデータを含む 3 つのテーブルを作成します。

  1. (非推奨。ステップ 1 をご参照ください。) ApsaraDB RDS for MySQL インスタンスの作成

    重要

    ApsaraDB RDS for MySQL インスタンスと Realtime Compute for Apache Flink ワークスペースが同じ VPC にあることを確認してください。異なる VPC にある場合は、「How do I access other services across VPCs?」をご参照ください。

  2. (非推奨。ステップ 1 をご参照ください。) データベースとアカウントの作成

    order_dw という名前のデータベースを作成します。次に、order_dw データベースに対する読み取りおよび書き込み権限を持つ特権アカウント、または標準アカウントを作成します。

    3 つのテーブルを作成し、データを挿入します。

    CREATE TABLE `orders` (
      order_id bigint not null primary key,
      user_id varchar(50) not null,
      shop_id bigint not null,
      product_id bigint not null,
      buy_fee bigint not null,   
      create_time timestamp not null,
      update_time timestamp not null default now(),
      state int not null
    );
    CREATE TABLE `orders_pay` (
      pay_id bigint not null primary key,
      order_id bigint not null,
      pay_platform int not null, 
      create_time timestamp not null
    );
    CREATE TABLE `product_catalog` (
      product_id bigint not null primary key,
      catalog_name varchar(50) not null
    );
    -- データを準備します
    INSERT INTO product_catalog VALUES(1, 'phone_aaa'),(2, 'phone_bbb'),(3, 'phone_ccc'),(4, 'phone_ddd'),(5, 'phone_eee');
    INSERT INTO orders VALUES
    (100001, 'user_001', 12345, 1, 5000, '2023-02-15 16:40:56', '2023-02-15 18:42:56', 1),
    (100002, 'user_002', 12346, 2, 4000, '2023-02-15 15:40:56', '2023-02-15 18:42:56', 1),
    (100003, 'user_003', 12347, 3, 3000, '2023-02-15 14:40:56', '2023-02-15 18:42:56', 1),
    (100004, 'user_001', 12347, 4, 2000, '2023-02-15 13:40:56', '2023-02-15 18:42:56', 1),
    (100005, 'user_002', 12348, 5, 1000, '2023-02-15 12:40:56', '2023-02-15 18:42:56', 1),
    (100006, 'user_001', 12348, 1, 1000, '2023-02-15 11:40:56', '2023-02-15 18:42:56', 1),
    (100007, 'user_003', 12347, 4, 2000, '2023-02-15 10:40:56', '2023-02-15 18:42:56', 1);
    INSERT INTO orders_pay VALUES
    (2001, 100001, 1, '2023-02-15 17:40:56'),
    (2002, 100002, 1, '2023-02-15 17:40:56'),
    (2003, 100003, 0, '2023-02-15 17:40:56'),
    (2004, 100004, 0, '2023-02-15 17:40:56'),
    (2005, 100005, 0, '2023-02-15 18:40:56'),
    (2006, 100006, 0, '2023-02-15 18:40:56'),
    (2007, 100007, 0, '2023-02-15 18:40:56');

メタデータ管理

Paimon カタログの作成

  1. Realtime Compute for Apache Flink コンソールにログインします。

  2. 左側のナビゲーションペインで [Metadata Management] に移動し、[Create Catalog] をクリックします。

  3. [Built-in Catalog] タブで [Apache Paimon] をクリックし、[Next] をクリックします。

  4. 次のパラメーターを設定し、ストレージタイプとして DLF を選択して、[OK] をクリックします。

    パラメーター

    説明

    必須

    備考

    metastore

    metastore のタイプ。

    はい

    この例では DLF を選択します。

    catalog name

    DLF データカタログの名前。

    重要

    RAM ユーザーまたは RAM ロールを使用する場合は、RAM ユーザーまたは RAM ロールに、DLF からデータを読み取り、DLF にデータを書き込むために必要な権限が付与されていることを確認してください。詳細については、「Manage data permissions」をご参照ください。

    はい

    DLF 2.5 を使用することを推奨します。このバージョンでは、AccessKey ペアなどの情報を入力する必要がなく、既存の DLF データカタログをすばやく選択できます。データカタログの作成方法については、「Data catalog」をご参照ください。

    paimoncatalog という名前のデータカタログを作成し、リストから選択します。

  5. MySQL の order_dw データベースからすべてのテーブルを同期するために、データカタログに order_dw という名前のデータベースを作成します。

    左側のナビゲーションペインで [Data Exploration] > [Query Editor] を選択し、[New] をクリックして一時的なクエリエディターを開きます。

    -- paimoncatalog データソースを使用します
    USE CATALOG paimoncatalog;
    -- order_dw データベースを作成します
    CREATE DATABASE order_dw;

    返されたメッセージ The following statement has been executed successfully! は、データベースが正常に作成されたことを示しています。

Paimon カタログの使用方法の詳細については、「Manage Paimon catalogs」をご参照ください。

MySQL カタログの作成

  1. [Metadata Management] ページで [Create Catalog] をクリックします。

  2. [Built-in Catalog] タブで [MySQL] をクリックし、[Next] をクリックします。

  3. 次のパラメーターを設定し、[OK] をクリックして mysqlcatalog という名前の MySQL カタログを作成します。

    パラメーター

    説明

    必須

    備考

    catalog name

    カタログ名。

    はい

    任意の名前を入力します。このチュートリアルでは mysqlcatalog を使用します。

    hostname

    MySQL データベースの IP アドレスまたはホスト名。

    はい

    詳細については、「View and manage instance connection endpoints and ports」をご参照ください。ApsaraDB RDS for MySQL インスタンスと Realtime Compute for Apache Flink ワークスペースが同じ VPC にあるため、内部エンドポイントを入力します。

    port

    MySQL データベースサービスのポート番号。デフォルト値は 3306 です。

    いいえ

    詳細については、「View and manage instance connection endpoints and ports」をご参照ください。

    default-database

    デフォルトの MySQL データベースの名前。

    はい

    同期するデータベース名を入力します。このチュートリアルでは order_dw です。

    username

    MySQL データベースサービスのユーザー名。

    はい

    Prepare the MySQL CDC data source で作成したアカウントを使用します。

    password

    MySQL データベースサービスのパスワード。

    はい

    Prepare the MySQL CDC data source で作成したアカウントのパスワードを使用します。

ODS レイヤーの構築:リアルタイムインジェスト

YAML 形式の Flink CDC データインジェストジョブを使用して、MySQL から Paimon にデータを同期し、1 ステップで ODS レイヤーを構築します。

  1. YAML データインジェストジョブを作成して起動します。

    1. Realtime Compute for Apache Flink コンソール[Data Development] > [Data Ingestion] ページに移動し、ods という名前の空の YAML ドラフトジョブを作成します。

    2. 次のコードをエディターにコピーし、ユーザー名やパスワードなどのパラメーターを更新します。

      source:
        type: mysql
        name: MySQL Source
        hostname: rm-bp1e********566g.mysql.rds.aliyuncs.com
        port: 3306
        username: ${secret_values.username}
        password: ${secret_values.password}
        tables: order_dw.\.*  # 正規表現を使用して、order_dw データベース内のすべてのテーブルを読み取ります。
        # (オプション) 増分フェーズで、新しく作成されたテーブルのデータを同期します。
        scan.binlog.newly-added-table.enabled: true
        # (オプション) テーブルとフィールドのコメントを同期します。
        include-comments.enabled: true
        # (オプション) 潜在的な TaskManager の OutOfMemory 問題を回避するため、無制限チャンクの配布を優先します。
        scan.incremental.snapshot.unbounded-chunk-first.enabled: true
        # (オプション) 読み取りを高速化するため、解析フィルターを有効にします。
        scan.only.deserialize.captured.tables.changelog.enabled: true
      sink:
        type: paimon
        name: Paimon Sink
        catalog.properties.metastore: rest
        catalog.properties.uri: http://cn-beijing-vpc.dlf.aliyuncs.com
        catalog.properties.warehouse: paimoncatalog
        catalog.properties.token.provider: dlf
      pipeline:
        name: MySQL to Paimon Pipeline

      パラメーター

      説明

      必須

      catalog.properties.metastore

      metastore のタイプ。rest に設定します。

      はい

      rest

      catalog.properties.token.provider

      トークンプロバイダー。DLF に設定します。

      はい

      DLF

      catalog.properties.uri

      DLF Rest Catalog Server のアクセス URI は http://[region-id]-vpc.dlf.aliyuncs.com です。リージョン ID の詳細については、「サービスエンドポイント」をご参照ください。

      はい

      http://cn-beijing-vpc.dlf.aliyuncs.com

      catalog.properties.warehouse

      DLF カタログの名前。

      はい

      paimoncatalog

      hostname

      MySQL データベースの IP アドレスまたはホスト名。詳細については、「View and manage instance connection endpoints and ports」をご参照ください。ApsaraDB RDS for MySQL インスタンスと Realtime Compute for Apache Flink ワークスペースが同じ VPC にあるため、内部エンドポイントを入力します。

      はい

      rm-bp1e********566g.mysql.rds.aliyuncs.com

      username

      MySQL データベースのユーザー名。シークレット管理を使用することを推奨します。詳細については、「Manage variables」をご参照ください。

      はい

      ${secret_values.username}

      password

      MySQL データベースのパスワード。シークレット管理を使用することを推奨します。詳細については、「Manage variables」をご参照ください。

      はい

      ${secret_values.password}

      Paimon の書き込みパフォーマンスを最適化する方法については、「Paimon performance tuning」をご参照ください。

    3. 右上隅の [Deploy] をクリックします。

    4. [O&M Center] > [Job O&M] で、新しくデプロイした ODS ジョブの [Actions] 列にある [Start] をクリックし、[ステートレス起動]を選択してジョブを起動します。ジョブの起動設定の詳細については、「Job Startup」をご参照ください。

  2. MySQL から Paimon に同期した 3 つのテーブルのデータを確認します。

    Realtime Compute for Apache Flink コンソール[Data Development] > [Data Exploration] ページに移動します。[Query Editor] タブで次のコードをエディターにコピーし、ステートメントを選択してから、右上隅の [Run] をクリックします。

    SELECT * FROM paimoncatalog.order_dw.orders ORDER BY order_id;

    クエリの実行後、orders テーブルから 7 件の注文レコードが返されます。結果には、order_id (100001 ~ 100007)、user_idshop_idproduct_idbuy_fee (1000 ~ 5000)、create_timeupdate_timestate 列が含まれます。state の値は、すべてのレコードで 1 です。

DWD レイヤーの構築:テーマ別ワイドテーブル

  1. dwd_orders ワイドテーブルの作成

    Realtime Compute for Apache Flink コンソールで、データ開発 > データ探索 ページに移動します。[クエリエディター] タブで、次のコードをエディターにコピーし、ステートメントを選択して、右上隅の [実行] をクリックします。

    CREATE TABLE paimoncatalog.order_dw.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 'プラットフォーム 0: phone、1: pc',
        pay_create_time TIMESTAMP,
        PRIMARY KEY (order_id) NOT ENFORCED
    ) WITH (
        'merge-engine' = 'partial-update', -- 部分更新マージエンジンを使用してワイドテーブルを生成します
        'changelog-producer' = 'lookup' -- lookup 変更ログプロデューサーを使用して、低レイテンシーの変更ログを生成します
    );

    The following statement has been executed successfully! というメッセージは、作成が成功したことを示します。

  2. ODS 変更データの消費

    Realtime Compute for Apache Flink コンソールで、[データ開発] > [ETL]ページに移動します。dwd という名前の新しい SQL ストリーミングジョブを作成し、次のコードを SQL エディターにコピーして [デプロイ] をクリックし、[ステートレス起動] を使用してジョブを開始します。

    この SQL ジョブは、ディメンションテーブル結合で orders テーブルと product_catalog テーブルを結合します。次に、その結果と orders_pay テーブルからのデータを dwd_orders テーブルに書き込みます。Paimon の部分更新マージメカニズムは、同じ order_id を持つ orders テーブルと orders_pay テーブルのレコードを結合します。

    SET 'execution.checkpointing.max-concurrent-checkpoints' = '3';
    SET 'table.exec.sink.upsert-materialize' = 'NONE';
    SET 'execution.checkpointing.interval' = '10s';
    SET 'execution.checkpointing.min-pause' = '10s';
    -- 現在、Paimon は単一ジョブ内で同一テーブルへの複数の INSERT 文をサポートしていません。そのため、ここでは UNION ALL を使用します。
    INSERT INTO paimoncatalog.order_dw.dwd_orders 
    SELECT 
        o.order_id,
        o.user_id,
        o.shop_id,
        o.product_id,
        dim.catalog_name,
        o.buy_fee,
        o.create_time,
        o.update_time,
        o.state,
        NULL,
        NULL,
        NULL
    FROM
        paimoncatalog.order_dw.orders o 
        LEFT JOIN paimoncatalog.order_dw.product_catalog FOR SYSTEM_TIME AS OF proctime() AS dim
        ON o.product_id = dim.product_id
    UNION ALL
    SELECT
        order_id,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        pay_id,
        pay_platform,
        create_time
    FROM
        paimoncatalog.order_dw.orders_pay;
  3. dwd_orders のデータ確認

    Realtime Compute for Apache Flink コンソールで、[データ開発] > [データ探索] ページに移動します。[クエリエディター] タブで、次のコードをエディターにコピーし、ステートメントを選択してから、右上隅にある [実行] をクリックします。

    SELECT * FROM paimoncatalog.order_dw.dwd_orders ORDER BY order_id;

    クエリが正常に実行されると、dwd_orders ワイドテーブルから 7 件の注文レコードが返されます。結果には 12 のフィールドが含まれます:order_idorder_user_idorder_shop_idorder_product_idorder_product_catalog_nameorder_feeorder_create_timeorder_update_timeorder_statepay_idpay_platformpay_create_timeorder_id は 100001 ~ 100007 の範囲で、注文金額は 1000 ~ 5000 の範囲です。また、すべての作成時刻は 2023-02-15 です。

DWS レイヤーの構築:メトリック計算

  1. DWS レイヤーの集計テーブル dws_users と dws_shops を作成します。

    Realtime Compute for Apache Flink コンソールで、[データ開発] > [データ探索] ページに移動します。 [クエリエディター] タブで、次のコードをエディターにコピーし、ステートメントを選択して、右上隅にある [実行] をクリックします。

    -- ユーザーディメンションの集計テーブル。
    CREATE TABLE paimoncatalog.order_dw.dws_users (
        user_id STRING,
        ds STRING,
        paid_buy_fee_sum BIGINT COMMENT '当日の支払総額',
        PRIMARY KEY (user_id, ds) NOT ENFORCED
    ) WITH (
        'merge-engine' = 'aggregation', -- 集計マージエンジンを使用して集計テーブルを生成します。
        'fields.paid_buy_fee_sum.aggregate-function' = 'sum' -- paid_buy_fee_sum のデータを合計して結果を集計します。
        -- dws_usersテーブルは下流のストリーミングジョブで消費されないため、変更ログプロデューサーを指定する必要はありません。
    );
    -- ショップディメンションの集計テーブル。
    CREATE TABLE paimoncatalog.order_dw.dws_shops (
        shop_id BIGINT,
        ds STRING,
        paid_buy_fee_sum BIGINT COMMENT '当日の支払総額',
        uv BIGINT COMMENT '当日のユニーク購入ユーザー数',
        pv BIGINT COMMENT '当日のユーザーによる総購入数',
        PRIMARY KEY (shop_id, ds) NOT ENFORCED
    ) WITH (
        'merge-engine' = 'aggregation', -- 集計マージエンジンを使用して集計テーブルを生成します。
        'fields.paid_buy_fee_sum.aggregate-function' = 'sum', -- paid_buy_fee_sum のデータを合計して結果を集計します。
        'fields.uv.aggregate-function' = 'sum', -- uv のデータを合計して結果を集計します。
        'fields.pv.aggregate-function' = 'sum' -- pv のデータを合計して結果を集計します。
        -- dws_shopsテーブルは下流のストリーミングジョブで消費されないため、変更ログプロデューサーを指定する必要はありません。
    );
    -- ユーザーディメンションとショップディメンションの集計テーブルを同時に計算するため、ユーザーとショップを主キーとする中間テーブルを作成します。
    CREATE TABLE paimoncatalog.order_dw.dwm_users_shops (
        user_id STRING,
        shop_id BIGINT,
        ds STRING,
        paid_buy_fee_sum BIGINT COMMENT 'あるユーザーがあるショップで当日に支払った合計金額',
        pv BIGINT COMMENT 'あるユーザーがあるショップで当日に購入した回数',
        PRIMARY KEY (user_id, shop_id, ds) NOT ENFORCED
    ) WITH (
        'merge-engine' = 'aggregation', -- 集計マージエンジンを使用して集計テーブルを生成します。
        'fields.paid_buy_fee_sum.aggregate-function' = 'sum', -- paid_buy_fee_sum のデータを合計して結果を集計します。
        'fields.pv.aggregate-function' = 'sum', -- pv のデータを合計して結果を集計します。
        'changelog-producer' = 'lookup', -- lookup 変更ログプロデューサーを使用して、低レイテンシーの変更ログを生成します。
        -- DWM レイヤーの中間テーブルは通常、上流のアプリケーションから直接クエリされないため、書き込みパフォーマンスを最適化できます。
        'file.format' = 'avro', -- Avro の行ベースストレージフォーマットを使用すると、より効率的な書き込みパフォーマンスが得られます。
        'metadata.stats-mode' = 'none' -- 統計を省略すると OLAP クエリのコストは増加しますが (継続的なストリーム処理には影響なし)、書き込みパフォーマンスは向上します。
    );

    The following statement has been executed successfully! というメッセージは、作成が成功したことを示します。

  2. DWD レイヤーのテーブル dwd_orders から変更データを消費します。

    Realtime Compute for Apache Flink コンソールで、[[データ開発 > ETL]] ページに移動し、dwm という名前の新しい SQL ストリーミングジョブを作成します。 次のコードを SQL エディターにコピーし、[デプロイ] をクリックしてから、[ステートレス開始] を使用してジョブを開始します。

    この SQL ジョブは、dwd_orders テーブルのデータを dwm_users_shops テーブルに書き込みます。Paimon の事前集約データマージメカニズムは、order_fee を自動的に合計して、ユーザーがショップで支払った合計金額を算出します。また、値 1 を合計して、ユーザーがそのショップで購入した回数を算出します。

    SET 'execution.checkpointing.max-concurrent-checkpoints' = '3';
    SET 'table.exec.sink.upsert-materialize' = 'NONE';
    SET 'execution.checkpointing.interval' = '10s';
    SET 'execution.checkpointing.min-pause' = '10s';
    INSERT INTO paimoncatalog.order_dw.dwm_users_shops
    SELECT
        order_user_id,
        order_shop_id,
        DATE_FORMAT (pay_create_time, 'yyyyMMdd') as ds,
        order_fee,
        1 -- 1 つの入力レコードが 1 回の購入を表します
    FROM paimoncatalog.order_dw.dwd_orders
    WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL;
  3. DWM レイヤーのテーブル dwm_users_shops から変更データをリアルタイムで消費します。

    Realtime Compute for Apache Flink コンソールで、[データ開発] > [ETL] ページに移動します。dws という名前の新しい SQL ストリーミングジョブを作成します。次のコードを SQL エディターにコピーし、[デプロイ] をクリックして、[ステートレス起動] を使用してジョブを開始します。

    この SQL ジョブは、dwm_users_shops テーブルのデータを dws_users テーブルと dws_shops テーブルに書き込みます。Paimon の事前集約データマージメカニズムを使用して、dws_users テーブルでは各ユーザーの合計支出額 (paid_buy_fee_sum) を算出します。dws_shops テーブルでは、ショップの総売上 (paid_buy_fee_sum)、購入ユーザー数 (1 の合計)、総購入回数 (pv) を算出します。

    SET 'execution.checkpointing.max-concurrent-checkpoints' = '3';
    SET 'table.exec.sink.upsert-materialize' = 'NONE';
    SET 'execution.checkpointing.interval' = '10s';
    SET 'execution.checkpointing.min-pause' = '10s';
    -- DWD ジョブとは異なり、ここでの各 INSERT 文は異なる Paimon テーブルに書き込むため、同じジョブに含めることができます。
    BEGIN STATEMENT SET;
    INSERT INTO paimoncatalog.order_dw.dws_users
    SELECT 
        user_id,
        ds,
        paid_buy_fee_sum
    FROM paimoncatalog.order_dw.dwm_users_shops;
    -- 主キーはショップ ID です。人気のあるショップのデータは、他のショップよりもはるかに大きくなる可能性があります。
    -- したがって、ローカルマージを使用してメモリ内でデータを事前集計してから Paimon に書き込み、データスキューを軽減します。
    INSERT INTO paimoncatalog.order_dw.dws_shops /*+ OPTIONS('local-merge-buffer-size' = '64mb') */
    SELECT
        shop_id,
        ds,
        paid_buy_fee_sum,
        1, -- 1 つの入力レコードが、このショップでのあるユーザーのすべての購入を表します
        pv
    FROM paimoncatalog.order_dw.dwm_users_shops;
    END;
  4. dws_users テーブルと dws_shops テーブルのデータを確認します。

    Realtime Compute for Apache Flink コンソールで、[データ開発] > [データ探索] ページに移動します。[クエリエディター] タブで、次のコードをエディターにコピーし、ステートメントを選択して、右上隅の [実行] をクリックします。

    -- dws_users テーブルのデータを表示します
    SELECT * FROM paimoncatalog.order_dw.dws_users ORDER BY user_id;

    クエリの実行後、dws_users テーブルから、user_iddspaid_buy_fee_sum 列を含む 3 件のレコードが返されます。返されるレコードは user_001 / 20230215 / 8000user_002 / 20230215 / 5000user_003 / 20230215 / 5000 です。

    -- dws_shops テーブルのデータを表示します
    SELECT * FROM paimoncatalog.order_dw.dws_shops ORDER BY shop_id;

    dws_shops テーブルのクエリ後、結果には 4 行 5 列が含まれます:shop_iddspaid_buy_fee_sumuvpv。shop_id は 12345 ~ 12348 で、ds はすべてのレコードで 20230215 です。paid_buy_fee_sum は 5000、4000、7000、2000、uv は 1、1、2、2、pv はそれぞれ 1、1、3、2 です。

業務データベースからの変更のキャプチャ

ストリーミングデータレイクハウスを構築した後、業務データベースからの変更をキャプチャする機能をテストします。

  1. MySQL の order_dw データベースに次のデータを挿入します。

    INSERT INTO orders VALUES
    (100008, 'user_001', 12345, 3, 3000, '2023-02-15 17:40:56', '2023-02-15 18:42:56', 1),
    (100009, 'user_002', 12348, 4, 1000, '2023-02-15 18:40:56', '2023-02-15 19:42:56', 1),
    (100010, 'user_003', 12348, 2, 2000, '2023-02-15 19:40:56', '2023-02-15 20:42:56', 1);
    INSERT INTO orders_pay VALUES
    (2008, 100008, 1, '2023-02-15 18:40:56'),
    (2009, 100009, 1, '2023-02-15 19:40:56'),
    (2010, 100010, 0, '2023-02-15 20:40:56');
  2. dws_users テーブルと dws_shops テーブルのデータを表示します。Realtime Compute for Apache Flink コンソールで、データ開発 > データ探索 ページに移動します。[クエリエディタ] タブで、次のコードをエディタにコピーし、ステートメントを選択して、右上隅の [実行] をクリックします。

    • dws_users テーブル

      SELECT * FROM paimoncatalog.order_dw.dws_users ORDER BY user_id;

      クエリでは、user_iddspaid_buy_fee_sum 列を含む 3 行が返されます。返されるレコードは user_001 / 20230215 / 11000user_002 / 20230215 / 6000user_003 / 20230215 / 7000 です。

    • dws_shops テーブル

      SELECT * FROM paimoncatalog.order_dw.dws_shops ORDER BY shop_id;

      クエリでは、shop_iddspaid_buy_fee_sumuvpv の 5 列を含む 4 行が返されます。shop_id は 12345、12346、12347、12348 で、ds はすべてのレコードで 20230215 です。paid_buy_fee_sum は 8000、4000、7000、5000、uv は 1、1、2、3、pv はそれぞれ 2、1、3、4 です。

ストリーミングデータレイクハウスの使用

前のセクションでは、Paimon カタログを作成し、Flink で Paimon テーブルに書き込む方法を説明しました。このセクションでは、ストリーミングデータレイクハウスをセットアップ後、StarRocks を使用してデータ分析を行う簡単なユースケースを紹介します。

StarRocks と DLF の接続

詳細については、「Access DLF from Serverless StarRocks」をご参照ください。

ランキングクエリ

次の StarRocks クエリは、DWS レイヤーの集計テーブルを分析し、2023年2月15日の取引額上位 3 店舗を取得します。

SELECT ROW_NUMBER() OVER (ORDER BY paid_buy_fee_sum DESC) AS rn, shop_id, paid_buy_fee_sum
FROM paimoncatalog.order_dw.dws_shops
WHERE ds = '20230215'
ORDER BY rn LIMIT 3;

クエリは 3 行を返します。 rn=1shop_id=12345paid_buy_fee_sum=8000.00 に、 rn=2shop_id=12347paid_buy_fee_sum=7000.00 に、 rn=3shop_id=12348paid_buy_fee_sum=5000.00 に対応します。

詳細クエリ

次の StarRocks クエリは、DWD レイヤーのワイドテーブルを分析し、2023年2月に特定の決済プラットフォームを使用した特定顧客の注文詳細を取得します。

SELECT * FROM paimoncatalog.order_dw.dwd_orders
WHERE order_create_time >= '2023-02-01 00:00:00' AND order_create_time < '2023-03-01 00:00:00'
AND order_user_id = 'user_001'
AND pay_platform = 0
ORDER BY order_create_time;;

クエリは次の結果を返します。

   order_id  order_user_id  order_shop_id  order_product_id  order_product_catalog_name  order_fee
0  100006    user_001       12348          1                 phone_aaa                   1000
1  100004    user_001       12347          4                 phone_ddd                   2000

データレポート

次の StarRocks クエリは、DWD レイヤーのワイドテーブルを分析し、2023年2月の各日付および商品カテゴリ別の注文数と注文総額のレポートを生成します。

SELECT
  DATE(order_create_time) AS order_create_date,
  order_product_catalog_name,
  COUNT(*),
  SUM(order_fee)
FROM
  paimoncatalog.order_dw.dwd_orders
WHERE
  order_create_time >= '2023-02-01 00:00:00'  and order_create_time < '2023-03-01 00:00:00'
GROUP BY
  order_create_date, order_product_catalog_name
ORDER BY
  order_create_date, order_product_catalog_name;

このクエリは、指定された期間を対象に、日付と商品カテゴリでグループ化された注文数と注文総額を返します。返される各レコードには、日付 (order_create_date)、商品カテゴリ (order_product_catalog_name)、注文数 (COUNT(*))、および注文総額 (SUM(order_fee)) が含まれます。

参考資料