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。foreachPartitionval 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) })