Window 在 Spark Streaming 中?

Window in Spark Streaming?

在spark streaming中,我们接收到的DStream是一批RDD。那么开窗如何进一步提供帮助。

据我了解,它还对 RDD 进行批处理。

如果我错了请纠正我(Spark Streaming 新手)。

一个批次的记录数由批次间隔决定。 window 将使批次数量保持在 window 的大小范围内,这就是为什么 window 大小必须是批次间隔的倍数。然后,您的操作将在多个批次上 运行,对于每个新批次,window 将向前推进,丢弃旧批次。

重点是在流式传输中,属于一起的数据不一定同时到达,尤其是在低批次间隔时。使用 windows,您实际上是在回顾过去。

但请注意,您的作业仍在 运行 指定的批次间隔,因此它将以与以前相同的速度生成输出,但会同时查看更多数据。您还会多次查看相同的数据!

Michael Noll 的博客 post 对此进行了更详细的解释:http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/

更新:

您可以增加批处理间隔,但是您的作业处理速度也会变慢,即每 10 秒而不是 2 秒才创建输出。您还可以在计算的一部分上放置 window,而批处理间隔会影响一切。例如查看 reduceByKeyAndWindow

因此 window 允许您根据(根据我的经验)为 window 和增量指定的毫秒数从流中采样数据。

到目前为止,我的工作一直在使用 Kafka 主题,因此我将 window 设置如下:

LOG.info(metricTagType+"::Grouping by Key & Window:["+windowDuration+"]  Increment:["+windowIncrement+"]...defn.");
Duration winDuration = new Duration(windowDuration);
Duration incrementDuration = new Duration(windowIncrement);
JavaPairDStream<String, Iterable<String>> grpedJpd = jpd.groupByKeyAndWindow(winDuration, incrementDuration);

我通过反复试验发现,如果不使用上述方法,windowing 将无法正常工作;做一个单独的 groupBy 然后 window 没有给出想要的结果。

最后一点,如果window增量必须是下面获取上下文时持续时间的倍数,否则spark会抛出异常:

JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
                                        Durations.seconds(duration));

批次间隔:

• 流式计算 -> 连续系列批计算 -> 作用于小批量数据

• Spark Steaming -> 从多个来源接收数据 -> 将其分组为小批次 -> 定期创建新批次

• 每个时间间隔的开始 -> 创建新批次 -> 在间隔期间到达的任何数据都将添加到批次中。

• 每个输入批次形成一个 RDD

Window 持续时间 :合并多个批次的结果
滑动持续时间 : 控制新 DStream 计算结果的频率

示例 1:批处理间隔 = 10 秒的源 DStream 想要创建最后 30 秒(或最后 3 个批次)的滑动 window -> Window 持续时间为 30 秒

默认为批处理间隔的滑动持续时间控制新 DStream 计算结果的频率。

示例 2:如果我们的源 DStream 的批处理间隔为 10 秒,并且希望仅在每两个批处理上计算我们的 window,我们会将滑动间隔设置为 20 秒