1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

结构化数据流-窗口操作

基于Event-time的窗口操作

作为结构化数据流领域的小编,介绍基于Event-time的窗口操作是必不可少的。在结构化数据流模型中,每个事件都是一行数据,其中Event-time是指事件产生的时间而不是Spark接收到消息的时间。这为基于Event-time的窗口聚合操作提供了可能。每个窗口都是一个组,每一行数据可能属于多个窗口。因此,基于Event-time的聚合查询适用于静态表和数据流,并且可以很自然地处理基于Event-time的延迟数据。Spark 2.1之后使用watermark指定延迟数据的阙值,清除旧状态,从而解决了延迟数据的问题。

结构化数据流-窗口操作

窗口模型

现在,我们来想象这样一种场景:Spark不断地接收输入,进行词频统计。输入包括词语和词语产生的时间。我们需要统计每10分钟内的词频统计,每5分钟统计一次。这样我们就需要一个窗口模型,如下所示:

窗口模型

如图所示,每次统计的是10分钟内的数据,应用程序12:00启动,开始接收数据,12:00-12:05时间内接到两条数据(产生时间分别为12:02和12:03),到12:05时开始第一次统计数据。从12:05到12:10这段时间内仅接收到一条数据(产生时间为12:07),12:10时进行第二次统计数据,统计的是12:05-12:15之间接收到的数据。12:10-12:15时间内接受到了两条数据(产生时间分别为12:11,12:13),12:15进行了第三次窗口统计。最后,12:15-12:25时间内又接收到了四条数据(12:08dog,12:13owl,12:15cat,12:21owl),从而更新了和新增了一些数据(如图所示)。

迟到数据处理

在我们知道如何对窗口数据进行处理后,现在来看下如何处理迟到数据。迟到数据有一定的延迟,存在的问题是所占空间过大,因此需要清理。Spark 2.1开始,引入了watermark(水印),可以指定event-time的列并且指定数据可以迟到时间的阙值。例如,下面的例子中指定了event-time列”timestamp”,并且指定了数据迟到时间的阙值为10分钟,要注意目前为止可以看到的最大event-time和watermarking线。结合例子可以更好地理解。

水印模型

水印可以保持10分钟的中间状态,以便对于较晚的数据进行计数。例如,对于12:09这条数据的延迟,其仍在12:04水印线之前,因此仍保持其中间状态。但是当观察到12:21数据时,水印更新为12:11,并将12:00-12:05窗口的中间状态清除。然后,12:04的数据就会被丢弃。水印线之下的数据都会被丢弃。当数据延迟时间超过2小时时,引擎处理数据的可能性越小,数据将无法被保留。

使用水印清除中间状态条件输出模式必须是Append、Update,因为complete模式需要保留所有聚合数据。聚合必须有event-time列或者event-time列的窗口。水印作用的列必须与聚合列保持一致。水印聚合语义保证水印延迟(设置为withWatermark)为“2小时”,确保引擎永远不会丢弃任何少于2小时的数据。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6342.html