我试图以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中做一些事情。