实体化视图 - AWS Lake Formation

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

实体化视图

在 AWS Glue 数据目录中,物化视图是一个托管表,它以 Apache Iceberg 格式存储预先计算的 SQL 查询结果。与每次访问时都执行查询的标准数据目录视图不同,物化视图会物理存储查询结果,并在基础源表更改时对其进行更新。你可以在亚马逊 Athena、亚马逊 EMR 或中使用 Apache Spark 3.5.6+ 版本创建物化视图。 AWS Glue

物化视图引用了在 AWS Glue 数据目录中注册的 Apache Iceberg 表,预先计算的数据以 Apache Iceberg 表的形式存储在 Amazon S3 表存储桶或 Amazon S3 通用存储桶中,因此可以从包括亚马逊雅典娜、Amazon Redshift 和第三方冰山兼容引擎在内的多个查询引擎进行访问。

将实例化视图与其他视图类型区分开来

物化视图在根本上不同于 AWS Glue 数据目录视图、Apache Spark 视图和 Amazon Athena 视图。虽然数据目录视图是虚拟表,每次访问时都会执行 SQL 查询定义,但物化视图则以物理方式存储预先计算的查询结果。这消除了冗余计算,并显著提高了经常访问的复杂转换的查询性能。

物化视图还不同于使用 AWS Glue ETL 或自定义 Spark 作业构建的传统数据转换管道。您可以使用标准 SQL 语法定义物化视图,而不是编写自定义代码来处理变更检测、增量更新和工作流程编排。 AWS Glue 数据目录使用完全托管的计算基础架构自动监控源表、检测更改并刷新实体化视图。

使用案例

以下是物化视图的重要用例:

  • 加速复杂的分析查询-创建预先计算昂贵的联接、聚合和窗口函数的物化视图。Spark 引擎会自动重写后续查询以使用预先计算的结果,从而减少查询延迟和计算成本。

  • 简化数据转换管道 — 将处理变更检测、增量更新和工作流程编排的复杂 ETL 作业替换为基于 SQL 的简单物化视图定义。 AWS Glue 数据目录自动管理所有操作的复杂性。

  • 通过@@ 受管控的数据访问实现自助式分析 — 创建精选的物化视图,将原始数据转换为业务就绪型数据集。允许用户在不暴露底层源表的情况下访问物化视图,从而简化安全管理,同时支持自助分析。

  • 优化机器学习的特征工程-定义实现机器学习模型特征转换的物化视图。自动刷新功能可确保功能存储在源数据演变时保持最新状态,而增量刷新可最大限度地降低计算成本。

  • 实现高效的数据共享-创建物化视图,筛选和转换特定使用者的数据。使用跨账户和区域共享实体化视图 AWS Lake Formation,无需重复数据,同时保持集中化治理。

重要概念

自动刷新

自动刷新是一种持续监视源表并根据您定义的计划更新实体化视图的功能。创建物化视图时,您可以使用基于时间的调度来指定刷新频率,间隔频率可达一小时。 AWS Glue 数据目录使用托管 Spark 计算基础架构在后台执行刷新操作,透明地处理变更检测和增量更新的各个方面。

当源数据在刷新间隔之间发生变化时,实例化视图会暂时失效。在下一次定时刷新完成之前,直接访问物化视图的查询可能会返回过时的结果。对于需要立即访问最新数据的场景,可以使用 REFRESH MATERIALIZED VIEW SQL 命令执行手动刷新。

增量刷新

增量刷新是一种优化技术,它仅处理自上次刷新以来源表中已更改的数据,而不是重新计算整个实例化视图。 AWS Glue 数据目录利用 Apache Iceberg 的元数据层来有效地跟踪源表中的变化,并确定物化视图的哪些部分需要更新。

与完全刷新操作相比,这种方法可以显著降低计算成本和刷新持续时间,特别是对于大型数据集,在刷新周期之间,只有一小部分数据会发生变化。增量刷新机制会自动运行;您无需编写自定义逻辑即可检测或处理更改的数据。

自动查询重写

自动查询重写是 Amazon Athena、Amazon EMR 和 Spark 引擎中提供的查询优化功能。 AWS Glue当您对基表执行查询时,Spark 优化器会分析您的查询计划并自动确定可用的物化视图能否更有效地满足查询。如果存在合适的实例化视图,则优化器会透明地重写查询,以使用预先计算的结果,而不是处理基表。

这种优化无需对应用程序代码或查询语句进行任何更改。Spark 优化器可确保自动查询重写仅在物化视图为最新视图并且可以生成准确结果时才适用。如果物化视图已过时或与查询要求不完全匹配,则优化程序会对基表执行原始查询计划,将正确性置于性能之上。

视图定义者角色

物化视图基于创建该视图的 IAM 角色(称为视图定义者角色)的权限进行操作。定义者角色必须对实例化视图定义中引用的所有基表具有读取权限,并且必须对目标数据库具有创建表权限。当 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 表类数据存储服务存储桶中,则还需要为角色添加以下权限。

{ "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 数据目录会跟踪依赖关系并自动通过物化视图层次结构传播更新。当基础物化视图刷新时,所有依赖该视图的下游物化视图都会相应更新。

此功能允许您将复杂的转换分解为逻辑阶段,从而提高可维护性,并允许根据数据新鲜度要求选择性刷新转换层。

存储和数据访问

物化视图将预先计算的结果存储为 Apache Iceberg 表存储在 S3 表存储桶中,或者将您的账户中的通用 S3 存储桶存储为通用的 S3 存储桶。 AWS AWS Glue 数据目录通过 S3 表的自动优化功能管理 Iceberg 表维护的各个方面,包括压缩和快照保留。

由于物化视图存储为 Iceberg 表,因此您可以直接从任何兼容 Iceberg 的引擎中读取它们,包括亚马逊 Athena、Amazon Redshift 和第三方分析平台。这种多引擎可访问性可确保预先计算的数据在整个分析生态系统中保持可访问性,而无需重复数据或格式转换。

与 AWS Lake Formation 权限集成

您可以使用 AWS Lake Formation 来管理物化视图的细粒度权限。视图创建者自动成为物化视图的所有者,并且可以使用的命名资源方法或 LF-Tag AWS Lake Formation s 向其他用户或角色授予权限。

当您授予用户对物化视图的SELECT权限时,他们无需访问基础源表即可查询预先计算的结果。此安全模型简化了数据访问管理,使您能够实施最小权限原则,仅向用户提供他们所需的特定数据转换的访问权限。

您可以使用跨 AWS 账户共享功能在账户、 AWS 组织和组织单位之间共享实体化视图。 AWS Lake Formation您还可以使用资源链接访问跨 AWS 区域的物化视图,从而通过分布式数据访问实现集中式数据治理。

监控和调试

AWS Glue 数据目录将所有实体化视图刷新操作和相关指标发布到 Amazon CloudWatch。您可以通过 CloudWatch 指标监控刷新开始时间、结束时间、持续时间、处理的数据量和刷新状态。刷新操作失败时,将在 CloudWatch 日志中捕获错误消息和诊断信息。

您可以设置 CloudWatch 警报,以便在刷新任务超过预期持续时间或重复失败时收到通知。 AWS Glue 数据目录还会将成功和失败的刷新运行的变更事件发布到,从而使您能够将实体化视图操作集成到更广泛的工作流程自动化中。

要检查实例化视图的当前状态,请使用 DESCRIBE MATERIALIZED VIEW SQL 命令,该命令会返回包括失效状态、上次刷新时间戳和刷新计划配置在内的元数据。

管理刷新作业

开始手动刷新

在计划间隔之外触发立即刷新。

必需权限:用于进行 API 调用的 AWS 凭据必须具有物化视图的glue:GetTable权限。

对于 S3 表目录:

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>
注意

<ACCOUNT_ID>:s3tablescatalog/<CATALOG_NAME>于 S3 表或<ACCOUNT_ID>根目录。

停止正在运行的刷新

取消正在进行的刷新作业:

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

监控和排查

有三种方法可以监视实体化视图刷新作业:

CloudWatch 指标

在以下位置查看所有实体化视图刷新作业的汇总指标: CloudWatch

可用指标:

  • AWS/Glue 带有维度的命名空间:

    • CatalogId: 您的目录标识符

    • DatabaseName: 包含物化视图的数据库

    • TableName: 物化视图名称

    • TaskType: 设置为 “MaterializedViewRefresh”

在控制台中查看:

  1. 导航到 CloudWatch 控制台 → 指标

  2. 选择 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>

UUID 在<task_run_id>哪里(例如 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

  • 错误消息(如果失败)

常见刷新状态:

  • 正在运行:刷新作业当前正在执行

  • 成功:刷新成功完成

  • 失败:刷新遇到错误

  • 已停止:刷新已手动取消

刷新失败疑难解答:

如果刷新失败,请检查:

  1. IAM 权限:确保定义者角色有权访问所有基表和实体化视图位置

  2. 基表可用性:验证所有引用的表都存在并且可以访问

  3. 查询有效性:确认 SQL 查询对 Spark SQL 方言有效

  4. 资源限制:检查您的账户是否已达到并发刷新上限

使用 GetMaterializedViewRefreshTaskRun API 检索详细的错误消息。

注意事项和限制

  • 物化视图只能引用在 AWS Glue 数据目录中注册的 Apache Iceberg 表作为基表。

  • 视图创建和自动查询重写仅适用于亚马逊 Athena、亚马逊 EMR 和(版本 5.1)的 Apache Spark 3.5.6 及更高版本的 Spark 引擎。 AWS Glue

  • 物化视图最终与基表保持一致。在刷新窗口期间,直接访问物化视图的查询可能会返回过期的数据。要立即访问当前数据,请执行手动刷新。

  • 最小自动刷新间隔为一小时。对于需要更频繁更新的用例,请使用命令以编程方式执行手动刷新。REFRESH MATERIALIZED VIEW

  • 查询重写优先考虑正确性而不是性能。如果物化视图过时或无法准确满足查询要求,则 Spark 引擎会对基表执行原始查询。