pymongo.errors.BulkWriteError:发生批量操作错误(MongoDB 3.4.2,pymongo 3.4.0,python 2.7.13)

问题描述 投票:0回答:4

我正在使用 pymongo 将数亿条格式为

{'id_str': , 'created_at': , 'text': }
的推文从文本文件迁移到 MongoDB。为每个用户创建一个集合来存储他/她的推文。我使用的插入方法是
insert_many()
。经常会遇到
BulkWriteError

Traceback (most recent call last):
  File "pipeline.py", line 105, in <module>
    timeline_db, meta_db, negative_db, log_col, dir_path)
  File "/media/haitao/Storage/twitter_pipeline/migrate_old.py", line 134, in migrate_dir
    timeline_db[user_id].insert_many(utility.temporal_sort(statuses))
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/collection.py", line 711, in insert_many
    blk.execute(self.write_concern.document)
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/bulk.py", line 493, in execute
    return self.execute_command(sock_info, generator, write_concern)
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/bulk.py", line 331, in execute_command
    raise BulkWriteError(full_result)
pymongo.errors.BulkWriteError: batch op errors occurred

当存在重复的键时,似乎会发生此错误,但此处不应出现这种情况。我还可以检查其他事项来解决此问题吗?

提前致谢!

python mongodb pymongo
4个回答
3
投票

抱歉耽搁了。

1)我复制了这个错误。下面就接近尾声了

mongod.log

I -        [ftdc] Assertion: 13538:couldn't open [/proc/5774/stat] errno:24 Too many open
files
W FTDC     [ftdc] Uncaught exception in 'Location13538: couldn't open [/proc/5774/stat] 
errno:24 Too many open files' in full-time diagnostic data capture subsystem. Shutting down 
the full-time diagnostic data capture subsystem.
E STORAGE  [conn2] WiredTiger (24) [1491020356:127332][5774:0x7f6f30e9d700], WT_SESSION
.create: /var/lib/mongodb/: directory-sync: open: Too many open files
I COMMAND  [conn2] command timeline_db.231731006 command: insert { insert: "231731006", 
ordered: true, documents: 1000 } ninserted:0 keyUpdates:0 writeConflicts:0 exception: 24: 
Too many open files code:8 numYields:0 reslen:123 locks:{ Global: { acquireCount: { r: 2, 
w: 2 } }, Database: { acquireCount: { w: 1, W: 1 } }, Collection: { acquireCount: { w: 1, 
W: 1 } } } protocol:op_query 511ms```

2) 是的,仅传递

MongoClient()
的一个实例。

3) 未运行多重处理。

在发布最初的问题后,我开始使用

insert_one()
,它明确引发了打开文件限制错误。我改变了数据库的设计(主要是减少了集合数量)并解决了打开文件限制的问题。我不确定,但日志似乎表明
BulkWriteError
的实际原因也是打开文件限制。


2
投票

对我来说,错误是由于第二次在 _id 中进行复制而发生的。

因此,如果我使用说 items 在 Mongo 中添加,pymongo 会自动插入 object_id 又名 _id ,然后如果 items 是全局的,它将具有上一个操作中的 _id ,这会导致冗余并最终批量写入错误。

清除缓存解决了它。


1
投票

你可以用这样的方式调试错误详细信息吗:

try: 
    # pymongo process here
    pass
except BulkWriteError as error:
    print(error.details)

您是否还可以使用

pdb
在终端上调试来改进上面的代码:

try: 
    # pymongo process here
    pass
except BulkWriteError as error:
    import pdb; pdb.set_trace()

然后打印

error.details
或您想要的任何内容:

(Pdb) error.details

0
投票

这里的解决方案:https://github.com/microsoft/vscode-cosmosdb/issues/1296对我有用

我遇到了同样的问题,我通过在连接字符串中设置“retrywrites = false”来解决它,如下所示:

mongodb://<username>:<password>@<host>:<port>/<db_name>?ssl=true&replicaSet=globaldb&retrywrites=false 
© www.soinside.com 2019 - 2024. All rights reserved.