[英]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.