连续的物化视图

本文档简要介绍了持续具体化视图及其常见使用情形。在阅读本页内容之前,您应先熟悉 Bigtable 概览

在 Bigtable 中,持续的物化视图是持续运行的 SQL 查询的完全托管的预计算结果,可增量更新持续的具体化视图。SQL 查询可以包含对底层 Bigtable 表的聚合和转换。使用持续具体化视图可以提高性能和效率。

连续的具体化视图中的数据包括以下内容:

  • 从源表中的数据派生的汇总值或转换值
  • 定义分组键的未汇总值

借助连续的物化视图,您可以在注入数据时预先聚合数据。此外,持续具体化视图架构与其源表不同,它以一种针对具有不同查找模式的查询(而非源表上使用的查询)优化的结构呈现源表数据。

以下是 Bigtable 中连续具体化视图的主要特征:

  • 零维护:连续的具体化视图会在后台预计算。对源表的数据更改(包括更新和删除)会自动在后台传播到持续具体化视图,无需用户执行任何操作。
  • SQL 开发模式:持续的物化视图基于 GoogleSQL(用于 Bigtable 查询),包括 SQL 函数、过滤条件和聚合。
  • 与垃圾回收同步:持续具体化视图会与其源表的垃圾回收政策保持同步,并在表数据过期或被删除时自动更新。
  • 读写延迟时间不受影响:当实例的集群得到充分配置或使用自动扩缩时,持续具体化视图对源表的性能影响极小。
  • 最终一致:持续的物化视图在后台计算。对连续的具体化视图的更新可能会延迟,但连续的物化结果始终保持一致。

您用于定义持续具体化视图的行键、列限定符和列值会被视为服务数据。因此,请勿使用包含敏感信息的行键、列限定符或列值来创建连续具体化视图。如需了解服务数据的处理方式,请参阅Google Cloud 隐私权声明

您可以使用 Google Cloud CLI、 Google Cloud 控制台中的 Bigtable Studio 查询编辑器,或者适用于 Java 和 Go 的 Bigtable 客户端库来创建持续具体化视图。

您可以使用以下方法从持续具体化视图中读取数据:

如需了解详情,请参阅从持续具体化视图中读取数据

何时使用连续的物化视图

借助持续的物化视图,您可以使用 SQL 定义 Bigtable 数据的新表示形式。创建后,持续具体化视图会不断自动将源表中的数据重构为 SQL 查询定义的格式。然后,您可以查询持续具体化视图,而不是查询表并在读取数据后转换或汇总数据。

对于以下使用情形,连续的物化视图可以提高查询性能:

  • 数据预聚合:您可以使用持续具体化视图来聚合跨行的传入数据。这样,您就可以快速检索汇总和聚合的数据,例如信息中心的指标。
  • 自动实现 lambda 和 kappa 架构:如果您的应用需要混合使用实时流式流水线数据和包含历史数据的批处理流水线数据,请使用持续具体化视图。这些视图可提供所有数据源的视图,并会随着时间的推移而更新,以反映基础数据的变化,而无需使用其他流处理工具或自定义 ETL 作业。
  • 次要访问模式:连续的物化视图会创建数据的替代表示形式。与针对源表的查询相比,此表示形式可以针对具有不同查找模式的查询进行优化。如需详细了解这些模式,请参阅创建异步二级索引

如需将连续的物化视图与其他类型的 Bigtable 视图进行比较,请参阅表和视图

何时使用计数器

预先聚合数据的另一种方法是使用汇总单元格创建分布式计数器

写入到汇总单元格的内容可立即从写入到的集群中读取。在写入数据后,系统会处理持续具体化视图,最终使其与源表保持一致。

对于以下情况,请使用计数器而不是连续的物化视图:

  • 不需要过滤条件且不需要跨行的聚合
  • 如果您需要立即从写入集群中读取写入内容

如果您想执行以下操作,请使用持续的物化视图:

  • 为针对汇总的查询生成不同的密钥
  • 查看基表中的更改如何反映在您的汇总中
  • 自动合并多行数据

对于以下用例,请结合使用计数器和持续具体化视图:

  • 在汇总单元格中捕获最新指标,但保留这些指标的历史汇总
  • 在持续的具体化视图中合并指标

资源预配和性能

连续的物化视图的持续处理以低优先级的后台作业形式进行。因此,只要集群大小合适,该功能对应用性能以及源表的读取和写入延迟时间的影响微乎其微。

为确保持续具体化视图中的数据保持最新状态,建议为包含持续具体化视图的实例中的集群启用自动扩缩功能。自动扩缩功能会自动添加足够的节点来处理处理开销,并在不再需要这些节点时将其移除。这有助于确保在执行持续运行的 SQL 查询期间有足够的计算容量。自动扩缩功能还可以确保您有足够的节点来满足持续具体化视图的存储需求。

连续的物化视图会计入每个实例 1,000 个表的限制

存储

对于每个连续的具体化视图,Bigtable 会存储以下信息:

  • 持续的具体化视图中的数据
  • 中间存储

与任何 Bigtable 表一样,持续具体化视图存在于包含它的实例中的所有集群上。实例中的集群必须有足够的节点来存储源表以及基于该表的任何持续具体化视图。借助自动扩缩功能,集群可以根据存储需求的变化来扩容或缩容。

即使连续具体化视图的存储空间与源表不同,也必须在与源表相同的实例中创建连续具体化视图。

连续的具体化视图存储

持续的具体化视图包含基于该具体化视图的 SQL 查询所产生的数据。这意味着它包含 SQL 查询中由聚合子句定义的聚合值,以及定义分组键的非聚合值。

中间存储

为了支持将持续具体化视图与其源表同步,Bigtable 使用中间存储空间来存储需要用于以增量方式更新持续具体化视图的数据副本。

中间存储空间中的数据量大致相当于在源表中扫描的数据量,用于生成定义持续具体化视图的 SQL 查询的结果。例如,如果您的查询会汇总整个表中的数据,Bigtable 会在中间存储空间中保存相当于整个表的数据。基于特定行键范围或列查询的持续具体化视图仅将这些行或列保留在中间存储空间中。

中间存储空间在持续具体化视图的整个生命周期内保持不变,以便高效支持对视图的增量更新,并将源表中的删除操作传播到持续具体化视图。您无法读取中间存储空间中的数据。如需深入了解中间存储空间的用量,请参阅具体化视图

复制

在使用复制功能的实例中,持续具体化视图的复制方式与表的复制方式不同。相反,实例中的每个集群都会使用自己的源表副本独立处理持续具体化视图。这意味着,例如,写入集群 A 上源表的数据会复制到集群 B 上的表,然后复制到集群 B 上的持续具体化视图。

费用

使用持续具体化视图不会产生任何资源费用。不过,创建和同步连续的物化视图需要处理和存储,因此您需要按标准费率付费。创建持续具体化视图后,您会发现以下指标有所增加:

  • 存储 - 您需要为在持续具体化视图中存储数据以及为中间存储空间付费。如需了解详情,请参阅存储
  • 计算 - 源表和持续具体化视图的持续同步需要 CPU 处理,您的集群可能需要更多节点来处理额外的后台工作。

与此同时,您可能会发现源表上的一些处理操作减少了,例如,当您不再对数据进行范围扫描以执行重复计算和其他效率较低的查询时。您可能也不再需要运行流水线作业(例如 Dataflow 或 Spark)来汇总源数据并将其写回 Bigtable。

如需详细了解价格,请参阅 Bigtable 价格。如需查看可帮助您监控持续具体化视图使用情况的指标,请参阅指标

指标

持续的具体化视图会向 Cloud Logging 报告多个关键指标,您可以使用这些指标来监控持续的物化视图。

指标 说明
materialized_view/max_delay 连续的具体化视图的处理延迟时间上限
materialized_view/storage 用于持续具体化视图存储空间的数据量(以字节为单位)
materialized_view/intermediate_storage 持续具体化视图的中间处理所使用的数据量(以字节为单位)
table/materialized_view_intermediate_storage 基于此表定义的持续具体化视图的中间处理所使用的数据量
materialized_view/user_errors 来自用户数据的持续具体化视图的错误数量。 用户错误会导致数据无法传播到视图。
materialized_view/system_errors 系统针对连续具体化视图的错误数

您还可以使用许多 Bigtable 表指标来监控持续具体化视图,只需使用持续具体化视图 ID 代替表 ID 即可。具体来说,持续物化视图包含在 CPU 指标的细分中,有助于您了解它们的影响。当您使用 Data API 的 ReadRows 方法读取持续具体化视图时,系统会生成每秒请求数、延迟时间和吞吐量方面的 Bigtable 指标。如需了解详情,请参阅指标

如需开始使用 Cloud Logging,请参阅查询和查看日志概览

限制

  • 每个表只能创建一个持续具体化视图。
  • 创建未指定 _key 的视图时,源表中选定的列不得为 NULL。如需了解详情,请参阅GROUP BY 子句定义的行键
  • 您无法修改定义持续具体化视图的 SQL 查询。您必须删除持续具体化视图,然后创建一个包含更改的新视图。
  • 您无法基于另一个连续的具体化视图或逻辑视图创建连续的具体化视图。
  • 您无法为持续具体化视图配置垃圾回收政策。所有数据保留都受源表的垃圾回收政策的约束,源的垃圾回收会自动反映在持续具体化视图中。

后续步骤