マテリアライズドビュー - AWS Lake Formation

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

マテリアライズドビュー

AWS Glue データカタログでは、マテリアライズドビューは、SQL クエリの事前計算された結果を Apache Iceberg 形式で保存するマネージドテーブルです。アクセスされるたびにクエリを実行する標準の Data Catalog ビューとは異なり、マテリアライズドビューはクエリ結果を物理的に保存し、基盤となるソーステーブルが変更されるたびに更新します。Amazon Athena、Amazon EMR、または で Apache Spark バージョン 3.5.6 以降を使用してマテリアライズドビューを作成できます AWS Glue。

マテリアライズドビューは、 AWS Glue Data Catalog に登録された Apache Iceberg テーブルを参照し、事前計算されたデータは Amazon S3 Tables バケットまたは Amazon S3 汎用バケットに Apache Iceberg テーブルとして保存されるため、Amazon Athena、Amazon Redshift、サードパーティーの Iceberg 互換エンジンなどの複数のクエリエンジンからアクセスできます。

マテリアライズドビューを他のビュータイプと区別する

マテリアライズドビューは、 AWS Glue Data Catalog ビュー、Apache Spark ビュー、Amazon Athena ビューと根本的に異なります。データカタログビューは、アクセスされるたびに SQL クエリ定義を実行する仮想テーブルですが、マテリアライズドビューは事前に計算されたクエリ結果を物理的に保存します。これにより、冗長な計算が不要になり、頻繁にアクセスされる複雑な変換のクエリパフォーマンスが大幅に向上します。

マテリアライズドビューは、ETL ジョブまたはカスタム Spark AWS Glue ジョブで構築された従来のデータ変換パイプラインとも異なります。変更検出、増分更新、ワークフローオーケストレーションを処理するカスタムコードを記述する代わりに、標準の SQL 構文を使用してマテリアライズドビューを定義します。Data Catalog AWS Glue は、フルマネージド型のコンピューティングインフラストラクチャを使用して、ソーステーブルを自動的にモニタリングし、変更を検出し、マテリアライズドビューを更新します。

ユースケース

マテリアライズドビューの重要なユースケースは次のとおりです。

  • 複雑な分析クエリの高速化 – 高価な結合、集計、ウィンドウ関数を事前に計算するマテリアライズドビューを作成します。Spark エンジンは、事前計算された結果を使用するように後続のクエリを自動的に書き換え、クエリのレイテンシーとコンピューティングコストを削減します。

  • データ変換パイプラインの簡素化 – 変更検出、増分更新、ワークフローオーケストレーションを処理する複雑な ETL ジョブを、シンプルな SQL ベースのマテリアライズドビュー定義に置き換えます。 AWS Glue Data Catalog は、すべての運用上の複雑さを自動的に管理します。

  • 管理されたデータアクセスでセルフサービス分析を有効にする – 未加工データをビジネス対応データセットに変換する厳選されたマテリアライズドビューを作成します。基盤となるソーステーブルを公開することなくマテリアライズドビューへのアクセスをユーザーに付与し、セルフサービス分析を強化しながらセキュリティ管理を簡素化します。

  • 機械学習の特徴量エンジニアリングを最適化する – ML モデルの特徴量変換を実装するマテリアライズドビューを定義します。自動更新機能により、ソースデータの進化に合わせて機能ストアを最新の状態に保ち、増分更新によりコンピューティングコストを最小限に抑えます。

  • 効率的なデータ共有の実装 – 特定のコンシューマーのデータをフィルタリングおよび変換するマテリアライズドビューを作成します。を使用してアカウントとリージョン間でマテリアライズドビューを共有するため AWS Lake Formation、一元化されたガバナンスを維持しながら、データの重複を排除できます。

主要なコンセプト

自動更新

自動更新は、ソーステーブルを継続的にモニタリングし、定義したスケジュールに従ってマテリアライズドビューを更新する機能です。マテリアライズドビューを作成するときは、1 時間間隔の時間ベースのスケジューリングを使用して更新頻度を指定できます。 AWS Glue Data Catalog は、マネージド Spark コンピューティングインフラストラクチャを使用してバックグラウンドで更新オペレーションを実行し、変更検出と増分更新のすべての側面を透過的に処理します。

更新間隔の間にソースデータが変更されると、マテリアライズドビューは一時的に古くなります。マテリアライズドビューに直接アクセスするクエリは、次のスケジュールされた更新が完了するまで、古い結果が返されることがあります。最新のデータへの即時アクセスが必要なシナリオでは、REFRESH MATERIALIZED VIEWSQL コマンドを使用して手動更新を実行できます。

増分更新

増分更新は、マテリアライズドビュー全体を再計算するのではなく、前回の更新以降にソーステーブルで変更されたデータのみを処理する最適化手法です。 AWS Glue Data Catalog は、Apache Iceberg のメタデータレイヤーを活用して、ソーステーブルの変更を効率的に追跡し、マテリアライズドビューのどの部分に更新が必要かを判断します。

このアプローチは、フル更新オペレーションと比較して、コンピューティングコストと更新期間を大幅に削減します。特に、更新サイクル間でデータ変更の割合がごくわずかである大規模なデータセットの場合です。増分更新メカニズムは自動的に動作します。変更されたデータを検出または処理するためにカスタムロジックを記述する必要はありません。

自動クエリ書き換え

自動クエリ書き換えは、Amazon Athena、Amazon EMR、および の Spark エンジンで使用できるクエリ最適化機能です AWS Glue。ベーステーブルに対してクエリを実行すると、Spark オプティマイザはクエリプランを分析し、使用可能なマテリアライズドビューがクエリをより効率的に満たすことができるかどうかを自動的に判断します。適切なマテリアライズドビューが存在する場合、オプティマイザはベーステーブルを処理する代わりに、事前に計算された結果を使用するようにクエリを透過的に書き換えます。

この最適化は、アプリケーションコードやクエリステートメントを変更することなく行われます。Spark オプティマイザは、自動クエリ書き換えがマテリアライズドビューが最新で、正確な結果を生成できる場合にのみ適用されるようにします。マテリアライズドビューが古くなったり、クエリ要件に完全に一致しない場合、オプティマイザはベーステーブルに対して元のクエリプランを実行し、パフォーマンスよりも正確性を優先します。

ビュー定義ロール

マテリアライズドビューは、ビュー定義ロールと呼ばれる、マテリアライズドビューを作成した IAM ロールのアクセス許可に基づいて動作します。定義者ロールには、マテリアライズドビュー定義で参照されるすべてのベーステーブルへの読み取りアクセスと、ターゲットデータベースへのテーブルアクセス許可の作成が必要です。Data Catalog AWS Glue がマテリアライズドビューを更新すると、ソーステーブルにアクセスして更新された結果を書き込むための定義ロールを引き受けます。

このセキュリティモデルを使用すると、基になるソーステーブルに対する直接アクセス許可を付与することなく、マテリアライズドビューへのアクセス権をユーザーに付与できます。ビュー定義ロールがベーステーブルにアクセスできなくなった場合、アクセス許可が復元されるまで後続の更新オペレーションは失敗します。

マテリアライズドビューのアクセス許可

マテリアライズドビューを作成および管理するには、 AWS Lake Formation アクセス許可を設定する必要があります。マテリアライズドビューを作成する IAM ロール (定義ロール) には、ソーステーブルとターゲットデータベースに対する特定のアクセス許可が必要です。

定義者ロールに必要なアクセス許可

定義者ロールには、次の Lake Formation アクセス許可が必要です。

  • ソーステーブル – 行、列、またはセルフィルターが適用されていない SELECT または ALL アクセス許可

  • ターゲットデータベース – CREATE_TABLE アクセス許可

  • AWS Glue データカタログ – GetTable および CreateTable API アクセス許可

マテリアライズドビューを作成すると、定義ロールの ARN がビュー定義に保存されます。 AWS Glue データカタログは、自動更新オペレーションを実行するときにこのロールを引き受けます。定義者ロールがソーステーブルへのアクセスを失った場合、アクセス許可が復元されるまで更新オペレーションは失敗します。

AWS Glue ジョブの IAM アクセス許可

AWS Glue ジョブの IAM ロールには、次のアクセス許可が必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetCatalog", "glue:GetCatalogs", "glue:GetTable", "glue:GetTables", "glue:CreateTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetDatabase", "glue:GetDatabases", "cloudwatch:PutMetricData" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:*:/aws-glue/*" ] }, { "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": "*" } ] }

マテリアライズドビューの自動更新に使用するロールには、ロールに対する iam:PassRole アクセス許可が必要です。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/materialized-view-role-name" ] } ] }

Glue でマテリアライズドビューを自動的に更新するには、サービスがロールを引き受けることができる次の信頼ポリシーもロールに必要です。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/materialized-view-role-name" ] } ] }

マテリアライズドビューが S3 Tables バケットに保存されている場合は、ロールに次のアクセス許可も追加する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3tables:PutTableMaintenanceConfiguration" ], "Resource": "arn:aws:s3tables:*:123456789012:*" } ] }

マテリアライズドビューへのアクセスを付与する

マテリアライズドビューをクエリするアクセス権を他のユーザーに付与するには、 AWS Lake Formation を使用してマテリアライズドビューテーブルに対する SELECT アクセス許可を付与します。ユーザーは、マテリアライズドビューをクエリできます。基盤となるソーステーブルに直接アクセスする必要はありません。

Lake Formation アクセス許可の設定の詳細については、「 AWS Lake Formation デベロッパーガイド」の「データカタログリソースに対するアクセス許可の付与と取り消し」を参照してください。

マテリアライズドビューの作成と管理

Spark エンジンの CREATE MATERIALIZED VIEW SQL ステートメントを使用してマテリアライズドビューを作成します。ビュー定義は、変換ロジック、ターゲットデータベースとテーブル名、およびオプションの更新設定を定義する SQL クエリを指定します。集計、複数のテーブル間の結合、フィルター、ウィンドウ関数など、複雑な変換を定義できます。

CREATE MATERIALIZED VIEW sales_summary AS SELECT region, product_category, SUM(sales_amount) as total_sales, COUNT(DISTINCT customer_id) as unique_customers FROM sales_transactions WHERE transaction_date >= current_date - interval '90' day GROUP BY region, product_category;

自動更新を設定するには、ビュー定義に更新スケジュールを含めます。

CREATE MATERIALIZED VIEW sales_summary SCHEDULE REFRESH EVERY 1 HOUR AS SELECT region, product_category, SUM(sales_amount) as total_sales FROM sales_transactions GROUP BY region, product_category;

マテリアライズドビューは、 REFRESH MATERIALIZED VIEW コマンドを使用していつでも手動で更新できます。

REFRESH MATERIALIZED VIEW sales_summary;

既存のマテリアライズドビューの更新スケジュールを変更するには、 ALTER MATERIALIZED VIEWステートメントを使用します。

ALTER MATERIALIZED VIEW sales_summary ADD SCHEDULE REFRESH EVERY 2 HOURS;

ネストされたマテリアライズドビュー

他のマテリアライズドビューをベーステーブルとして参照するマテリアライズドビューを作成し、複数ステージのデータ変換を有効にすることができます。ネストされたマテリアライズドビューを作成すると、 AWS Glue Data Catalog は依存関係を追跡し、マテリアライズドビュー階層を通じて更新を自動的に伝達します。ベースマテリアライズドビューが更新されると、それに依存するすべてのダウンストリームマテリアライズドビューがそれに応じて更新されます。

この機能を使用すると、複雑な変換を論理ステージに分解し、保守性を向上させ、データの鮮度要件に基づいて変換レイヤーを選択的に更新できます。

ストレージとデータアクセス

マテリアライズドビューは、事前計算された結果を Apache Iceberg テーブルとして S3 Tables バケットまたは AWS アカウント内の汎用 S3 バケットに保存します。 AWS Glue Data Catalog は、S3 Tables の自動最適化機能を通じて、圧縮やスナップショットの保持など、Iceberg テーブルのメンテナンスのあらゆる側面を管理します。

マテリアライズドビューは Iceberg テーブルとして保存されるため、Amazon Athena、Amazon Redshift、サードパーティーの分析プラットフォームなど、Iceberg 互換エンジンから直接読み取ることができます。このマルチエンジンアクセシビリティにより、事前計算されたデータは、データ重複や形式変換なしで分析エコシステム全体でアクセス可能になります。

アクセス許可と AWS Lake Formation の統合

を使用して AWS Lake Formation 、マテリアライズドビューに対するきめ細かなアクセス許可を管理できます。ビュー作成者は自動的にマテリアライズドビューの所有者になり、 AWS Lake Formationの名前付きリソースメソッドまたは LF タグを使用して他のユーザーまたはロールにアクセス許可を付与できます。

マテリアライズドビューに対するSELECTアクセス許可をユーザーに付与すると、ユーザーは基盤となるソーステーブルにアクセスすることなく、事前に計算された結果をクエリできます。このセキュリティモデルは、データアクセス管理を簡素化し、最小特権の原則を実装して、ユーザーが必要とする特定のデータ変換にのみアクセスできるようにします。

AWS Lake Formationのクロスアカウント共有機能を使用して、 AWS アカウント、 AWS 組織、組織単位間でマテリアライズドビューを共有できます。リソースリンクを使用して AWS リージョン間でマテリアライズドビューにアクセスすることもできます。これにより、分散データアクセスによる一元化されたデータガバナンスが可能になります。

モニタリングとデバッグ

AWS Glue Data Catalog は、すべてのマテリアライズドビューの更新オペレーションと関連するメトリクスを Amazon CloudWatch に発行します。CloudWatch メトリクスを使用して、更新の開始時刻、終了時刻、期間、処理されたデータボリューム、更新ステータスをモニタリングできます。更新オペレーションが失敗すると、エラーメッセージと診断情報が CloudWatch Logs にキャプチャされます。

更新ジョブが予想期間を超えたとき、または繰り返し失敗したときに通知を受信するように CloudWatch アラームを設定できます。 AWS Glue データカタログは、更新実行の成功と失敗の両方について変更イベントを に発行するため、マテリアライズドビューオペレーションをより広範なワークフローオートメーションに統合できます。

マテリアライズドビューの現在のステータスを確認するには、DESCRIBE MATERIALIZED VIEWSQL コマンドを使用します。このコマンドは、古いステータス、最終更新タイムスタンプ、更新スケジュール設定などのメタデータを返します。

更新ジョブの管理

手動更新の開始

スケジュールされた間隔外に即時更新をトリガーします。

必要なアクセス許可: API コールを行うために使用される AWS 認証情報には、マテリアライズドビューに対するglue:GetTableアクセス許可が必要です。

S3 Tables Catalog の場合:

aws glue start-materialized-view-refresh-task-run \ --catalog-id <ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME> \ --database-name <DATABASE_NAME> \ --table-name <MV_TABLE_NAME>

ルートカタログの場合:

aws glue start-materialized-view-refresh-task-run \ --catalog-id <ACCOUNT_ID> \ --database-name <DATABASE_NAME> \ --table-name <MV_TABLE_NAME>

更新ステータスの確認

特定の更新ジョブのステータスを取得します。

aws glue get-materialized-view-refresh-task-run \ --catalog-id <CATALOG_ID> \ --materialized-view-refresh-task-run-id <TASK_RUN_ID>

更新履歴の一覧表示

マテリアライズドビューのすべての更新ジョブを表示します。

aws glue list-materialized-view-refresh-task-runs \ --catalog-id <CATALOG_ID> \ --database-name <DATABASE_NAME> \ --table-name <MV_TABLE_NAME>
注記

S3 テーブル<ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME>の場合は 、ルートカタログ<ACCOUNT_ID>の場合は を使用します。

実行中の更新の停止

進行中の更新ジョブをキャンセルします。

aws glue stop-materialized-view-refresh-task-run \ --catalog-id <CATALOG_ID> \ --database-name <DATABASE_NAME> \ --table-name <MV_TABLE_NAME>

モニタリングとトラブルシューティング

マテリアライズドビューの更新ジョブをモニタリングするには、次の 3 つの方法があります。

CloudWatch メトリクス

CloudWatch のすべてのマテリアライズドビュー更新ジョブの集計メトリクスを表示します。

使用可能なメトリクス:

  • AWSディメンションを含む /Glue 名前空間:

    • CatalogId: カタログ識別子

    • DatabaseName: マテリアライズドビューを含むデータベース

    • TableName: マテリアライズドビュー名

    • TaskType: をMaterializedViewRefresh」に設定する

コンソールでの表示:

  1. CloudWatch コンソール → メトリクスに移動する

  2. Select AWS/Glue 名前空間

  3. ディメンションでフィルタリング: CatalogId、DatabaseName、TableName、TaskType

  4. ジョブの成功、失敗、期間に関するメトリクスを表示する

CloudWatch メトリクスクエリの例:

{AWS/Glue,CatalogId,DatabaseName,TableName,TaskType} MaterializedViewRefresh

の使用 AWS CLI:

aws cloudwatch get-metric-statistics \ --namespace AWS/Glue \ --metric-name <MetricName> \ --dimensions Name=CatalogId,Value=<CATALOG_ID> \ Name=DatabaseName,Value=<DATABASE_NAME> \ Name=TableName,Value=<TABLE_NAME> \ Name=TaskType,Value=MaterializedViewRefresh \ --start-time <START_TIME> \ --end-time <END_TIME> \ --period 3600 \ --statistics Sum \ --region <REGION>

CloudWatch ログ

個々の更新タスク実行の詳細な実行ログを表示します。

ロググループ: /aws-glue/materialized-views/<task_run_id>

<task_run_id> は UUID (abc12345-def6-7890-ghij-klmnopqrstuv など) です。

ログの表示:

# List log streams for a task run aws logs describe-log-streams \ --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \ --region <REGION> # Get log events aws logs get-log-events \ --log-group-name /aws-glue/materialized-views/<TASK_RUN_ID> \ --log-stream-name <LOG_STREAM_NAME> \ --region <REGION>

CloudWatch コンソールの場合:

  1. CloudWatch → ロググループに移動する

  2. /aws-glue/materialized-views/ を検索する

  3. タスク実行 ID を持つロググループを選択する

  4. 詳細な実行ログ、エラー、Spark ジョブ出力を表示する

通知

更新ジョブの状態の変更に関するリアルタイム通知のイベントをサブスクライブします。

使用可能なイベントタイプ:

  • Glue マテリアライズドビューの更新タスクが開始されました

  • Glue マテリアライズドビューの更新タスクが正常に完了しました

  • Glue マテリアライズドビューの更新タスクに失敗しました

  • Glue マテリアライズドビューの自動更新呼び出しの失敗

ルールの作成:

aws events put-rule \ --name materialized-view-refresh-notifications \ --event-pattern '{ "source": ["aws.glue"], "detail-type": [ "Glue Materialized View Refresh Task Started", "Glue Materialized View Refresh Task Succeeded", "Glue Materialized View Refresh Task Failed", "Glue Materialized View Auto-Refresh Invocation Failure" ] }' \ --region <REGION>

ターゲットの追加 (SNS トピックなど)

aws events put-targets \ --rule materialized-view-refresh-notifications \ --targets "Id"="1","Arn"="arn:aws:sns:<REGION>:<ACCOUNT_ID>:<TOPIC_NAME>" \ --region <REGION>

更新ステータスの表示

AWS Glue API を使用してマテリアライズドビューの更新ジョブのステータスを確認します。

aws glue get-materialized-view-refresh-task-run \ --catalog-id <CATALOG_ID> \ --materialized-view-refresh-task-run-id <TASK_RUN_ID> \ --region <REGION>

または、最近のすべての更新実行を一覧表示します。

aws glue list-materialized-view-refresh-task-runs \ --catalog-id <CATALOG_ID> \ --database-name <DATABASE_NAME> \ --table-name <MV_TABLE_NAME> \ --region <REGION>

これは以下を示しています。

  • 最終更新時間

  • 更新ステータス (成功、失敗、実行中、停止)

  • タスク実行 ID

  • エラーメッセージ (失敗した場合)

一般的な更新状態:

  • RUNNING: 更新ジョブは現在実行中です

  • 成功: 更新が正常に完了しました

  • 失敗: 更新でエラーが発生しました

  • STOPPED: 更新が手動でキャンセルされました

更新失敗のトラブルシューティング:

更新に失敗した場合は、以下を確認してください。

  1. IAM アクセス許可: 定義ロールがすべてのベーステーブルとマテリアライズドビューの場所にアクセスできることを確認します。

  2. ベーステーブルの可用性: 参照されるすべてのテーブルが存在し、アクセス可能であることを確認する

  3. クエリの有効性: SQL クエリが Spark SQL ダイアレクトに対して有効であることを確認する

  4. リソース制限: アカウントの同時更新制限に達したかどうかを確認します。

GetMaterializedViewRefreshTaskRun API を使用して、詳細なエラーメッセージを取得します。

考慮事項と制限事項

  • マテリアライズドビューは、 AWS Glue データカタログに登録された Apache Iceberg テーブルをベーステーブルとしてのみ参照できます。

  • ビューの作成と自動クエリの書き換えは、Amazon Athena、Amazon EMR、および AWS Glue (バージョン 5.1) 全体で Apache Spark バージョン 3.5.6 以降の Spark エンジンでのみ使用できます。

  • マテリアライズドビューは、最終的にベーステーブルと一致します。更新ウィンドウ中に、マテリアライズドビューに直接アクセスするクエリが古いデータを返す場合があります。現在のデータにすぐにアクセスするには、手動更新を実行します。

  • 自動更新の最小間隔は 1 時間です。より頻繁な更新を必要とするユースケースでは、 REFRESH MATERIALIZED VIEW コマンドを使用してプログラムで手動更新を実行します。

  • クエリの書き換えでは、パフォーマンスよりも正確性が優先されます。マテリアライズドビューが古くなった場合、またはクエリ要件を正確に満たすことができない場合、Spark エンジンはベーステーブルに対して元のクエリを実行します。