mongo批量插入问题(insert_many,bulk_write)

mongo批量插入问题

    • 1. 遇到问题
    • 2. 解决问题
      • 2.2 方法1:批量插入insert_many
      • 2.3 方法2:批量更新bulk_write(UpdateOne)
        • 2.3.1 bulk_write定义
    • 3. 性能测试
    • 4. 问题交流

1. 遇到问题

每天通过spark等数据库框架批量处理的结果数据最少500万条记录,每天需要导入到mongo数据库,最初通过update one的方法一条一条进行更新插入,耗时大约2小时,效率及其的慢,大大影响了线上数据的使用。如何单机提高写入mongo的效率?

2. 解决问题

2.2 方法1:批量插入insert_many


arr = []  # 初始化一个空列表
for line in mmap_lines(file_path):
    arr.append(DbPushPortraitObject(uid=uid, hash_key=hash_key, tag_ids=tag_ids, dt=dt))  # 每次往列表里插DbPushPortraitObject对象
    if num % 10000 == 0: # 每次批量插入的数量,10000条插入一次
        #print(arr)
        DbPushPortraitObject.collection.insert_many(arr)
        arr = []
        print("num:%d mid: %s" % (num, datetime.datetime.now()))
    else:
        continue
DbPushPortraitObject.collection.insert_many(arr)


2.3 方法2:批量更新bulk_write(UpdateOne)

实现代码:


arr = []  # 初始化一个空列表
for line in mmap_lines(file_path):
    one = UpdateOne({"uid": uid}, {"$set": {"hash_key": hash_key, "tag_list": tag_ids, "dt": dt}}, upsert=True) # 每次往列表里插UpdateOne对象
    arr.append(one)
    if num % 50000 == 0:  # 每次批量插入的数量,50000条插入一次 
        DbPushPortraitObject.collection.bulk_write(arr)   
        arr = []   
        print("num:%d mid: %s" % (num, datetime.datetime.now()))
    else:    
        continue
DbPushPortraitObject.collection.bulk_write(arr)

2.3.1 bulk_write定义

db.collection.bulkWrite()

提供可控执行顺序的批量写操作。
语法格式如下:

db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)
参数 类型 描述
operations array bulkWrite()写操作的数组。支持操作:insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne
writeConcern document 可选, write concern 文档,省略则使用默认的 write concern。
ordered boolean 可选,表示mongod实例有序还是无序执行操作。默认值true。

方法返回值:

  • 操作基于 write concern 运行则 acknowledged 值为true,如果禁用 write concern 运行则 acknowledged 值为false。
  • 每一个写操作数。
  • 成功 inserted 或 upserted文档的 _id 的组数。

3. 性能测试

批量更新现在采用的是每5万条进行一次批量更新,更新的效率:2.3255s/每万条
更新的效率还会跟索引数,表collection中原始数据的规模等有关。
在这里插入图片描述

4. 问题交流

mongo批量插入问题(insert_many,bulk_write)_第1张图片

你可能感兴趣的:(spark,python,大数据技术)