【问题标题】:Azure CosmosDB how to query against a physical partitionAzure CosmosDB 如何查询物理分区
【发布时间】:2018-08-10 16:24:44
【问题描述】:

我正在尝试执行一个非常大的查询,需要返回数百万条记录,因此我想对查询进行分区并使用多台机器来处理结果。

我的逻辑分区键将是文档的 UUID,因此这对我为每个工作节点分配不同的部分没有太大帮助。我可以获取物理分区 ID 并仅在特定物理分区内执行查询吗?

这是我尝试过的:

FeedOptions feedOptions = new FeedOptions();
feedOptions.setEnableCrossPartitionQuery(false);
feedOptions.setPartitionKeyRangeIdInternal("0");

client.queryDocuments(collectionPath, "SELECT * FROM e where e.docType
= 'address'", feedOptions).flatMapIterable(FeedResponse::getResults);

但是更改 partitionKeyRangeId 似乎根本不会改变结果。

请指教。

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    据我所知,到目前为止,它还不能在特定的物理分区中执行。我在Cosmos DB Rest Api 中找不到任何与物理分区相关的参数。您在代码中提到的PartitionKeyRangeId 用于change feed 请求。

    根据official doc中的说法,我们无法在cosmos db中管理物理分区:

    Azure Cosmos DB 将自动缩放物理数量 根据您的工作量进行分区。所以你不应该把你的 数据库设计基于物理分区的数量而不是你 应确保选择正确的分区键来确定 逻辑分区。

    但是,由于 cosmos db 灵活、可用且开明,如果您对物理分区有此类要求,可以提交feedback 寻求进一步的帮助。

    希望对你有帮助。


    更新答案:

    有很多方法可以提高处理大量数据的性能,我在这里只是提供一些个人建议。

    1.您可以尝试考虑选择比UUID 更合适的分区键,以大大提高性能。

    2.尝试使用page size限制每个查询的项目数,然后通过多线程实现查询和处理并行。

    3.增加 RUs 设置以提升性能。

    更多想法,请参考这个doc

    【讨论】:

    • 感谢您的回答。有没有办法实现并行批处理?假设查询将返回大量文档,并且对于每个文档,我都有繁重的工作量来处理它们。如何使流程并行化并使其更快?
    • @zhouchong90 请看我的更新答案。如果您认为我的答案对您有用,可以标记我的答案。谢谢!
    • 您好,感谢您的回答。但是,我不认为你解决了我的问题。为了有效利用 cosmosDB,我想使用主键作为分区键,这样达到 10G 数据就不会成为问题。我想实现节点集群的并行性。 CosmosDB 本身将具有高性能,但我将开发的应用程序需要时间,因为它需要调用一堆 3rd 方 API 来处理每个文档。
    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多