单元测试火花流

时间:2017-03-28 19:18:53

标签: 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.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中模拟InputDStream?我怎样才能进行单元测试呢?基本上我想模拟cassandraSQLContext.read.json(rdd.map(x => x._2))然后返回一个自定义DF(我可以做),但是如何通过前3行? 目前它只是对消息进行轮询,测试永远不会完成。

1 个答案:

答案 0 :(得分:0)

使用任何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内容。或"之前"您的测试框架提供的功能 - 同样在"拆卸"或"之后。"

虽然不是严格的单元测试,但这些测试将帮助您确信您的处理代码可以处理流,并且如果流的源变为真实( Kafka)时情况变坏,那么您可以看看Kafka方面的事情。