Spark Streaming Union Stream - 并行化

Spark Streaming Union Stream - parallelization

这可能是一个基本问题,但我理解起来有些困难。

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

如果我创建了一个 Unionized stream,我相信这个 union 抽象的多个 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?

在每一个batch之后,所以在streamDuration之后,Spark会将本次window接收到的所有数据收集到一个RDD中,然后将这个RDD映射(再说一遍:是一个RDD,但是map是并行完成,就像批处理作业中的映射一样)。

作为最后一步,对于每个 RDD,将执行来自 foreachRDD 的函数。对于每个 RDD 意味着它将在每个微批次(时间 window).

的 RDD 上执行

当然在下一个streamDuration时间之后,会再次收集数据,创建RDD(数据只是从上次收集到当前之间的时间),map,函数给foreachRDD

总结:foreachRDD并不意味着一次会执行很多个RDD,而是意味着在每一个微批中函数都会应用到这个微批上