Mongodb Spark Streaming:foreachRDD更新我的mongo RDD

Mongodb Spark Streaming:foreachRDD更新我的mongo RDD,mongodb,apache-spark,spark-streaming,Mongodb,Apache Spark,Spark Streaming,每次在foreachRDD中输入时,我都想创建一个新的mongodb RDD。但是,我有序列化问题: mydstream .foreachRDD(rdd => { val mongoClient = MongoClient("localhost", 27017) val db = mongoClient(mongoDatabase) val coll = db(mongoCollection) // ssc is my Strea

每次在
foreachRDD
中输入时,我都想创建一个新的mongodb RDD。但是,我有序列化问题:

 mydstream  
   .foreachRDD(rdd => {
      val mongoClient = MongoClient("localhost", 27017)
      val db = mongoClient(mongoDatabase)
      val coll = db(mongoCollection)
      // ssc is my StreamingContext
      val modelsRDDRaw = ssc.sparkContext.parallelize(coll.find().toList) })
这将给我一个错误:

object not serializable (class: org.apache.spark.streaming.StreamingContext, value: org.apache.spark.streaming.StreamingContext@31133b6e)

有什么想法吗?

据我所知,如果您有一个“不可序列化”的对象,您需要将其通过
foreachPartition
传递,这样您就可以在运行处理之前连接到每个节点上的数据库

mydstream.foreachRDD(rdd => {
        rdd.foreachPartition{
          val mongoClient = MongoClient("localhost", 27017)
          val db = mongoClient(mongoDatabase)
          val coll = db(mongoCollection)
          // ssc is my StreamingContext
          val modelsRDDRaw = ssc.sparkContext.parallelize(coll.find().toList) }})
您可以尝试使用返回SparkContext或SparkStreamingContext(如果rdd是数据流)的


实际上,RDD似乎还有一个
.sparkContext
方法。我真的不知道有什么区别,也许它们是别名(?)

您可以在rdd之前尝试在foreachRDD中创建ssc。foreachPartition
val ssc=StreamingContext.getOrCreate(checkpointdirectory,functionToCreateContext)
SparkContext
不可序列化,因此无法在任何转换或操作方法中使用,您必须仅在驱动程序类中使用。在foreachRDD方法中将列表转换为rdd有什么具体原因吗?
mydstream foreachRDD { rdd => {
      val mongoClient = MongoClient("localhost", 27017)
      val db = mongoClient(mongoDatabase)
      val coll = db(mongoCollection)
      val modelsRDDRaw = rdd.context.parallelize(coll.find().toList) })