簡體   English   中英

Spark Streaming:foreachRDD更新我的mongo RDD

[英]Spark Streaming: foreachRDD update my mongo RDD

我想在每次進入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)

任何的想法?

你可以嘗試使用rdd.context返回無論是SparkContext或SparkStreamingContext(如果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方法。 老實說我不知道​​區別,也許它們是別名(?)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM