每次进入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)
有什么想法吗?
答案 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) }})