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

时间:2017-12-24 09:26:36

标签: mongodb apache-spark pyspark apache-spark-sql pyspark-sql

我正在尝试在Spark中的MongoDB中读取一个包含2.34亿条记录的集合。我只想要一个领域。

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

作业运行1小时,其中一半作业已完成但在此之后出现错误

{{1}}

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

{{1}}

请建议如何阅读这个大集合。

2 个答案:

答案 0 :(得分:1)

配置属性park.mongodb.keep_alive_ms旨在控制客户端的生命周期。请参阅文档here

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

  

通过指定cursorTimeoutMillis选项,管理员可以配置mongod或mongos以在指定的时间间隔后自动删除空闲的客户端游标。超时适用于mongod或mongos上维护的所有游标,可以在启动mongod或mongos时指定,并且可以随时使用setParameter命令进行修改。

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

mongod --setParameter cursorTimeoutMillis=10800000

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

虽然这可能在理论上摆脱了烦恼,但让读取更快完成仍然是一个好主意。您可能希望将集合中的数据集限制为您真正想要加载到Spark中的数据集。调整阅读速度可能有很多选择值得研究。

答案 1 :(得分:1)

是,通过指定cursorTimeoutMillis选项,可以避免这种情况。 但是,如果您不是管理员,可以先通过Action缓存MongoRdd,然后在spark env中执行某些操作。