【问题标题】:How to maximize DB upload rate with azure cosmos db如何使用 azure cosmos db 最大化数据库上传速率
【发布时间】:2019-01-31 14:52:45
【问题描述】:

这是我的问题。我正在尝试将一个大型 csv 文件上传到 cosmos db (~14gb),但我发现很难最大化我支付的吞吐量。在 azure 门户指标概述 UI 上,当我支付 16600 RU/s 时,它说我使用 73 RU/s。现在,我正在使用 pymongo 的批量写入功能上传到数据库,但我发现任何大于 5 的 bulk_write 长度都会抛出硬 Request rate is large. 异常。我做错了吗?在这种情况下有没有更有效的上传数据的方法? Internet 带宽可能不是问题,因为我正在从 azure vm 上传到 cosmos db。

我现在如何在 python 中上传的结构:

for row in csv.reader:
    row[id_index_1] = convert_id_to_useful_id(row[id_index_1])

    find_criteria = {
        # find query
    }

    upsert_dict = {
        # row data
    }
    operations.append(pymongo.UpdateOne(find_criteria, upsert_dict, upsert=True))

    if len(operations) > 5:

        results = collection.bulk_write(operations)

        operations = []

任何建议将不胜感激。

【问题讨论】:

    标签: python-2.7 azure azure-cosmosdb pymongo-3.x azure-cosmosdb-mongoapi


    【解决方案1】:

    我使用过 ComsodDB 迁移工具,无需进行太多配置即可将数据发送到 CosmosDB。根据我的假设,即使我们也可以发送 14Gb 的 CSV 文件。

    以下是我们传输的数据

    [10000 条记录转移 |吞吐量 4000 | 500 并行请求 | 25 秒]。 [10000 条记录转移 |吞吐量 4000 | 100 并行请求 | 90 秒]。 [10000 条记录转移 |吞吐量 350 |并行请求 10 | 300 秒]。

    【讨论】:

    • 我不确定这是否是 OP 想要的。也许这更像是一种评论。
    • 是的,我同意,我没有正确回答这个问题,但是,它从评论中得到了一些理解。 @Jay
    【解决方案2】:

    我能够提高上传速度。我注意到每个物理分区都有一个吞吐量限制(由于某种原因,物理分区的数量乘以每个分区的吞吐量仍然不是集合的总吞吐量)所以我所做的是按每个分区拆分数据然后创建每个分区键的单独上传过程。这将我的上传速度提高了(物理分区数)倍。

    【讨论】:

      【解决方案3】:

      亚伦。是的,正如您在评论中所说,Azure Cosmos DB MongoDB API 支持迁移工具。您可以在official doc 中找到打击声明。

      数据迁移工具当前不支持 Azure Cosmos DB MongoDB API 既可以作为源也可以作为目标。如果你想迁移 Azure Cosmos DB 中 MongoDB API 集合内外的数据, 请参阅 Azure Cosmos DB:如何为 MongoDB API 迁移数据 指示。您仍然可以使用数据迁移工具导出数据 从 MongoDB 到 Azure Cosmos DB SQL API 集合,用于 SQL API。

      我只是为您提供了一种解决方法,您可以使用Azure Data Factory。请参考此doc 将 cosmos db 设置为接收器。参考此doc 将 Azure Blob 存储中的 csv 文件设置为源。在管道中,您可以配置批处理大小。

      当然,您可以通过编程方式执行此操作。您没有错过任何内容,错误Request rate is large 仅表示您已超出预配的 RU 配额。您可以提高 RUs 设置的值。请参考这个doc

      如有任何疑问,请随时告诉我。

      【讨论】:

      • 嘿,感谢您的回答!这非常有用,因为我在 azure 存储中上传的文件是作为文件而不是 blob 存储的。我有一个关于天蓝色吞吐量分布的问题。似乎我的请求率很大,因为我正在尝试写入一个分区并达到分区最大值。但是,每个分区(我有 14 个)的吞吐量为 100,其中 14*100 远小于 16600。你知道这个吞吐量是如何分布在整个分区中的,以及如何增加每个分区的 RU/s 吗?
      • @AaronArima 对不起,我不明白你说的每个分区(我有14个)的吞吐量是100。据我所知,吞吐量设置不会按分区划分。跨度>
      • "每个分区的最大吞吐量 (t) 的值由 Azure Cosmos DB 配置,该值是根据预配的总吞吐量和使用的硬件配置分配的。" -- docs.microsoft.com/en-us/azure/cosmos-db/partition-data
      【解决方案4】:

      我会看看Cosmos DB: Data Migration Tool。我没有将它与 MongoDB API 一起使用,但它是受支持的。我已经使用它成功地将大量文档从我的本地计算机移动到 Azure,并且它将利用可用的 RU/s。

      如果您需要以编程方式执行此操作,我建议您查看 DB Migration Tool 的底层源代码。这是开源的。您可以找到代码here

      【讨论】:

      • 它说它不支持 mongo api:数据迁移工具当前不支持将 Azure Cosmos DB MongoDB API 作为源或目标。如果要在 Azure Cosmos DB 中将数据迁移入或迁移出 MongoDB API 集合,请参阅 Azure Cosmos DB:如何迁移 MongoDB API 的数据以获取说明。您仍然可以使用数据迁移工具将数据从 MongoDB 导出到 Azure Cosmos DB SQL API 集合,以便与 SQL API 一起使用。
      • 但是谢谢,我认为这让我朝着正确的方向前进!
      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 2019-12-30
      • 2021-12-16
      • 2018-02-25
      • 2021-07-08
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多