【问题标题】:CosmosDb - Insert a lot of dataCosmosDb - 插入大量数据
【发布时间】:2019-11-22 06:24:21
【问题描述】:

我开发了一个 azure webjob,用于在 MongoDb CosmosDb 数据库中插入大量数据。

以下是我的存储库中用于在 cosmosDb 数据库中插入数据的代码:

public async Task<bool> InsertZonierDataAsync(List<Zonier> zonierList)
{
    if (zonierList == null || !zonierList.Any())
    {
        throw new ZonierListNullOrEmptyException();
    }

    try
    {
        await _retryPolicy.ExecuteAsync(async () =>
        {
            await _collection.InsertManyAsync(zonierList);
        });
        return true;
    }
    catch (MongoBulkWriteException ex)
    {
        throw new DataBaseWritingException(ex.Message, ExceptionCodeConstants.DataBaseWritingExceptionCode);
    }
}

为了快速插入数据,我在作​​业运行期间将 RU/秒更新为 10K。 zonierList 中有大约 20 亿个原始数据需要插入。

不幸的是,通过网络作业插入数据需要很长时间(超过两个小时)。当我直接在 CosmosDb 中检查吞吐量时,它并没有在 10K 时被阻塞:

我做错了什么,为什么要花这么多时间?我可以通过配置更改某些内容还是应该更改插入数据的方式?

【问题讨论】:

标签: c# azure-cosmosdb azure-cosmosdb-mongoapi


【解决方案1】:

即使您为容器预配了 10k RU,Cosmos DB 也会在构成该容器的所有物理分区中平均分配该数量。如果您插入的所有文档都具有相同的分区键值,那么它们都将进入相同的逻辑分区并返回物理分区。这意味着,如果您的集合有 4 个物理分区,您将只使用您配置的 10k 中的 2.5k。数字加起来。

【讨论】:

  • 好的,谢谢你的解释,所以这就是我卡在2.5K的原因。我的 shardkey 设置为 _id,值由我公司的 DBA 给出并强制执行。所以我猜每个文件都直接插入到 4 个分区中的一个分区中。你对我的情况有什么建议?
  • 这很奇怪,因为 Mongo 中的 _id 应该是一个 ObjectId,它应该是随机的,所以我的理论在那种情况下不一定正确。这是假设 CosmosDB 没有在幕后做任何可能导致这种情况的花哨的事情。
  • 我插入了很多文件,而_id没有在json文件中发送。它是由 mongo 直接生成的。而且它不是完全随机的,因为它与时间戳有关。所以要解决我的问题,最简单的方法是在作业执行期间将我的 RU/sec 增加 4 倍?!我还有什么其他选择?我在BulkImport 上做了很多,但它需要大量的重构部分(我的 webapp 中只有 mongodb 连接字符串..)
  • 问题是,如果你只是想先导入一些东西然后按比例缩小你可能无法做到。由于您拥有如此多的文档,Cosmos 将使用您提供的所有 RU 来生成许多物理分区以适应数据。但是,如果您有一个高度预置的数字,您可能无法缩减到一个显着较低的数字,因为 Cosmos 可能创建了太多物理分区并且每个分区都有一个最小 RU 数。
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2013-01-30
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多