Java Spark 本地多线程连接 MongoDB报错

  • lovebing 
  • 未分类

昨天写了一个 Spark 应用,合并同一个 Mongo Collection 内重复的document。在测试环境上,Collection 只有几百个document,spark.master 设置为 local[32],以 local 的方式可以正常运行。而部署到生产环境,在 Collection 有 450 万个document的情况下,运行了大约一分钟就报错了:

com.mongodb.MongoCursorNotFoundException: Query failed with error code -5 and error message ‘Cursor xxxxx not found on server xxxx’

看样子是 cursor 超时了。Java driver 的 api 有 noCursorTimeout 的方法可以解决问题,但是我详细查看了 ReadConfig 的配置项 (见 https://docs.mongodb.com/spark-connector/current/configuration/#input-configuration ),却没发现有timeout的设置。

在网上查了很久,发现这类问题很少,看使用 Spark 连接 MongoDB 的人不多。StackOverflow 上有人几个月前提了个问题(https://stackoverflow.com/questions/45184214/mongodb-with-spark-got-a-error-code-5),跟我遇到的一模一样,但是零回答。在 StackOverflow 上找了一个 MongoDB 连接的问题,有人说 可以在 url 设置 socketTimeout 的时间,试了一下也没有任何效果。

最后查到了一篇博文(http://www.cnblogs.com/gaoze/p/7212436.html),上面了提到了这个错误,并给出了解决方法。我以为找到了救星,但是试了一下,问题依旧。

我想可能是并发访问的问题,于是改小线程数,local[16], local[8], local[2] 都试了,还是没效果。最后使用 local[1],奇迹出现了,没有报错了。于是我在 StackOverflow 上回答上文提到的问题。

这可能是 Mongo Connector 的一个 bug。

发表评论

电子邮件地址不会被公开。 必填项已用*标注