マテリアライズドビューによるデータレイククエリアクセラレーション
このトピックでは、StarRocks の非同期マテリアライズドビューを使用してデータレイクのクエリパフォーマンスを最適化する方法について説明します。
StarRocks は、データレイク内のデータの探索的クエリと分析に非常に効果的な、すぐに使えるデータレイククエリ機能を提供します。ほとんどのシナリオでは、Data Cache がブロックレベルのファイルキャッシングを提供し、リモートストレージのジッターや大量の I/O 操作によるパフォーマンス低下を回避できます。
しかし、データレイクからのデータを使用して複雑で効率的なレポートを作成したり、これらのクエリをさらに加速したりする場合、パフォーマンスの課題に直面することがあります。非同期マテリアライズドビューを使用することで、レポートやデータアプリケーションにおいて、より高い同時実行性と優れたクエリパフォーマンスを実現できます。
概要
StarRocks は、Hive catalog、Iceberg catalog、Hudi catalog、JDBC catalog、Paimon catalog などの external catalog に基づいて非同期マテリアライズドビューを構築することをサポートしています。external catalog ベースのマテリアライズドビューは、特に次のようなシナリオで有用です。
-
データレイクレポートの透明なアクセラレーション
データレイクレポートのクエリパフォーマンスを確保する ために、データエンジニアは通常、データアナリストと密接に連携して、レポートのアクセラレーションレイヤーの構築ロジックを調査する必要があります。アクセラレーションレイヤーにさらなる更新が必要な場合、構築ロジック、処理スケジュール、およびクエリステートメントを適宜更新する必要があります。
マテリアライズドビューのクエリの書き換え機能を通じて、レポートアクセラレーションはユーザーにとって透明で知覚されないものにすることができます。遅いクエリが特定された場合、データエンジニアは遅いクエリのパターンを分析し、必要に応じてマテリアライズドビューを作成できます。アプリケーション側のクエリは、マテリアライズドビューによってインテリジェントに書き換えられ、透明に加速されるため、ビジネスアプリケーションやクエリステートメントのロジックを変更することなく、クエリパフォーマンスを迅速に向上させることができます。
-
履歴データと関連するリアルタイムデータのインクリメンタル計算
ビジネスアプリケーションが StarRocks の内部テーブルにあるリアルタイムデータとデータレイクにある履歴データの関連付けを必要とする場合、マテリアライズドビューは簡単な解決策を提供できます。たとえば、リアルタイムのファクトテーブルが StarRocks の内部テーブルであり、ディメンジョンテーブルがデータレイクに保存されている場合、内部テーブルと外部データソースのテーブルを関連付けるマテリアライズドビューを構築することで、インクリメンタル計算を簡単に実行できます。
-
メトリックレイヤーの迅速な構築
高次元のデータを扱う際、メトリックの計算と処理に課題が生じる可能性があります。マテリアライズドビューを使用することで、データの事前集計とロールアップを実行し、比較的軽量なメトリックレイヤーを作成できます。さらに、マテリアライズドビューは自動的にリフレッシュされるため、メトリック計算の複雑さをさらに軽減できます。
マテリアライズドビュー、Data Cache、および StarRocks の内部テーブルは、クエリパフォーマンスを大幅に向上させる効果的な方法です。以下の表は、それらの主な違いを比較しています。
| Data Cache | Materialized view | Native table | |
|---|---|---|---|
| データロードと更新 | クエリが自動的にデータキャッシングをトリガーします。 | リフレッシュタスクが自動的にトリガーされます。 | さまざまなインポート方法をサポートしますが、インポートタスクの手動メンテナンスが必要です。 |
| データキャッシングの粒度 |
| 事前計算されたクエリ結果を保存します | テーブルスキーマに基づいてデータを保存します |
| クエリパフォーマンス | Data Cache ≤ Materialized view = Native table | ||
| クエリステートメント |
|
| 内部テーブルをクエリするためにクエリステートメントの変更が必要です |
レイクデータを直接クエリするか、データを内部テーブルにロードするのと比較して、マテリアライズドビューはいくつかのユニークな利点を提供します:
- ローカルストレージアクセラレーション: マテリアライズドビューは、StarRocks のローカルストレージによるアクセラレーションの利点を活用できます。たとえば、インデックス、パーティショニング、バケッティング、コロケートグループなどがあり、データレイクから直接データをクエリするよりも優れたクエリパフォーマンスを実現します。
- ロードタスクのゼロメンテナンス: マテリアライズドビューは、自動リフレッシュタスクを通じてデータを透明に更新します。スケジュールされたデータ更新を実行するためのロードタスクを維持する必要はありません。さらに、Hive、Iceberg、および Paimon catalog ベースのマテリアライズドビューは、データの変更を検出し、パーティションレベルでインクリメンタルリフレッシュを実行できます。
- インテリジェントなクエリの書き換え: クエリは、マテリアライズドビューを使用するように透明に書き換えられます。クエリステートメントを変更することなく、即座にアクセラレーションの恩恵を受けること ができます。
したがって、次のシナリオではマテリアライズドビューの使用をお勧めします:
- Data Cache が有効になっていても、クエリのレイテンシーや同時実行性に対する要件を満たしていない場合。
- クエリが再利用可能なコンポーネントを含む場合(例:固定された集計関数やジョインパターン)。
- データがパーティション化されており、クエリが比較的高レベルでの集計を含む場合(例:日ごとの集計)。
次のシナリオでは、Data Cache を使用したアクセラレーションを優先することをお勧めします:
- クエリに多くの再利用可能なコンポーネントがなく、データレイクから任意のデータをスキャンする可能性がある場合。
- リモートストレージに大きな変動や不安定性があり、アクセスに影響を与える可能性がある場合。
external catalog ベースのマテリアライズドビューを作成する
external catalog のテーブルにマテリアライズドビューを作成することは、StarRocks の内部テーブルにマテリアライズドビューを作成することと似ています。使用しているデータソースに応じて適切なリフレッシュ戦略を設定し、external catalog ベースのマテリアライズドビューに対してクエリの書き換えを手動で有効にするだけです。
外部テーブルのマテリアライズドビューは、ベーステーブルのデータ変更によってトリガーされる自動リフレッシュをサポートしていません。非同期の定期リフレッシュと手動リフレッシュのみをサポートします。
適切なリフレッシュ戦略を選択する
現在、StarRocks は Hudi catalog のパーティションレベルのデータ変更を検出することができません。そのため、タスクがトリガーされるとフルサイズのリフレッシュが実行されます。
Hive Catalog、Iceberg Catalog(v3.1.4 以降)、JDBC catalog(v3.1.4 以降、MySQL の範囲パーティションテーブルのみ)、および Paimon Catalog(v3.2.1 以降)では、StarRocks はパーティションレベルでのデータ変更を検出することをサポートしています。その結果、StarRocks は次のことができます:
-
データ変更があるパーティションのみをリフレッシュし、フルサイズのリフレッシュを回避して、リフレッシュによるリソース消費を削減します。
-
クエリの書き換え中にある程度のデータ整合性を確保します。データレイクのベーステーブルにデータ変更がある場合、クエリはマテリアライズドビューを使用するように書き換えられません。
マテリアライズドビューを作成する際にプロパティ mv_rewrite_staleness_second を設定することで、ある程度のデータ不整合を許容することができます。詳細については、CREATE MATERIALIZED VIEW を参照してください。
パーティションごとにリフレッシュする必要がある場合、マテリアライズドビューのパーティションキーはベーステーブルのそれに含まれている必要があります。
v3.2.3 以降、StarRocks は Iceberg テーブルに Partition Transforms を使用してパーティション化されたマテリアライズドビューを作成することをサポートしており、マテリアライズドビューは変換後の列でパーティション化されます。現在、identity、year、month、day、hour の変換を持つ Iceberg テーブルのみがサポートされています。
以下の例は、day パーティション変換を持つ Iceberg テーブルの定義を示し、その上に整列したパーティションを持つマテリアライズドビューを作成します:
-- Iceberg テーブルの定義。
CREATE TABLE spark_catalog.test.iceberg_sample_datetime_day (
id BIGINT,
data STRING,
category STRING,
ts TIMESTAMP)
USING iceberg
PARTITIONED BY (days(ts))
-- Iceberg テーブル上にマテリアライズドビューを作成。
CREATE MATERIALIZED VIEW `test_iceberg_datetime_day_mv` (`id`, `data`, `category`, `ts`)
PARTITION BY (`ts`)
DISTRIBUTED BY HASH(`id`)
REFRESH MANUAL
AS
SELECT
`iceberg_sample_datetime_day`.`id`,
`iceberg_sample_datetime_day`.`data`,
`iceberg_sample_datetime_day`.`category`,
`iceberg_sample_datetime_day`.`ts`
FROM `iceberg`.`test`.`iceberg_sample_datetime_day`;
Hive catalog に対しては、StarRocks がパーティションレベルでのデータ変更を検出できるようにするために、Hive メタデータキャッシュリフレッシュ機能を有効にすることができます。この機能が有効になると、StarRocks は定期的に Hive Metastore Service (HMS) または AWS Glue にアクセスして、最近クエリされたホットデータのメタデータ情報を確認します。
Hive メタデータキャッシュリフレッシュ機能を有効にするには、ADMIN SET FRONTEND CONFIG を使用して次の FE 動的構成項目を設定できます: