mongoimport 在导入 JSON 文件时卡在同一点
mongoimport stuck at same point while importing a JSON file
OS: ubuntu 14.04 LTS
Mongo version: rs0:PRIMARY> db.version()
3.0.7
Storage engine: wiredTiger.
通过此命令导入 JSON 文件(13GB,每行 1 JSON 文档):
$ mongoimport --db InfDB --collection SFTest --file InfMapRed.json
此命令过去在 2.6 中与之前的存储引擎一起运行良好,但现在不会超过 0.2%。该程序一遍又一遍地打印下面的行。该集合通过 .count() 显示 1000 条记录。
2015-10-24T06:11:41.799+0000 connected to: localhost
2015-10-24T06:11:44.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:47.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:50.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:53.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:56.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:59.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:02.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:05.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:08.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:11.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:14.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:17.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:20.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:23.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
....
写了一个简单的 python 脚本来读取文件并按行插入文档,效果很好。
检查辅助。当我在 v3.0.8 遇到这个问题时,secondary 卡在 RECOVERING 状态,日志显示原因:
2015-11-19T00:35:01.271+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:42:16.360+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:45:01.410+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:52:16.496+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:55:01.551+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
默认情况下,mongoimport
使用 "majority" 写入关注。由于我的辅助设备陈旧,它们无法复制导入操作,而主设备正在等待永远不会发生的复制。
在辅助服务器上执行 manual resync 后,我再次尝试 mongoimport
并成功。或者,如果只有一个辅助节点正在恢复,您可以使用 --writeConcern
选项将写入关注设置为较低的数字。
使用较小的批量解决了这个问题。
mongoimport --db InfDB --collection SFTest --file InfMapRed.json
--batchSize 100
这在导入大型文档时很有用,默认批量大小为 10000。
我遇到过大型 json 文件的问题,
batchSize 没有解决问题,
但是 numInsertionWorkers 做到了
这仅适用于 mongo 3:
在你的例子中,有 1 个工人,你能够插入 0.2% 的数据,
所以100/0.2=500,需要500个worker一次性获取数据
mongoimport --db InfDB --collection SFTest --file InfMapRed.json --numInsertionWorkers 500
参考:https://docs.mongodb.com/manual/reference/program/mongoimport/#cmdoption--numInsertionWorkers
OS: ubuntu 14.04 LTS
Mongo version: rs0:PRIMARY> db.version()
3.0.7
Storage engine: wiredTiger.
通过此命令导入 JSON 文件(13GB,每行 1 JSON 文档):
$ mongoimport --db InfDB --collection SFTest --file InfMapRed.json
此命令过去在 2.6 中与之前的存储引擎一起运行良好,但现在不会超过 0.2%。该程序一遍又一遍地打印下面的行。该集合通过 .count() 显示 1000 条记录。
2015-10-24T06:11:41.799+0000 connected to: localhost
2015-10-24T06:11:44.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:47.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:50.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:53.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:56.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:11:59.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:02.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:05.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:08.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:11.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:14.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:17.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:20.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
2015-10-24T06:12:23.788+0000 [........................] InfDB.SFTest 20.5 MB/13.0 GB (0.2%)
....
写了一个简单的 python 脚本来读取文件并按行插入文档,效果很好。
检查辅助。当我在 v3.0.8 遇到这个问题时,secondary 卡在 RECOVERING 状态,日志显示原因:
2015-11-19T00:35:01.271+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:42:16.360+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:45:01.410+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:52:16.496+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
2015-11-19T00:55:01.551+0000 I REPL [rsBackgroundSync] replSet error RS102 too stale to catch up
默认情况下,mongoimport
使用 "majority" 写入关注。由于我的辅助设备陈旧,它们无法复制导入操作,而主设备正在等待永远不会发生的复制。
在辅助服务器上执行 manual resync 后,我再次尝试 mongoimport
并成功。或者,如果只有一个辅助节点正在恢复,您可以使用 --writeConcern
选项将写入关注设置为较低的数字。
使用较小的批量解决了这个问题。
mongoimport --db InfDB --collection SFTest --file InfMapRed.json --batchSize 100
这在导入大型文档时很有用,默认批量大小为 10000。
我遇到过大型 json 文件的问题, batchSize 没有解决问题, 但是 numInsertionWorkers 做到了
这仅适用于 mongo 3:
在你的例子中,有 1 个工人,你能够插入 0.2% 的数据, 所以100/0.2=500,需要500个worker一次性获取数据
mongoimport --db InfDB --collection SFTest --file InfMapRed.json --numInsertionWorkers 500
参考:https://docs.mongodb.com/manual/reference/program/mongoimport/#cmdoption--numInsertionWorkers