错误:com.mongodb.mongocursornotfoundexception:从MongoDB读到Spark时



我试图以2.34亿张记录阅读MongoDB的收藏。我只需要1个字段。

case class Linkedin_Profile(experience : Array[Experience])
case class Experience(company : String)
val rdd = MongoSpark.load(sc, ReadConfig(Map("uri" -> mongo_uri_linkedin)))
val company_DS = rdd.toDS[Linkedin_Profile]()
val count_udf = udf((x: scala.collection.mutable.WrappedArray[String]) => {x.filter( _ != null).groupBy(identity).mapValues(_.size)})
val company_ColCount = company_DS.select(explode(count_udf($"experience.company")))
comp_rdd.saveAsTextFile("/dbfs/FileStore/chandan/intermediate_count_results.csv")

作业运行1小时,完成了一半的作业,但此后给出了一个错误

com.mongodb.MongoCursorNotFoundException: 
Query failed with error code -5 and error message 
'Cursor 8962537864706894243 not found on server cluster0-shard-01-00-i7t2t.mongodb.net:37017' 
on server cluster0-shard-01-00-i7t2t.mongodb.net:37017

我尝试使用下面更改配置,但无济于事。

System.setProperty("spark.mongodb.keep_alive_ms", "7200000")

请建议如何阅读此大型收藏。

配置属性park.mongodb.keep_alive_ms旨在控制客户端的寿命。请参阅此处的文档。

您遇到的问题似乎与服务器端配置有关。根据此问题的记录:

通过指定CursorTimeoutmillis选项,管理员可以配置Mongod或Mongos,以在指定的间隔后自动删除IDLE客户端光标。超时适用于在启动Mongod或Mongos时指定的所有光标,可以在启动Mongod或Mongos时指定,并且可以随时使用SetParameter命令进行修改。

因此,尝试使用指定的cursorTimeoutMillis启动mongod守护程序,例如:

mongod --setParameter cursorTimeoutMillis=10800000

此命令试图指示服务器保持光标有效3小时。

尽管从理论上讲,这可能会摆脱烦恼,但最好让阅读更快地完成读物仍然是一个好主意。您可能需要考虑将坐在集合中的数据集限制到真正想要加载到Spark中的数据集。可能有很多选项可以调整值得研究的阅读速度。

是的,通过指定cursortimeoutmillis选项,您可以避免这种情况。但是,如果您不是管理员,则可以首先通过操作来缓存Mongordd,然后在Spark Env中做一些事情。

相关内容

  • 没有找到相关文章

最新更新