自定义Trigger解决Flink窗口延迟数据丢失问题

本文探讨了Flink中窗口延迟数据丢失的问题,通过自定义Trigger解决了数据丢失,并提出了优化方案,避免了同一窗口多次输出,同时保持了窗口状态的有效管理。

如题,今天来分享下之前解决过的一个问题,即Flink窗口延迟数据丢失。

流计算在支持Event Time的时候,引入了Watermark的概念(MillWheel提出这个概念的时候是叫Low Watermark,即低水位,鄙视翻译成水印的:),所有早于Watermark的数据都被认为是延迟数据。而在Flink的窗口计算当中,允许用户指定数据延迟的最大时间,即设置allowedLateness,超过这个时间的数据将会被丢弃,不参与窗口计算。Flink会将被丢弃的数据用SideOutput输出。

具体的实现在WindowOperator#processElement

			for (W window: elementWindows) {
   
   

				// drop if the window is already late
				if (isWindowLate(window)) {
   
   
					continue;
				}
				isSkippedElement = false;

				windowState.setCurrentNamespace(window);
				windowState.add(element.getValue());

				triggerContext.key = key;
				triggerContext.window = window;

				TriggerResult triggerResult = triggerContext.onElement(element);

				if (triggerResult.isFire()) {
   
   
					ACC contents = windowState.get();
					if (contents == null) {
   
   
						continue
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值