元数据缓存

本文档介绍如何使用元数据缓存来提高对象表和某些 BigLake 表类型的查询性能。

对象表和某些类型的 BigLake 表可以缓存外部数据存储区(例如 Cloud Storage)中文件的相关元数据信息。以下类型的 BigLake 表支持元数据缓存:

  • Amazon S3 BigLake 表
  • Cloud Storage BigLake 表
元数据包括文件中的文件名、分区信息和物理元数据(例如行数)。您可以选择是否为表启用元数据缓存。包含大量文件和使用 Hive 分区过滤条件的查询从元数据缓存中获益最多。

如果您未启用元数据缓存,则针对表的查询必须读取外部数据源来获取对象元数据。读取这些数据会增加查询延迟时间;列出外部数据源中的数百万个文件可能需要几分钟时间。如果启用了元数据缓存,查询可以避免列出外部数据源中的文件,并且可以更快地对文件进行分区和删减。

您可以在创建 BigLake 或对象表时启用元数据缓存。如需详细了解如何创建对象表,请参阅创建 Cloud Storage 对象表。如需详细了解如何创建 BigLake 表,请参阅以下主题之一:

元数据缓存设置

有两个属性可以控制此功能:

  • 最大过时指定查询何时使用缓存的元数据。
  • 元数据缓存模式指定元数据的收集方式。

启用元数据缓存后,您需要指定对表执行的操作可以接受的元数据过时的最大间隔时间。例如,当指定间隔时间为 1 小时的时候,如果缓存的元数据在过去 1 小时内刷新,针对表的操作会使用缓存的元数据。如果缓存的元数据早于该值,操作会回退到从数据存储区(Amazon S3 或 Cloud Storage)检索元数据。您可以指定从 30 分钟到 7 天的过时间隔时间。

您可以选择自动或手动刷新缓存:

  • 对于自动刷新,缓存会按系统定义的间隔时间刷新,间隔时间通常为 30 到 60 分钟。如果数据存储区中的文件添加、删除或修改的间隔时间是随机的,则自动刷新缓存是一种很好的方法。如果您需要控制刷新的时间(例如在提取-转换-加载作业结束时触发刷新),请使用手动刷新。
  • 对于手动刷新,您需要运行 BQ.REFRESH_EXTERNAL_METADATA_CACHE 系统过程,以按符合要求的时间表刷新元数据缓存。 对于 BigLake 表,您可以通过提供表数据目录的子目录来有选择地刷新元数据。这样可以避免不必要的元数据处理。 如果数据存储区中的文件添加、删除或修改的间隔时间是已知的(例如作为流水线的输出),则手动刷新缓存是一种很好的方法。

    如果您发出多个并发手动刷新,则只有一个刷新会成功。

如果元数据缓存在 7 天内没有刷新,则会失效。

手动和自动缓存刷新都会以 INTERACTIVE 查询优先级执行。

如果您选择使用自动刷新,我们建议您创建预留,然后为运行元数据缓存刷新作业的项目创建具有 BACKGROUND 作业类型的分配。这样可以防止刷新作业与用户查询资源争用资源,如果没有足够可用资源,这些作业可能会失败。

在设置过时间隔时间和元数据缓存模式值之前,您应该考虑它们的交互方式。请参考以下示例:

  • 如果您要手动刷新表的元数据缓存并将过时间隔时间设置为 2 天,那么如果希望针对该表的操作使用缓存的元数据,您必须每 2 天(或更短时间)运行一次 BQ.REFRESH_EXTERNAL_METADATA_CACHE 系统过程。
  • 如果您要自动刷新表的元数据缓存并将过时间隔时间设置为 30 分钟,那么如果缓存刷新的间隔时间较长(通常为 30 到 60 分钟),则针对该表的某些操作可能会从数据存储区读取。

获取有关元数据缓存刷新作业的信息

如需查找元数据刷新作业的相关信息,请查询 INFORMATION_SCHEMA.JOBS 视图,如以下示例所示:

SELECT *
FROM `region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT`
WHERE job_id LIKE '%metadata_cache_refresh%'
AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
ORDER BY start_time DESC
LIMIT 10;

将客户管理的加密密钥与缓存的元数据搭配使用

缓存的元数据受与缓存元数据关联的表的 CMEK(客户管理的加密密钥)保护。这可能是直接应用于表的 CMEK,也可能是表从数据集或项目继承的 CMEK。

如果为项目或数据集设置默认 CMEK,或者项目或数据集的现有 CMEK 发生更改,这不会影响现有表或其缓存的元数据。您必须更改表的键,以将新键同时应用于表及其缓存的元数据。

在 BigQuery 中创建的 CMEK 不适用于 BigLake 和对象表使用的 Cloud Storage 文件。如需获取端到端 CMEK 加密,请在 Cloud Storage 中配置 CMEK 以获取这些文件。

按查询作业获取有关元数据缓存用量的信息

如需获取有关查询作业的元数据缓存用量的信息,请调用该作业的 jobs.get 方法 并查看 Job 资源的 JobStatistics2 部分中的 MetadataCacheStatistics 字段。此字段提供有关查询使用了哪些启用元数据缓存的表、查询是否使用元数据缓存以及未使用时的原因的信息。

表统计信息

对于基于 Parquet 文件的 BigLake 表,系统会在刷新元数据缓存时收集表统计信息。表统计信息收集会在自动刷新和手动刷新期间进行,并且统计信息会保留与元数据缓存相同的时间段。

收集的表统计信息包括行数、物理和未压缩文件大小以及列基数等文件信息。在基于 Parquet 的 BigLake 表上运行查询时,系统会将这些统计信息提供给查询优化器,以实现更好的查询规划并可能提高某些类型的查询的查询性能。例如,常见的查询优化是动态约束传播,其中查询优化器会根据较小的维度表动态推断联接中较大的事实表的谓词。虽然此优化可以使用规范化表架构加快查询速度,但它需要准确的表统计信息。通过元数据缓存收集的表统计信息可以更好地优化 BigQuery 和 Apache Spark 中的查询计划。

限制

以下限制适用于元数据缓存:

  • 如果您发出多个并发手动刷新,则只有一个刷新会成功。
  • 如果元数据缓存在 7 天内没有刷新,则会失效。
  • 如果更新表的源 URI,元数据缓存不会自动刷新,并且后续查询会从过时的缓存中返回数据。为避免出现这种情况,请手动刷新元数据缓存。如果表的元数据缓存设置为自动刷新,则必须将表的刷新模式更改为手动,执行手动刷新,然后将表的刷新模式重新设置为自动。
  • 如果您手动刷新元数据缓存,并且您的目标数据集和 Cloud Storage 存储桶位于区域位置,则必须在运行 BQ.REFRESH_EXTERNAL_METADATA_CACHE 过程调用时显式指定此位置。您可以通过以下方式之一执行此操作:

    控制台

    1. 转到 BigQuery 页面。

      转到 BigQuery

    2. 在编辑器中选择一个标签页。

    3. 点击 更多,然后点击查询设置

    4. 高级选项部分中,取消选中自动位置选择复选框,然后指定目标区域。

    5. 点击保存

    6. 在该“编辑器”标签页中运行包含 BQ.REFRESH_EXTERNAL_METADATA_CACHE 过程调用的查询。

    bq

    如果您使用 bq query 运行包含 BQ.REFRESH_EXTERNAL_METADATA_CACHE 过程调用的查询,请务必指定 --location 标志

后续步骤