Spark Streaming中的窗口?

时间:2015-10-08 08:00:20

标签: apache-spark spark-streaming

在火花流媒体中,我们收到的DStream是一批RDD。那么窗口如何有助于进一步发展。

根据我的理解,它也会批量处理RDD。

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

3 个答案:

答案 0 :(得分:11)

一批中的记录数由批处理间隔确定。窗口将使批次数保持在窗口大小范围内,这就是窗口大小必须是批次间隔的倍数的原因。然后,您的操作将在多个批次上运行,并且对于每个新批次,窗口将向前移动,丢弃较旧的批次。

关键在于,在流式传输中,属于一起的数据不一定同时到达,尤其是在低批量间隔时。对于Windows,你基本上是回顾过去。

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

迈克尔·诺尔有一篇很好的博客文章,更详细地解释了这一点:http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/

更新

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

答案 1 :(得分:5)

批处理间隔:

•流式计算 - >连续系列批量计算 - >对小批量数据采取行动

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

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

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

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

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

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

示例2:如果我们的源DStream的批处理间隔为10秒,并且只想在每批次计算我们的窗口,我们将滑动间隔设置为20秒

答案 2 :(得分:0)

因此,该窗口允许您根据(根据我的经验)为窗口指定的毫秒数和增量对流中的数据进行采样。

我迄今为止的工作一直在使用Kafka主题,因此我将窗口设置如下:

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);

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

最后一件事是,在获取上下文时,窗口增量必须是以下持续时间的倍数,否则spark会引发异常:

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