【问题标题】:mongodb with spark got a error code -5带有火花的mongodb得到错误代码-5
【发布时间】:2017-07-19 07:51:56
【问题描述】:

我现在使用 mongo-spark-connector_2.11-2.0.0.jar 从 mongodb 读取数据,这是一个分片集群,有 5 个配置服务器、5 个分片服务器和 1 个 mongos。我的代码是这样的:

val rdd = MongoSpark.builder().sparkSession(spark).build.toRDD()
rdd.foreach{ x => {
    try{
        dosomething(x)
    }catch{
        case e: Throwable => e.printStackTrace()
    }
}}

我的 spark 配置是:

.config("spark.cores.max", 60)      
.config("spark.executor.cores", 12)
.config("spark.executor.memory", "32g")
.config("spark.mongodb.input.uri", "mongodb://192.168.12.161:27017/datab.origin2")

集合中有 27,000,000 个文档,当 spark 应用程序启动时,rdd 有 2500 个分区。运行一段时间后,我的驱动程序出现错误代码-5:

原因:com.mongodb.MongoCursorNotFoundException:查询失败 错误代码 -5 和错误消息“找不到光标 2639909050433532364 在服务器 192.168.12.161:27017' 在服务器 192.168.12.161:27017 上 com.mongodb.operation.QueryHelper.translateCommandException(QueryHelper.java:27) 在 com.mongodb.operation.QueryBatchCursor.getMore(QueryBatchCursor.java:213) 在 com.mongodb.operation.QueryBatchCursor.hasNext(QueryBatchCursor.java:103) 在 com.mongodb.MongoBatchCursorAdapter.hasNext(MongoBatchCursorAdapter.java:46) 在 scala.collection.convert.Wrappers$JIteratorWrapper.hasNext(Wrappers.scala:42) 在 scala.collection.Iterator$class.foreach(Ite​​rator.scala:893) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1336) 在 org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:918) 在 org.apache.spark.rdd.RDD$$anonfun$foreach$1$$anonfun$apply$28.apply(RDD.scala:918) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1951) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1951) 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 在 org.apache.spark.scheduler.Task.run(Task.scala:99) 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:748)

看了worker上的spark日志,这是第一次启动433任务,第一次返回错误:

17/07/17 19:14:23 INFO CoarseGrainedExecutorBackend:已分配任务 433

17/07/17 19:14:23 INFO 执行器:在阶段 0.0 (TID) 中运行任务 433.0 第433章)

17/07/17 19:37:31 错误执行程序:任务 433.0 中的异常 阶段 0.0 (TID 433) com.mongodb.MongoCursorNotFoundException: 查询 失败,错误代码 -5 和错误消息'Cursor 2639909048849185072 在服务器 192.168.12.161:27017' 上找不到 服务器 192.168.12.161:27017

这在 mongs 日志中:

2017-07-17T19:24:49.677+0800 I QUERY [ClusterCursorCleanupJob] 将光标 id 2639909048849185072 标记为删除,自 2017-07-17T19:14:46.055+0800 起空闲

我搜索了错误码-5,知道是10分钟没有使用游标,而其他分区只需要3-4分钟就可以完成处理。 当我使用java驱动程序时,我可以使用noCursorTimeout()来避免这个问题,当我使用mongo-spark-connector时如何解决这个问题?或者我可以用我的分片集群做什么来修复它?

【问题讨论】:

    标签: mongodb apache-spark


    【解决方案1】:

    当我使用配置 spark.master=local[16] 在本地运行 spark 时,我遇到了同样的错误。我花了很多时间在互联网上搜索以找到解决方案,但没有找到。最后我尝试设置spark.master=local[1],成功了!

    【讨论】:

    • 只是为solution 添加一些可能的解释:如果您启动 16 个线程而不是 1 个线程,您可能会打开更多与 mongo 的连接,这可能使其更有可能出现连接问题.
    猜你喜欢
    • 2014-12-21
    • 2017-07-08
    • 2016-03-30
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多