Spark Streaming Union Stream - 并行化

时间:2016-09-29 18:31:30

标签: apache-spark apache-kafka spark-streaming azure-eventhub

这可能是一个基本问题,但我对此有所了解。

我目前在我的Spark / Scala应用程序中使用Microsoft Azure Event Hubs Streaming,类似于Kafka。

如果我创建了一个Unionized流,我相信这个unions被抽象为多个DStream对象看起来像一个DStream,流中的多个RDD会被并行处理,还是会逐个处理每个RDD?

为了更多地解释这一点,这是一个简单的例子:

sparkConf.set(SparkArgumentKeys.MaxCores, (partitionCount * 2).toString)

val ssc = new StreamingContext(sparkConf, streamDuration)

val stream = EventHubsUtils.createUnionStream(ssc, hubParams, storageLevel)
stream.checkpoint(streamDuration)

val strings = stream.map(f => new String(f))
strings.foreachRDD(rdd => {
  rdd.map(f => f.split(' '))
})

partitionCount是azure事件中心中的分区数。

  1. 初始" stream.map"并行执行每个RDD?
  2. " string.foreachRDD"一次处理一个RDD,还是以某种并行方式处理所有RDD?

1 个答案:

答案 0 :(得分:1)

在每个批次之后,所以在streamDuration之后,Spark会将收到的所有时间窗口数据收集到一个RDD,然后将映射这个RDD(再次:它是一个RDD,但是地图是并行完成的,就像在批处理作业中映射)。

作为最后一步,对于每个RDD,您的foreachRDD函数将被执行。对于每个RDD意味着它将在每个微批次(时间窗口)的RDD上执行

当然,在下一个streamDuration时间之后,将再次收集数据,将创建RDD(仅从最后一次收集和当前之间的时间开始的数据),地图,给予foreachRDD的功能

总结:foreachRDD并不意味着一次会执行很多RDD,但这意味着每个微批处理功能都将应用于这个微批次