У меня есть эта строка в 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()
}
Есть ли способ издеваться над InputDStream в Java? Как я могу пройти тестирование устройства? В основном я хочу издеваться над cassandraSQLContext.read.json(rdd.map(x => x._2)), а затем возвращать пользовательский DF (что я могу сделать), но как мне пройти первые три строки? В настоящее время он просто опросает сообщения, и тест никогда не заканчивается.
Истинное модульное тестирование с любым контекстом 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), вы можете посмотреть на сторону Кафки вещей для причина.