我正在使用spark streaming& amp; cassandra连接器,我有一些dao等效类(使用Scala)。 在这个dao,我想创建" CassandraTableScanRDD"。 问题是我没有sparkContext。而我无法将其传递过来, 因为它不可序列化。
这是一个简单的应用程序,它证明了这个问题:
object Engine {
def main(args: Array[String]) {
val sparkConf = new SparkConf()
val checkpointDir: String = getCheckpointDirectory()
val ssc = StreamingContext.getOrCreate(checkpointDir, () => {
val streamingContext:StreamingContext = new StreamingContext(sparkConf, batchDuration)
streamingContext.checkpoint(checkpointDir)
val dstreamsAvroEvents: InputDStream[ConsumerRecord[String, Array[Byte]]] = KafkaUtils.createDirectStream[String, Array[Byte]](
streamingContext,
PreferConsistent,
Subscribe[String, Array[Byte]](topics, kafkaParams)
)
Algo.processStream(dstreamsAvroEvents.map(x=>x.value()))
})
ssc.start()
ssc.awaitTermination()
}
}
object Algo {
val dao = new Dao(keyspace)
def processStream(avroEvents:DStream[Array[Byte]]):Unit = {
dao.findEntityBy(<somekey based on rdd>)
}
}
class Dao {
def getCassandraMappedTable():CassandraTableScanRDD[Entity] = {
//========================================
//HOW CAN I OBTAIN THE SPARK CONTEXT ???
//========================================
sparkContext.cassandraTable[Entity](keyspace, tableName)
}
def findEntityBy(someKey:String):FutureAction[Seq[Entity]] = {
getCassandraMappedTable()
.select(columnsNames: _*)
.where(eq(Columns.SOME_KEY), someKey)
.collectAsync()
}
}
任何想法如何解决这个问题?
感谢, 叶兰
答案 0 :(得分:0)
您可以使用SparkContext
传递@transient
,这可能会起作用。
class Dao(@transient context: SparkContext) {
..
}