Realtime Compute for Apache Flink の強力なリアルタイム処理と、Hologres の高度な機能 (バイナリログ、ハイブリッド行列ストレージ、強力なリソース分離など) を組み合わせることで、効率的かつスケーラブルなリアルタイムデータウェアハウスを構築できます。このソリューションは、増大するデータ量の管理と、リアルタイムのビジネス要求への対応に役立ちます。
背景
ビジネスのデジタル化が進むにつれ、データの鮮度に対する需要が高まっています。多くのビジネスシナリオでは、従来のオフラインバッチ処理を超えて、リアルタイムデータ処理、ストレージ、分析が求められています。オフラインデータウェアハウスには、スケジュールされたジョブによる階層的なデータ処理 (ODS > DWD > DWS > ADS) という確立された方法論がありますが、リアルタイムデータウェアハウスを構築するための明確で確立されたフレームワークは、まだ発展途上です。このソリューションでは、ストリーミングウェアハウスのコンセプトを適用することで、階層間で効率的なリアルタイムデータのフローを実現し、リアルタイムデータの階層化における課題を解決します。
シナリオ
本トピックでは EC プラットフォームを例に、Flink と Hologres を深く統合してリアルタイムデータウェアハウスを構築する方法を説明します。この構成により、リアルタイムデータ処理とデータクレンジングを実現し、上流アプリケーションからのデータクエリをサポートするとともに、データ階層化と再利用を実現します。また、この構成は、取引ダッシュボード向けレポートのクエリ、行動データ分析、ユーザープロファイリング、パーソナライズドレコメンデーションなど、さまざまなビジネスシナリオをサポートします。
アーキテクチャ
-
1. ODS 層の構築:ビジネスデータベースからデータをリアルタイムにインジェストします。
MySQL には、3 つのビジネステーブル (
orders(注文テーブル)、orders_pay(注文支払いテーブル)、product_catalog(商品カテゴリ辞書テーブル)) が含まれます。Flink はこれら 3 つのテーブルを Hologres にリアルタイムで同期し、ODS 層を構成します。 -
2. DWD 層の構築:リアルタイムワイドテーブルを作成します。
Flink は
orders、product_catalog、orders_payテーブルをリアルタイムに結合し、DWD 層にワイドテーブルを作成します。 -
3. DWS 層の構築:リアルタイム指標を算出します。
Flink はイベント駆動型のプロセスでワイドテーブルの Binlog を消費し、データを集計して、DWS 層にユーザーおよびショップ向けの指標テーブルを作成します。
-
4. Hologres を通じてアプリケーションのクエリを処理します。
-
アプリケーションは DWS 層の集計済み指標テーブルにクエリを実行でき、1 秒あたり数百万リクエスト (RPS) をサポートします。
-
アプリケーションは DWD のワイドテーブルに対して OLAP 分析を実行するか、そのデータに基づいてリアルタイムレポートを表示できます。応答時間は数秒です。
-
メリットとコア機能
このソリューションには次のメリットがあります:
-
効率的な更新と即時クエリ:Hologres は、各層のデータに対する効率的な更新、修正、および書き込み後の読み取り整合性をサポートします。これにより、中間層のデータはクエリ、更新、修正が困難であるという、従来のリアルタイムデータウェアハウスの主要な制約に対処します。
-
データ階層化と再利用:Hologres のすべてのデータ層は、それぞれ独立して外部サービスに公開できるため、効率的なデータ階層化と再利用を実現できます。
-
アーキテクチャの簡素化と効率の向上:Flink SQL を使用してリアルタイム ETL パイプラインを構築し、ODS 層、DWD 層、DWS 層のデータを Hologres に格納することで、アーキテクチャを簡素化し、データ処理効率を向上させます。
このソリューションは、Hologres の 3 つのコア機能を活用しています。詳細は次の表をご参照ください。
|
コア機能 |
説明 |
|
Hologres は Binlog 機能を提供します。この機能を利用することで Flink はリアルタイム計算を実行でき、ストリーム処理の上流ソースとして機能します。 |
|
|
Hologres はハイブリッド行列表ストレージ形式をサポートします。単一のテーブルに行指向形式と列指向形式の両方でデータを格納し、それらの間で強い整合性を維持します。この機能により、中間テーブルを Flink のソーステーブルとして利用できるほか、ポイントクエリおよびディメンションテーブル結合向けのディメンションテーブルとして利用できます。また、他のアプリケーション (OLAP やオンラインサービスなど) からもクエリできます。 |
|
|
強力なリソース分離 |
Hologres インスタンスに高負荷がかかると、中間層に対するポイントクエリのパフォーマンスに影響する場合があります。Hologres は、プライマリインスタンスとセカンダリインスタンス (共有ストレージ) による読み書き分離構成、または 仮想ウェアハウスのインスタンスアーキテクチャ により、強力なリソース分離をサポートします。これにより、Hologres から Binlog データを取得する Flink ジョブがオンラインサービスに影響しないようにできます。 |
前提条件
-
このリアルタイムデータウェアハウスソリューションは、Hologres の専用インスタンスでのみ利用できます。
-
Realtime Compute for Apache Flink、RDS MySQL、および Hologres のインスタンスは、同じ VPC 内にある必要があります。同じ VPC 内にない場合は、まず VPC を接続するか、パブリックエンドポイントを使用してアクセスする必要があります。詳細については、「VPC をまたいで他のサービスにアクセスする方法」および「インターネットにアクセスする方法」をご参照ください。
-
アクセスに使用する RAM ユーザーまたは RAM ロールが、Realtime Compute for Apache Flink、Hologres、および RDS MySQL の各リソースに必要な権限を持っていることを確認してください。
ステップ1:リソースの準備
RDS MySQL インスタンスの作成とデータソースの準備
-
RDS MySQL インスタンスを作成します。詳細については、「ApsaraDB RDS for MySQL インスタンスの作成」をご参照ください。
RDS MySQL インスタンスは、Flink ワークスペースおよび Hologres インスタンスと同じ VPC 内に配置する必要があります。
-
データベースとアカウントを作成します。
対象のインスタンスに、
order_dwという名前のデータベースと、そのデータベースに対する読み取り/書き込み権限を持つ標準アカウントを作成します。詳細については、「データベースの作成」および「アカウントの作成」をご参照ください。 -
MySQL CDC データソースを準備します。
-
インスタンスの詳細ページで、Log On to Database をクリックします。
-
[Connect to Instance] ダイアログボックスで、作成したアカウントのユーザー名とパスワードを入力し、Sign in をクリックします。
-
サインイン後、データベースインスタンスページで
order_dwデータベースをダブルクリックして切り替えます。 -
SQL コンソールエリアで、3 つのビジネステーブルを作成する DDL ステートメントと、データを挿入するステートメントを記述します。
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 numeric(20,2) 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.05, '2023-02-15 16:40:56', '2023-02-15 18:42:56', 1), (100002, 'user_002', 12346, 2, 4000.04, '2023-02-15 15:40:56', '2023-02-15 18:42:56', 1), (100003, 'user_003', 12347, 3, 3000.03, '2023-02-15 14:40:56', '2023-02-15 18:42:56', 1), (100004, 'user_001', 12347, 4, 2000.02, '2023-02-15 13:40:56', '2023-02-15 18:42:56', 1), (100005, 'user_002', 12348, 5, 1000.01, '2023-02-15 12:40:56', '2023-02-15 18:42:56', 1), (100006, 'user_001', 12348, 1, 1000.01, '2023-02-15 11:40:56', '2023-02-15 18:42:56', 1), (100007, 'user_003', 12347, 4, 2000.02, '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');
-
-
Upload をクリックし、続いて [Execute] をクリックします。
Hologres インスタンスおよび仮想ウェアハウスの作成
-
専用 Hologres インスタンスを作成します。詳細については、「Hologres インスタンスの購入」をご参照ください。
Hologres インスタンスは、RDS MySQL インスタンスと同じ VPC 内に配置する必要があります。読み書き分離による Hologres の強力なリソース分離機能を体験するには、インスタンスタイプとして Virtual Warehouse を選択し、[Reserved Computing Resources of Virtual Warehouse] を 64 に設定します。これにより、新しい仮想ウェアハウスを作成できます。
-
インスタンスにサインインした後、データベースを作成して権限を付与します。
order_dw という名前のデータベースを作成し (簡易権限モデルを有効にする必要があります)、ユーザーに管理者権限を付与します。データベースの作成と権限の付与に関する詳細については、「DB Management」をご参照ください。
説明-
アカウントが User Account ドロップダウンリストに表示されない場合は、インスタンスに追加されていません。Users ページに移動して、ユーザーをスーパーユーザーとして追加してください。
-
Hologres V2.0 以降では、Binlog 拡張がデフォルトで有効になっており、手動で実行する必要はありません。
-
-
新しい仮想ウェアハウスを作成します。
異なる仮想ウェアハウスを使用して、リソース分離を実現できます。データの書き込みには初期仮想ウェアハウス
init_warehouseを使用し、クエリにはread_warehouse_1仮想ウェアハウスを使用します。予約済みコンピューティングリソースは、初期仮想ウェアハウス
init_warehouseに完全に割り当てられています。新しい仮想ウェアハウスを作成する前に、まずそのリソースを削減する必要があります。詳細については、「新しい仮想ウェアハウスインスタンスの作成」をご参照ください。-
をクリックし、インスタンス名が正しいことを確認します。
-
既存の仮想ウェアハウス
init_warehouseの行で、設定の調整 列の Actions をクリックします。リソースを削減し、OK をクリックします。 -
仮想ウェアハウスの新規追加 をクリックし、
read_warehouse_1という名前の新しい仮想ウェアハウスを作成して、OK をクリックします。
-
Flink ワークスペースとカタログの作成
-
Flink ワークスペースを作成します。詳細については、「Realtime Compute for Apache Flink の有効化」をご参照ください。
Flink ワークスペースは、RDS MySQL および Hologres インスタンスと同じ VPC 内に配置する必要があります。
-
Realtime Compute for Apache Flink コンソールにサインインし、対象のワークスペースの行で、[Actions] 列の Console をクリックします。
-
セッションクラスターを作成して、カタログとクエリスクリプトを作成するための実行環境を提供します。詳細については、「ステップ 1: セッションクラスターの作成」をご参照ください。
-
Hologres カタログを作成します。
ページの Script タブで、次のコードをスクリプトエディターにコピーします。パラメータ値を変更し、スニペットを選択してから、Run をクリックします。右下で、作成したセッションクラスターが実行環境として選択されていることを確認してください。
CREATE CATALOG dw WITH ( 'type' = 'hologres', 'endpoint' = '<ENDPOINT>', 'username' = 'BASIC$flinktest', 'password' = '${secret_values.holosecret}', 'dbname' = 'order_dw@init_warehouse', -- データベース名を指定し、init_warehouse 仮想ウェアハウスに接続します。 'binlog' = 'true', -- カタログを作成する際、ソーステーブル、ディメンションテーブル、結果テーブルの WITH パラメータを設定できます。これらのデフォルトパラメータは、このカタログ配下のテーブルを使用する際に自動的に追加されます。 'sdkMode' = 'jdbc', -- jdbc モードを推奨します。 'cdcmode' = 'true', 'connectionpoolname' = 'the_conn_pool', 'ignoredelete' = 'true', -- ワイドテーブルのマージで撤回を防ぐため、これを有効にする必要があります。 'partial-insert.enabled' = 'true', -- ワイドテーブルのマージで部分的なカラム更新を可能にするため、このパラメータを有効にする必要があります。 'mutateType' = 'insertOrUpdate', -- ワイドテーブルのマージで部分的なカラム更新を可能にするため、このパラメータを有効にする必要があります。 'table_property.binlog.level' = 'replica', -- カタログを作成する際に、永続的な Hologres テーブルプロパティを渡すこともできます。これにより、テーブルを作成する際に Binlog がデフォルトで有効になります。 'table_property.binlog.ttl' = '259200' );次のパラメータ値を、実際の Hologres サービス情報に合わせて変更してください。
パラメータ
説明
備考
endpoint
Hologres インスタンスのエンドポイント。
Hologres インスタンスの詳細ページで、VPC ネットワークタイプのドメイン名を取得します。ドメイン名に関する詳細については、「エンドポイント」をご参照ください。
username
次のいずれかを選択します。
-
カスタムアカウントのユーザー名は、
BASIC$<user_name>の形式です。 -
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。
-
ここで設定するユーザーには、Hologres データベースへのアクセス権が必要です。Hologres データベースの権限とユーザー管理に関する詳細については、「Hologres 権限モデル」および「ユーザー管理」をご参照ください。
-
この例では、
BASIC$flinktestという名前のカスタムアカウントを使用し、プレーンテキストで保存する場合のセキュリティリスクを回避するため、holosecretという名前のプロジェクト変数を使用してパスワードを設定しています。詳細については、「プロジェクト変数」をご参照ください。
password
-
カスタムアカウントのパスワード。
-
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。
説明カタログを作成する際、ソーステーブル、ディメンションテーブル、結果テーブルのデフォルト WITH パラメータを設定できます。また、
table_propertyで始まるパラメータなど、Hologres 物理テーブルを作成するためのデフォルトプロパティを設定することもできます。詳細については、「Hologres カタログの管理」および「Hologres コネクタの WITH パラメータ」をご参照ください。 -
-
MySQL カタログを作成します。
次のコードを Script エディターにコピーします。パラメータ値を変更し、スニペットを選択してから、コード行の左側にある Run をクリックします。右下で、作成したセッションクラスターが実行環境として選択されていることを確認してください。
CREATE CATALOG mysqlcatalog WITH( 'type' = 'mysql', 'hostname' = '<hostname>', 'port' = '<port>', 'username' = '<username>', 'password' = '${secret_values.mysql_pw}', 'default-database' = 'order_dw' );次のパラメータ値を、実際の MySQL サービス情報に合わせて変更してください。
パラメータ
説明
hostname
MySQL データベースの IP アドレスまたはホスト名。データベースの基本情報ページの [Network Type] エリアで Network Type をクリックすると、内部アドレスを取得できます。
port
MySQL データベースサービスのポート番号。デフォルト値は 3306 です。
username
MySQL データベースサービスのユーザー名。
password
MySQL データベースサービスのパスワード。
この例では、プレーンテキストでパスワードを保存するリスクを回避するため、パスワード値に
mysql_pwという名前の変数を使用しています。詳細については、「変数の管理」をご参照ください。
ステップ 2:リアルタイムデータウェアハウスの構築
ODS レイヤーの構築:リアルタイムデータインジェスト
ODS レイヤーは、カタログの CREATE DATABASE AS (CDAS) ステートメント を使用して、1 ステップで構築できます。ODS レイヤーは、通常、OLAP やキーバリューのポイントクエリに直接使用されるわけではありません。代わりに、ストリーミングジョブのイベントドライバーとして機能するため、Binlog を有効にするだけで十分です。Binlog は Hologres のコア機能であり、Hologres コネクタは、まず既存のすべてのデータを読み取り、次に Binlog を増分的に消費する、全量と増分を組み合わせたモードをサポートしています。
-
ODS という名前の CDAS 同期ジョブを作成します。
-
[Data Development] > [ETL] ページで、ODS という名前の新しい SQL ストリーミングジョブを作成し、次のコードを SQL エディターにコピーします。
CREATE DATABASE IF NOT EXISTS dw.order_dw -- カタログの作成時に table_property.binlog.level パラメーターが設定されたため、CDAS で作成されたすべてのテーブルで Binlog が有効になります。 AS DATABASE mysqlcatalog.order_dw INCLUDING all tables -- アップストリームデータベースから取り込むテーブルを選択できます。 /*+ OPTIONS('server-id'='8001-8004') */ ; -- mysql-cdc インスタンスの server-id 範囲を指定します。説明-
デフォルトでは、この例では
order_dwデータベースの Public Schema にデータを同期します。ターゲットの Hologres データベース内の指定されたスキーマにデータを同期することもできます。詳細については、「CDAS のターゲット側カタログとして使用」をご参照ください。スキーマを指定すると、カタログを使用するためのテーブル名の形式も変更されます。詳細については、「Hologres カタログの使用」をご参照ください。 -
ソーステーブルのスキーマ変更は、ソーステーブルで後続の DML 操作 (INSERT、UPDATE、または DELETE) が発生した後にのみ、結果テーブルに伝播されます。
-
-
右上隅にある Deploy をクリックしてジョブをデプロイします。
-
左側のメニューで、 をクリックします。デプロイしたばかりの ODS ジョブの行で、Actions 列の 起動 をクリックします。Start Without State を選択し、起動 をクリックします。
-
-
仮想ウェアハウスにデータをロードします。
テーブルグループは Hologres でデータを格納する単位です。
read_warehouse_1仮想ウェアハウスを使用してorder_dwデータベースのテーブルグループ (order_dw_tg_defaultなど。作成手順についてはTable Group Managementをご参照ください) からデータをクエリするには、read_warehouse_1にorder_dw_tg_defaultをロードする必要があります。これにより、init_warehouse仮想ウェアハウスを使用してデータを書き込み、read_warehouse_1仮想ウェアハウスを使用してサービスクエリを実行できます。[HoloWeb] 開発ページで SQL Editor をクリックし、インスタンス名とデータベース名を確認してから、次のコマンドを実行します。詳細については、「新しい仮想ウェアハウスインスタンスの作成」をご参照ください。ロード後、
read_warehouse_1がorder_dw_tg_defaultテーブルグループからデータをロードしたことがわかります。-- 現在のデータベースのテーブルグループを表示します。 SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name; -- テーブルグループを仮想ウェアハウスにロードします。 CALL hg_table_group_load_to_warehouse ('order_dw.order_dw_tg_default', 'read_warehouse_1', 1); -- 仮想ウェアハウスのテーブルグループのロードステータスを表示します。 select * from hologres.hg_warehouse_table_groups; -
右上隅で、仮想ウェアハウスを
read_warehouse_1に切り替えます。後続のクエリと分析では、read_warehouse_1仮想ウェアハウスが使用されます。右上隅の仮想ウェアハウスのドロップダウンリストには
read_warehouse_1が表示されます。エディターには、実行されたテーブルグループのロードステートメントCALL hg_table_group_load_to_warehouse ('order_dw.order_dw_tg_default', 'read_warehouse_1', 1);とクエリステートメントselect * from hologres.hg_warehouse_table_groups;が表示されます。 -
[SQL Editor] ページで、次のコマンドを実行して、MySQL から 3 つの Hologres テーブルに同期されたデータを表示します。
--- orders テーブルのデータをクエリします。 SELECT * FROM orders; --- orders_pay テーブルのデータをクエリします。 SELECT * FROM orders_pay; --- product_catalog テーブルのデータをクエリします。 SELECT * FROM product_catalog;3 番目のクエリを実行すると、[Result[3]] タブに
product_catalogテーブルの 5 行が表示されます。これには、[product_id] (値は 1 から 5) と [catalog_name] (値はphone_aaa、phone_bbb、phone_ccc、phone_ddd、phone_eee) の 2 つの列が含まれます。
DWD レイヤーの構築:リアルタイムワイドテーブルの作成
DWD レイヤーの構築では、Hologres コネクタ独自の部分列更新機能を利用します。INSERT DML ステートメントを使用して、部分列更新のセマンティクスを表現できます。このプロセスは、Hologres の行ストレージとハイブリッド行列表ストレージによって提供される、ディメンションテーブルに対する高性能なポイントクエリに依存しています。同時に、Hologres の強力なリソース分離アーキテクチャにより、書き込み、読み取り、分析の各ジョブが互いに干渉しないことが保証されます。
-
Flink のカタログ機能を使用して、DWD レイヤーのワイドテーブル
dwd_ordersを Hologres に作成します。ページの Script タブで、次のコードをスクリプトエディターにコピーし、スニペットを選択して、コード行の左側にある Run をクリックします。
-- 異なるストリームが同じ結果テーブルに書き込む場合、どの列も NULL 値を持つ可能性があるため、ワイドテーブルのフィールドは NULL 許容でなければなりません。 CREATE TABLE dw.order_dw.dwd_orders ( order_id bigint not null, order_user_id string, order_shop_id bigint, order_product_id bigint, order_product_catalog_name string, order_fee numeric(20,2), 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 ); -- カタログを使用して Hologres 物理テーブルのプロパティを変更できます。 ALTER TABLE dw.order_dw.dwd_orders SET ( 'table_property.binlog.ttl' = '604800' -- Binlog の有効期間を 1 週間に変更します。 ); -
ODS レイヤーのテーブル
ordersとorders_payの Binlog をリアルタイムで消費します。[Data Development] > [ETL] ページで、DWD という名前の SQL ストリーミングジョブを作成し、次のコードを SQL エディターにコピーしてから、ジョブを Deploy し 起動 します。この SQL ジョブは、
ordersテーブルをproduct_catalogディメンションテーブルと結合し、最終結果をdwd_ordersテーブルに書き込み、リアルタイムのデータエンリッチメントを実行します。BEGIN STATEMENT SET; INSERT INTO dw.order_dw.dwd_orders ( order_id, order_user_id, order_shop_id, order_product_id, order_fee, order_create_time, order_update_time, order_state, order_product_catalog_name ) SELECT o.*, dim.catalog_name FROM dw.order_dw.orders as o LEFT JOIN dw.order_dw.product_catalog FOR SYSTEM_TIME AS OF proctime() AS dim ON o.product_id = dim.product_id; INSERT INTO dw.order_dw.dwd_orders (pay_id, order_id, pay_platform, pay_create_time) SELECT * FROM dw.order_dw.orders_pay; END; -
dwd_ordersワイドテーブルのデータを表示します。[HoloWeb] 開発ページで、Hologres インスタンスに接続し、ターゲットデータベースにログオンします。次に、SQL エディターで次のコマンドを実行します。
SELECT * FROM dwd_orders;dwd_ordersワイドテーブルには、order_id、order_user_id、order_shop_id、order_product_id、order_product_catalog_name、order_fee、order_create_time、order_update_time、order_state、pay_id、pay_platform、pay_create_timeのフィールドが含まれます。クエリは 7 件の注文レコードを返します。
DWS レイヤーの構築:リアルタイムメトリックの計算
-
Flink のカタログ機能を使用して、DWS レイヤーの集計テーブル
dws_usersとdws_shopsを Hologres に作成します。ページの Script タブで、次のコードをスクリプトエディターにコピーし、スニペットを選択して、コード行の左側にある Run をクリックします。
-- ユーザーディメンションの集計メトリックテーブル。 CREATE TABLE dw.order_dw.dws_users ( user_id string not null, ds string not null, paied_buy_fee_sum numeric(20,2) not null comment '当日の支払い済み合計金額', primary key(user_id,ds) NOT ENFORCED ); -- ショップディメンションの集計メトリックテーブル。 CREATE TABLE dw.order_dw.dws_shops ( shop_id bigint not null, ds string not null, paied_buy_fee_sum numeric(20,2) not null comment '当日の支払い済み合計金額', primary key(shop_id,ds) NOT ENFORCED ); -
DWD ワイドテーブル
dw.order_dw.dwd_ordersからリアルタイムでデータを消費し、Flink で集計を実行し、最終結果を Hologres の DWS テーブルに書き込みます。[Data Development] > [ETL] ページで、DWS という名前の新しい SQL ストリーミングジョブを作成し、次のコードを SQL エディターにコピーしてから、ジョブを Deploy し 起動 します。
BEGIN STATEMENT SET; INSERT INTO dw.order_dw.dws_users SELECT order_user_id, DATE_FORMAT (pay_create_time, 'yyyyMMdd') as ds, SUM (order_fee) FROM dw.order_dw.dwd_orders c WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL -- 注文ストリームと支払いストリームの両方のデータがワイドテーブルに書き込まれています。 GROUP BY order_user_id, DATE_FORMAT (pay_create_time, 'yyyyMMdd'); INSERT INTO dw.order_dw.dws_shops SELECT order_shop_id, DATE_FORMAT (pay_create_time, 'yyyyMMdd') as ds, SUM (order_fee) FROM dw.order_dw.dwd_orders c WHERE pay_id IS NOT NULL AND order_fee IS NOT NULL -- 注文ストリームと支払いストリームの両方のデータがワイドテーブルに書き込まれています。 GROUP BY order_shop_id, DATE_FORMAT (pay_create_time, 'yyyyMMdd'); END; -
DWS レイヤーで集計結果を表示します。結果は、アップストリームのデータが変更されるとリアルタイムで更新されます。
-
Hologres コンソールで、変更前のデータを表示します。
dws_users
SELECT * FROM dws_users;クエリ結果には、[user_id] (例:
user_001、user_002、user_003)、[ds] (例:20230215)、[paied_buy_fee_sum] (例:8000.08、5000.05) の 3 つの列が含まれます。[user_id] 列はキーの関連付けフィールドです。dws_shops
SELECT * FROM dws_shops;クエリは 4 件のレコードを返し、[shop_id]、[ds]、[paied_buy_fee_sum] の 3 つの列が含まれます。サンプルデータでは、
shop_idは 12345 から 12348、すべてのdsの値は20230215、paied_buy_fee_sumの値はそれぞれ 5000.05、4000.04、7000.07、2000.02 です。 -
RDS コンソールで、
order_dwデータベースのordersテーブルとorders_payテーブルのそれぞれに新しいデータレコードを挿入します。INSERT INTO orders VALUES (100008, 'user_003', 12345, 5, 6000.02, '2023-02-15 09:40:56', '2023-02-15 18:42:56', 1); INSERT INTO orders_pay VALUES (2008, 100008, 1, '2023-02-15 19:40:56'); -
Hologres コンソールで、変更後のデータを表示します。
dwd_orders
SELECT * FROM dwd_orders;実行結果には、
dwd_ordersテーブルに合計 8 件の注文レコード (order_id100001–100008) が表示されます。フィールドにはorder_user_id、order_shop_id、order_product_id、order_product_catalog_name、order_fee、order_create_time、order_update_timeが含まれます。新しく挿入されたorder_id=100008のレコードのorder_feeは 6000.02 です。dws_users
SELECT * FROM dws_users;クエリは
dws_usersテーブルから 3 件のレコードを返します。列はuser_id、ds、paied_buy_fee_sumです。データは user_001 / 20230215 / 8000.08、user_002 / 20230215 / 5000.05、user_003 / 20230215 / 11000.07 です。user_003の集計額は 11000.07 で最も高くなっています。dws_shops
SELECT * FROM dws_shops;クエリは 4 行を返し、[shop_id]、[ds]、[paied_buy_fee_sum] の 3 つの列が含まれます。
shop_idの値は 12345、12346、12347、12348、すべてのdsの値は20230215、paied_buy_fee_sumの値はそれぞれ 11000.07、4000.04、7000.07、2000.02 です。
-
データプロファイリング
Binlog が有効になっているため、データの変更を直接確認できます。このソリューションは各レイヤーでデータを永続化するため、アドホックなデータプロファイリングと最終結果の検証が簡素化されます。
ストリームモードプロファイリング
Print コネクタを使用して、他の結果テーブルに出力されるメッセージが期待どおりであるかを確認できます。
-
ストリームプロファイリングジョブを作成して開始します。
[Data Development] > [ETL] ページで、Data-exploration という名前の SQL ストリーミングジョブを作成し、次のコードを SQL エディターにコピーして、ジョブを Deploy し 起動 します。
-- ストリームモードプロファイリングでは、print を使用してデータの変更を確認できます。 CREATE TEMPORARY TABLE print_sink( order_id bigint not null, order_user_id string, order_shop_id bigint, order_product_id bigint, order_product_catalog_name string, order_fee numeric(20,2), order_create_time timestamp, order_update_time timestamp, order_state int, pay_id bigint, pay_platform int, pay_create_time timestamp, PRIMARY KEY(order_id) NOT ENFORCED ) WITH ( 'connector' = 'print' ); INSERT INTO print_sink SELECT * FROM dw.order_dw.dwd_orders /*+ OPTIONS('startTime'='2023-02-15 12:00:00') */ -- ここで、startTime は binlog の生成時刻です。 WHERE order_user_id = 'user_001'; -
データプロファイリングの結果を表示します。
詳細ページで、ターゲットジョブの名前をクリックします。[Logs] タブで、左側の Operational Logs タブをクリックします。次に、[Running Task Managers] タブをクリックし、[Path, ID] をクリックします。[Stdout] ページで、
user_001に関連するログ情報を検索します。NWoJuf*****]. secret: [CrxBZYHuTD*****], token: [CAISjgRxxx] end new OSSLogClient endTimeInMs:[1744628993550], costInMxxx [1744628993551], costInMs:[10 ms][OSSLogAppender:main] doSend cost time(ms):[59], current log queue size:[1], total received/discarded:[401/0],exceptionReceived/exceptionDiscarded:[0/0], total send:[400] [OSSLogAppender:main] doSend cost time(ms):[57], current log queue size:[2], total received/discarded:[502/0], exceptionReceived/exceptionDiscarded:[0/0], total send:[500] +I[100001, user_001, 12345, 1, phone_aaa, 5000.05, 2023-02-15T16:40:56, 2023-02-15T18:42:56, 1, null, null, null] -U[100001, user_001, 12345, 1, phone_aaa, 5000.05, 2023-02-15T16:40:56, 2023-02-15T18:42:56, 1, null, null, null] +U[100001, user_001, 12345, 1, phone_aaa, 5000.05, 2023-02-15T16:40:56, 2023-02-15T18:42:56, 1, 2001, 1, 2023-02-15T17:40:56] +U[100004, user_001, 12347, 4, phone_ddd, 2000.02, 2023-02-15T13:40:56, 2023-02-15T18:42:56, 1, 2004, 0, 2023-02-15T17:40:56] +U[100006, user_001, 12348, 1, phone_aaa, 1000.01, 2023-02-15T11:40:56, 2023-02-15T18:42:56, 1, 2006, 0, 2023-02-15T18:40:56]
バッチモードプロファイリング
バッチモードプロファイリングは、結果テーブルにデータを書き込みません。代わりに、データの現在の状態を取得し、デバッグを通じて結果を直接表示できます。
[Data Development] > [ETL] ページで SQL ストリームジョブを作成し、次のコードを SQL エディターにコピーして、[Debug] をクリックします。詳細については、「ジョブのデバッグ」をご参照ください。
Flink ジョブ開発インターフェイスのデバッグ結果を以下に示します。
SELECT *
FROM dw.order_dw.dwd_orders /*+ OPTIONS('binlog'='false') */
WHERE order_user_id = 'user_001' and order_create_time > '2023-02-15 12:00:00'; -- バッチモードは、フィルタープッシュダウンをサポートしており、バッチ ジョブの実行効率を向上させます。
デバッグ後、Flink ジョブ開発インターフェイスは、フィルター条件に一致する 2 件の注文レコードを返します。order_id の値は 100004 と 100001 で、どちらも order_user_id が user_001 です。それらの order_fee の値は 2000.02 と 5000.05 で、order_create_time の値は 2023-02-15 12:00:00 より後です。
ステップ3:リアルタイムデータウェアハウスの使用
ステップ2では、Flink カタログを使用して、Flink と Hologres に基づく階層化されたストリーミングウェアハウスを構築する方法を説明しました。このセクションでは、データウェアハウスのセットアップ後のいくつかの簡単なユースケースを紹介します。
ポイントクエリ
プライマリキーに基づいて DWS レイヤーの集計されたメトリックテーブルにクエリを実行し、毎秒数百万リクエスト (RPS) をサポートします。
以下は、HoloWeb 開発ページで、特定の日付における特定のユーザーの消費額をクエリするためのコード例です。
-- Hologres SQL
SELECT * FROM dws_users WHERE user_id ='user_001' AND ds = '20230215';
クエリ結果では、消費額フィールド (paied_buy_fee_sum) の値は 24000.20 です。
OLAP 分析
DWD レイヤーのワイドテーブルで OLAP 分析を実行します。
以下は、HoloWeb 開発ページで、2023 年 2 月に特定の支払いプラットフォームで特定の顧客の注文詳細をクエリするためのコード例です。
-- Hologres SQL
SELECT * FROM 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 LIMIT 100;
クエリを実行すると、結果テーブルにフィルター条件に一致する注文詳細レコードが表示され、order_id、order_user_id、order_shop_id、order_product_id、order_product_catalog_name、order_fee、order_create_time、order_update_time などのフィールドが含まれます。
リアルタイムレポート
DWD レイヤーのワイドテーブルのデータに基づいてリアルタイムレポートを表示します。Hologres のハイブリッド行列表ストレージと列指向テーブルは、優れた OLAP 分析機能を提供し、秒単位のレスポンスをサポートします。
以下は、HoloWeb 開発ページで、2023 年 2 月の各カテゴリの注文の総数と総額をクエリするためのコード例です。
-- Hologres SQL
SELECT
TO_CHAR(order_create_time, 'YYYYMMDD') AS order_create_date,
order_product_catalog_name,
COUNT(*),
SUM(order_fee)
FROM
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;
SQL を実行すると、[Results] タブのテーブルに、order_create_date、order_product_catalog_name、count、sum の 4 列のデータが表示されます。日付 20230215 の結果例では、phone_aaa から phone_eee までの 5 つの製品カテゴリについて、注文数 (2、1、1、2、2) と合計金額 (6000.06、4000.04、3000.03、4000.04、7000.03) が示されています。
関連ドキュメント
-
関連するユースケース:
-
Hologres Binlog 機能の詳細については、「Hologres Binlog のサブスクライブ」をご参照ください。
-
Flink は、単一のジョブで複数の INSERT INTO 文を記述できます。構文の詳細については、「INSERT 文」をご参照ください。
-
Realtime Compute for Apache Flink では、豊富なコネクタを利用できます。詳細については、「サポートされているコネクタ」をご参照ください。