这可能是一个基本问题,但我对此有所了解。
我目前在我的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事件中心中的分区数。
答案 0 :(得分:1)
在每个批次之后,所以在streamDuration
之后,Spark会将收到的所有时间窗口数据收集到一个RDD,然后将映射这个RDD(再次:它是一个RDD,但是地图是并行完成的,就像在批处理作业中映射)。
作为最后一步,对于每个RDD,您的foreachRDD
函数将被执行。对于每个RDD意味着它将在每个微批次(时间窗口)的RDD上执行。
当然,在下一个streamDuration
时间之后,将再次收集数据,将创建RDD(仅从最后一次收集和当前之间的时间开始的数据),地图,给予foreachRDD的功能
总结:foreachRDD并不意味着一次会执行很多RDD,但这意味着每个微批处理功能都将应用于这个微批次