Spark Streaming:foreachRDD更新我的mongo RDD

时间:2016-01-15 15:36:19

标签: 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 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)

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您可能会尝试使用返回SparkContext或SparkStreamingContext的rdd.context(如果rdd是DStream)。

mydstream foreachRDD { rdd => {
      val mongoClient = MongoClient("localhost", 27017)
      val db = mongoClient(mongoDatabase)
      val coll = db(mongoCollection)
      val modelsRDDRaw = rdd.context.parallelize(coll.find().toList) })

实际上,似乎RDD也有.sparkContext方法。老实说我不知道​​区别,也许它们是别名(?)。

答案 1 :(得分:2)

根据我的理解,如果你有一个“不可序列化”的对象,你需要添加它,你需要通过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) }})