Apache spark 火花流中的窗口?

Apache spark 火花流中的窗口?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,在spark streaming中,我们收到的数据流是一批RDD。那么,窗口化如何进一步发挥作用呢 据我所知,它还批量生产RDD 如果我错了,请纠正我(新加入Spark Streaming)。一个批次中的记录数由批次间隔决定。窗口将使批数保持在窗口大小内,这就是为什么窗口大小必须是批间隔的倍数。然后,您的操作将在多个批次上运行,并且随着每个新批次,窗口将向前移动,丢弃旧批次 关键是,在流媒体中,属于一起的数据不一定同时到达,特别是在较低的批处理间隔。有了windows,你基本上是在回顾时间 但是

在spark streaming中,我们收到的数据流是一批RDD。那么,窗口化如何进一步发挥作用呢

据我所知,它还批量生产RDD


如果我错了,请纠正我(新加入Spark Streaming)。

一个批次中的记录数由批次间隔决定。窗口将使批数保持在窗口大小内,这就是为什么窗口大小必须是批间隔的倍数。然后,您的操作将在多个批次上运行,并且随着每个新批次,窗口将向前移动,丢弃旧批次

关键是,在流媒体中,属于一起的数据不一定同时到达,特别是在较低的批处理间隔。有了windows,你基本上是在回顾时间

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

迈克尔·诺尔(Michael Noll)写了一篇很好的博文,详细解释了这一点:

更新:


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

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

到目前为止,我的作品一直在使用卡夫卡主题,因此我将窗口设置如下:

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);
批次间隔:

•流式计算->连续批量计算->对小批量数据进行操作

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

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

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

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

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

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


示例2:如果我们的源数据流的批处理间隔为10秒,并且只想在每第二批上计算窗口,我们会将滑动间隔设置为20秒

,这要感谢窗口和批处理的更高视图,即有时您需要一个时间框架来处理数据。假设我的批处理间隔为2秒,它包含3个RDD,我的窗口框架为10秒,这意味着我一次要处理15个RDD…rite?为什么我不能增加批处理大小?@MariusSoutier如果对数据流应用窗口,是否会影响后续操作?例如,假设我使用窗口将数据流转换为成对流。涉及新PairStream的操作是否使用窗口?TD在此处详细解释。
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
                                        Durations.seconds(duration));