Spark结构化流之水印

本文详细介绍了Spark结构化流中的水印概念,用于处理迟到数据和清除聚合状态。通过设置水印,系统可以自动跟踪事件时间并限制中间状态的存储,允许在一定延迟范围内更新窗口聚合。水印的使用需要满足特定条件,例如输出模式必须是追加或更新,且水印必须在与聚合列相同的列上定义。水印延迟保证了不超过2小时的延迟数据会被汇总,但超过此延迟的数据可能无法保证处理。

一.处理后期数据和加水印

现在考虑如果存在事件迟到了应用程序会发生什么。例如,应用程序在12:11接收在12:04(即事件时间)生成的单词。应用程序应使用12:04而不是12:11来更新窗口的旧计数12:00 - 12:10。这在基于窗口的分组中很自然地发生,结构化流可以长时间保持部分聚合的中间状态,以便后期数据可以正确更新旧窗口的聚合,如下所示。
在这里插入图片描述
但是,要连续几天运行此查询,系统必须限制其累积的中间内存状态量。这意味着系统需要知道何时可以从内存中删除旧状态聚合,因为应用程序将不再接收该聚合的最新数据。为此,我们在Spark 2.1中引入了水印功能,该功能使引擎自动跟踪数据中的当前事件时间,并尝试相应地清除旧状态。可以通过指定事件时间列和有关事件时间期望数据延迟的阈值来定义查询的水印。对于在时间结束的特定窗口T,引擎将维持状态并允许后期数据更新状态,直到(max event time seen by the engine - late threshold > T)。换句话说,阈值内的延迟数据将被汇总,但阈值后的数据将开始被丢弃。让我们通过一个例子来理解这一点。我们可以使用withWatermark()轻松定义水印。

import spark.implicits._

val words = ..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值