你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Synapse Link for Azure Cosmos DB 的自定义分区

适用对象: NoSQL MongoDB Gremlin

通过自定义分区,你可以在分析查询中对通常用作筛选器的字段上的分析存储数据进行分区,从而提高查询性能。

本文介绍如何使用对分析工作负载至关重要的键对 Azure Cosmos DB 分析存储中的数据进行分区。 本文还介绍了如何利用通过分区修剪实现的改进的查询性能。 你还将了解当工作负载包含大量更新或删除操作时,自定义分区如何提高查询性能。

注意

Azure Cosmos DB 帐户和容器应已启用 Azure Synapse Link 才能使用自定义分区。

它是如何工作的?

分析存储分区独立于事务存储中的分区。 默认情况下,分析存储不分区。 如果经常需要基于字段(例如日期、时间、类别等)查询分析存储,可使用自定义分区来根据这些键创建单独的分区存储。 你可以从数据集中选择单个字段或字段组合作为分析存储分区键。

可以使用 Azure Synapse Link 触发 Azure Synapse Spark 笔记本中的分区。 你可以将其计划为作为后台作业运行,一天一次或两次,但如有需要,可以增加执行频率。

备注

分区存储指向与 Azure Synapse 工作区链接的 ADLS Gen2 主存储帐户。

Architecture of partitioned store in Azure Synapse Link for Azure Cosmos DB

在运行分区作业的最后一个时间戳之前,分区存储始终包含 Azure Cosmos DB 分析数据。 使用分区键筛选器查询分析数据时,Synapse Link 会自动将已分区的存储数据与分析存储中的最新数据合并。 这样即可获得最新的查询结果。 尽管它是在查询前合并数据,但不会将增量写回到分区存储。 随着分析存储中的数据和分区存储中的数据之间的增量增大,对分区数据的查询时间可能会有所不同。 更频繁地触发分区作业将减少此增量。 每次执行分区作业时,只处理分析存储中的增量更改,不会处理所有数据集。

何时使用?

在 Azure Cosmos DB 中查询分析数据时,可选择使用分区存储。 可结合使用 Synapse Link 和现有分析存储直接查询相同数据。 如果你有以下要求,建议你启用分区存储:

  • 可用作分区列的常见分析查询筛选器
  • 低基数分区列
  • 分区列跨分区均匀分布数据
  • 大量更新或删除操作
  • 数据引入速度缓慢

如果使用不同于分区键的查询筛选器来查询实时数据,建议直接查询分析存储。

好处

减少了从分区修剪中扫描的数据

由于对应每个唯一分区键的数据存储在分区存储中,因此,当你使用分区键作为查询筛选器时,查询执行将会修剪基础数据并只扫描所需数据。 通过扫描限制的数据,分区修剪可提高分析查询性能。

对分析数据进行的分区的灵活性

对于给定的分析存储容器,可以有多个分区策略。 可以根据查询要求使用组合或单独的分区键。

查询性能改进

除了分区修剪可提高查询性能外,自定义分区也可提高以下工作负载的查询性能:

  • 更新/删除密集型工作负载 - 分区存储不再跟踪分析存储中的多个版本的记录,也不会在每次执行查询期间加载这些记录,而只包含最新版本的数据。 当具有需要大量更新/删除操作的工作负载时,此功能可显著提高查询性能。

  • 数据引入速度缓慢的工作负载 - 分区会压缩分析数据,因此,如果工作负载的数据引入速度缓慢,此压缩可能会提高查询性能

事务性保证

务必要注意的是,自定义分区可确保事务性保证的完整性。 在执行分区操作的过程中不会阻止查询路径。 每次查询执行都从上次成功的分区操作中读取分区数据。 它会读取分析存储中的最新数据,从而确保查询在使用分区存储时始终返回可用的最新数据。

安全性

如果为分析存储配置了托管的专用终结点,建议也为分区存储添加托管的专用终结点。 分区存储是与 Synapse 工作区关联的主存储帐户。

同样,如果你在分析存储上配置了客户管理的密钥,则必须直接在 Synapse 工作区主存储帐户(即分区存储)上启用它。

分区策略

你可以为分析数据使用一个或多个分区键。 如果使用多个分区键,下面是有关如何对数据进行分区的一些建议:

  • 使用组合键:

    例如,你希望经常基于 Key1 和 Key2 进行查询。

    例如,“查询 ReadDate =‘2021-10-08’且 Location =‘Sydney’的所有记录”。

    在这种情况下,若要查找匹配 ReadDate 的所有记录以及与该 ReadDate 中的位置相匹配的记录,使用组合键更加高效。

    配置选项示例:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    现在可根据“Location”筛选器进行查询:

    • 你可能需要直接查询分析存储。 分区存储先按 ReadDate 扫描所有记录,然后再按 Location 进行扫描。 因此,你可以通过直接查询分析存储来获得更好的结果,具体取决于分析数据的工作负荷和基数。
    • 还可以运行另一个分区作业,以基于同一分区存储上的“Location”进行分区。
  • 分别使用多个键:

    例如,你想要经常基于“ReadDate”进行查询,但有时又想要基于“Location”进行查询。

    例如,

    • Query for all records where ReadDate = ‘2021-10-08’
    • Query for all records where Location = ‘Sydney’

    在此方案中运行以下定义的分区键的两个分区作业:

    作业 1:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    作业 2:

    .option("spark.cosmos.asns.partition.keys", "Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    请注意,在上述分区中,现在经常同时根据“ReadDate”和“Location”筛选器来进行查询并不高效。 在这种情况下,组合键可提高查询性能。

限制

  • 自定义分区仅适用于 Azure Synapse Spark。 无服务器 SQL 池目前不支持自定义分区。

  • 当前分区存储区只能指向与 Synapse 工作区关联的主存储帐户。 此时不支持选择自定义存储帐户。

  • 自定义分区只适用于 Azure Cosmos DB 中的 API for NoSQL。 目前,适用于 MongoDB、Gremlin 和 Cassandra 的 API 处于预览状态。

定价

使用自定义分区时,除了 Azure Synapse Link 定价,还会产生以下费用:

  • 在分析存储上运行分区作业时,需要为使用 Synapse Apache Spark 池付费

  • 分区数据存储在与 Azure Synapse Analytics 工作区关联的主 Azure Data Lake Storage Gen2 帐户中。 这将产生与使用 ADLS Gen2 存储和事务相关的成本。 这些成本分别由分区分析数据和 Synapse 中为分析查询处理的数据所需的存储决定。 有关定价的详细信息,请访问 Azure Data Lake Storage 定价页面

常见问题解答

应多久运行一次自定义分区作业?

自定义分区作业运行频率的决定因素有多个,例如增量数据量、查询延迟要求等。 可一天运行一次,也可每几小时运行一次。 如果传入的数据量较多且预期的查询延迟较低,建议更频繁地计划分区作业。 还必须先在分析存储中累积增量数据,才能使分区修剪生效。

在执行分区作业的过程中,查询结果是否包括最新数据?

是,自定义分区提供完整的事务性保证。 因此,查询结果会在任何时间点组合现有分区数据与返回最新分析存储数据集的尾部数据。

自定义分区能否在 Azure Synapse Analytics 上使用链接服务身份验证?

能,链接服务身份验证可用于分析存储分区。

能否在以后的某个时间点更改给定容器的分区键?

能,可以更改给定容器的分区键,且新的分区键定义将创建新的分区存储。

注意

分区键定义是分区存储路径的一部分。

不同分区键能否指向同一 BasePath?

可以,你可以在相同分区存储上指定多个分区键,如下所示:

.option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
.option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \

后续步骤

若要了解更多信息,请参阅下列文档: