以编程方式在apache spark中创建dstream

时间:2015-10-22 13:02:59

标签: testing apache-spark dstream

我正在围绕Apache Spark Streaming编写一些自包含的集成测试。 我想测试我的代码可以在我的模拟测试数据中摄取各种边缘情况。 当我使用常规RDD(不是流式传输)时这样做。我可以使用我的内联数据并调用" parallelize"把它变成火花RDD。 但是,我找不到这种创建目的地的方法。理想情况下,我想打电话给#34; push"偶尔发挥作用,让魔力神奇地出现在我的dstream中。 ATM我是通过使用Apache Kafka来做到这一点的:我创建了一个临时队列,然后我写信给它。但这似乎有点矫枉过正。我更倾向于直接从我的测试数据创建测试dstream,而不必使用Kafka作为中介。

3 个答案:

答案 0 :(得分:5)

出于测试目的,您可以从RDD队列创建输入流。 在队列中推送更多RDD将模拟在批处理间隔中处理了更多事件。

val sc = SparkContextHolder.sc
val ssc = new StreamingContext(sc, Seconds(1))
val inputData: mutable.Queue[RDD[Int]] = mutable.Queue()
val inputStream: InputDStream[Int] = ssc.queueStream(inputData)

inputData += sc.makeRDD(List(1, 2)) // Emulate the RDD created during the first batch interval
inputData += sc.makeRDD(List(3, 4)) // 2nd batch interval
// etc

val result = inputStream.map(x => x*x)
result.foreachRDD(rdd => assertSomething(rdd))
ssc.start() // Don't forget to start the streaming context

答案 1 :(得分:1)

In addition to Raphael solution I think you like to also either can process one batch a time or everything available approach. You need to set oneAtATime flag accordingly on queustream's optional method argument as shown below:

val slideDuration = Milliseconds(100)
val conf = new SparkConf().setAppName("NetworkWordCount").setMaster("local[8]")
val sparkSession: SparkSession = SparkSession.builder.config(conf).getOrCreate()
val sparkContext: SparkContext = sparkSession.sparkContext
val queueOfRDDs = mutable.Queue[RDD[String]]()


val streamingContext: StreamingContext = new StreamingContext(sparkContext, slideDuration)
val rddOneQueuesAtATimeDS: DStream[String] = streamingContext.queueStream(queueOfRDDs, oneAtATime = true)
val rddFloodOfQueuesDS: DStream[String] = streamingContext.queueStream(queueOfRDDs, oneAtATime = false)

rddOneQueuesAtATimeDS.print(120)
rddFloodOfQueuesDS.print(120)

streamingContext.start()


for (i <- (1 to 10)) {
  queueOfRDDs += sparkContext.makeRDD(simplePurchase(i))
  queueOfRDDs += sparkContext.makeRDD(simplePurchase((i + 3) * (i + 3)))
  Thread.sleep(slideDuration.milliseconds)
}

Thread.sleep(1000L)

答案 2 :(得分:0)

我找到了这个基本示例: https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/CustomReceiver.scala

这里的关键是调用“store”命令。用你想要的任何东西替换商店的内容。