如何创建" CassandraTableScanRDD"没有sparkContext

时间:2016-09-07 11:04:31

标签: scala apache-spark spark-streaming spark-cassandra-connector

我正在使用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()
  }

}

任何想法如何解决这个问题?

感谢, 叶兰

1 个答案:

答案 0 :(得分:0)

您可以使用SparkContext传递@transient,这可能会起作用。

class Dao(@transient context: SparkContext)  {
  ..
}