Java 单元测试火花流

Java 单元测试火花流,java,scala,unit-testing,apache-spark,Java,Scala,Unit Testing,Apache Spark,我在scala中有这样一行: class SparkStreamingService(...){ val lines: org.apache.spark.streaming.dstream.InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]( ssc, kafkaParams, topics) lines.foreac

我在scala中有这样一行:

class SparkStreamingService(...){
 val lines: org.apache.spark.streaming.dstream.InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
    ssc, kafkaParams, topics)
  lines.foreachRDD { rdd =>
    val df = cassandraSQLContext.read.json(rdd.map(x => x._2))
    if (!df.rdd.isEmpty()) {
      processDataFrameToLoadService(df)
    }
    else{
      throw new BacSparkStreamingExpception("The dataframe created from kafka message is empty")
    }
  }

  ssc.start()
  ssc.awaitTermination()
}
有没有办法在Java中模拟InputStream?我如何进行单元测试呢?基本上,我想模拟cassandraSQLContext.read.json(rdd.map(x=>x.。_2)),然后返回一个定制的DF(我可以这么做),但是如何通过前3行呢?
目前它只是轮询消息,测试永远不会结束。

使用任何Spark上下文进行真正的单元测试几乎是不可能的。我认为您应该改为使用内存值进行集成测试:

val sparkContext: SparkContext = ...
val data: Seq[(String, String)] = Seq(("a", "1"), ("b", "2"), ("c", "3"))
val rdd: RDD[(String, String)] = sparkContext.parallelize(data)
val strings: mutable.Queue[RDD[(String, String)]] = mutable.Queue.empty[RDD[(String, String)]]
val streamingContext = new StreamingContext(sparkContext, Seconds(1))
val dStream: InputDStream = streamingContext.queueStream(strings)
strings += rdd
…然后从那里开始

您还希望在测试框架提供的某种“设置”或“之前”功能中初始化尽可能多的Spark内容,并类似地在“拆除”或“之后”中拆除它

虽然不是严格意义上的单元测试,但这些测试将帮助您确信您的处理代码能够处理流,如果流的源变为现实(即卡夫卡),那么您可以从卡夫卡的角度来寻找原因