Flink 的水印機制

Apache Flink 的 水印機制(Watermark Mechanism) 主要用于解決 事件時間流中的亂序問題(Out-of-Order Events),確保窗口(Window)能夠在合適的時間觸發計算,從而提供準確、一致的處理結果。


🧩 一、Flink 水印機制解決了什么問題?

? 1. 亂序事件無法確定窗口關閉時機

? 問題:

在實際數據流中,事件可能由于網絡延遲、系統處理差異等原因,并不是按照其“發生時間”順序到達。例如:

事件時間序列:[3s, 2s, 5s, 4s, 7s]

如果不做處理,窗口可能會錯誤地提前關閉,導致丟失部分數據。

? 解決方案:

使用 水印機制 告訴 Flink:“當前不會再出現比這個時間更早的數據了”,這樣 Flink 才能安全地關閉窗口并進行聚合計算。


? 2. 保證基于事件時間的窗口語義正確性

Flink 支持多種時間語義(Processing Time、Event Time),只有 Event Time + Watermark 能夠提供 精確、可重復、一致性高的結果

💡 使用 Processing Time 窗口無法容忍延遲或亂序,每次運行結果可能不同。


? 3. 控制遲到數據的處理方式

通過設置允許的最大延遲 .allowedLateness() 和輸出側邊流 .sideOutputLateData(),可以靈活控制哪些數據仍可被處理,哪些應被丟棄或單獨處理。


?? 二、水印時間應該如何設置?

水印時間本質上是一個邏輯時間戳,表示“目前不會再有比這個時間更早的事件”。它是由你定義的策略生成的。

📌 設置方式:

DataStream<Event> watermarkedStream = stream.assignTimestampsAndWatermarks(WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);

📈 三、水印設置策略與建議

水印策略適用場景示例代碼
forMonotonousTimestamps()數據嚴格有序,無亂序.forMonotonousTimestamps()
forBoundedOutOfOrderness(Duration max)允許固定最大延遲的亂序.forBoundedOutOfOrderness(Duration.ofSeconds(5))
自定義 WatermarkGenerator特殊業務需求(如動態延遲)實現接口 WatermarkGenerator

🔧 四、如何選擇水印時間參數?

? 1. 根據數據源特性設置最大亂序時間(maxOutOfOrderness)

  • 如果你的數據源來自 Kafka 或 IoT 設備,需根據歷史數據分析最大延遲。
  • 若不了解延遲情況,可先設為 Duration.ofSeconds(5),觀察是否仍有遲到數據。

? 2. 配合窗口大小合理設置

  • 如果你使用的是 10 秒滾動窗口,設置最大亂序為 5 秒是合理的。
  • 不建議將亂序時間設置得過大,否則會導致窗口遲遲不觸發,影響實時性。

? 3. 使用 allowedLateness() 控制遲到容忍度

.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.allowedLateness(Time.minutes(1)) // 容忍最多1分鐘遲到
.sideOutputLateData(lateTag)      // 輸出遲到數據到側邊流

📊 五、示例:如何設置合理的水印時間?

假設你有一個日志系統,事件從客戶端發送到服務端,平均延遲 2 秒,最大不超過 5 秒。

推薦配置:

WatermarkStrategy<Event> strategy = WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 最大亂序5秒.withTimestampAssigner((event, timestamp) -> event.getTimestamp());DataStream<Event> watermarkedStream = stream.assignTimestampsAndWatermarks(strategy);// 設置10秒窗口,允許最多1分鐘遲到數據
watermarkedStream.keyBy(keySelector).window(TumblingEventTimeWindows.of(Time.seconds(10))).allowedLateness(Time.minutes(1)).process(new MyProcessWindowFunction());

? 六、總結

問題解決方法
亂序數據導致窗口計算不完整使用水印機制,設定最大亂序時間
窗口遲遲不觸發檢查水印是否推進、調整亂序容忍度
遲到數據丟失使用 allowedLateness() + sideOutputLateData() 處理
時間戳未提取使用 withTimestampAssigner() 提取事件時間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80590.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【每天一個知識點】embedding與representation

“Embedding&#xff08;嵌入&#xff09;”與“Representation&#xff08;表示&#xff09;”在機器學習、自然語言處理&#xff08;NLP&#xff09;、圖神經網絡等領域常被使用&#xff0c;它們密切相關&#xff0c;但語義上有一定區別。 一、定義 1. Representation&#…

SpringBoot(二)--- SpringBoot基礎(http協議、分層解耦)

目錄 前言 一、SpringBoot入門 1.入門程序 2.解析 二、HTTP協議 1.HTTP概述 2.HTTP請求協議 2.1 GET方式的請求協議 2.2 POST方式的請求協議 2.3 兩者的區別 2.4 獲取請求數據 3.HTTP響應協議 三、分層解耦 1.三層架構 2.IOC&DI 2.1 入門 2.2 IOC詳解 2.…

Please install it with pip install onnxruntime

無論怎么安裝都是 Please install it with pip install onnxruntime 我python 版本是3.11 &#xff0c;我換成3.10 解決了

【數據結構入門訓練DAY-35】棋盤問題

本次訓練聚焦于使用深度優先搜索&#xff08;DFS&#xff09;算法解決棋盤上的棋子擺放問題。題目要求在一個可能不規則的nn棋盤上擺放k個棋子&#xff0c;且任意兩個棋子不能位于同一行或同一列。輸入包括棋盤大小n和棋子數k&#xff0c;以及棋盤的形狀&#xff08;用#表示可放…

【日常筆記】wps如何將值轉換成東西南北等風向漢字

在WPS表格中&#xff0c;若要將數值&#xff08;如角度值&#xff09;轉換成“東、南、西、北”等風向漢字&#xff0c;可通過以下步驟結合自定義函數或條件判斷實現&#xff1a; 一、wps如何將值轉換 方法一&#xff1a;使用LOOKUP函數&#xff08;簡化公式&#xff09;&…

Web性能優化的未來:邊緣計算、AI與新型渲染架構

一、邊緣計算與性能優化深度整合 1.1 邊緣節點計算卸載策略 ? 智能任務分割:將非關鍵路徑計算卸載到邊緣節點 // 客戶端代碼 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer

spring中的EnvironmentPostProcessor接口詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 EnvironmentPostProcessor 是 Spring Boot 提供的一個關鍵擴展接口&#xff0c;允許開發者在 Spring 應用環境初始化后、應用上下文創建前&…

Vue3知識點梳理

注&#xff1a;純手打&#xff0c;如有錯誤歡迎評論區交流&#xff01; 轉載請注明出處&#xff1a;https://blog.csdn.net/testleaf/article/details/148056625 編寫此文是為了更好地學習前端知識&#xff0c;如果損害了有關人的利益&#xff0c;請聯系刪除&#xff01; 本文章…

C++23 新增的查找算法詳解:ranges::find_last 系列函數

文章目錄 引言C Ranges 庫簡介ranges::find_last、ranges::find_last_if 和 ranges::find_last_if_not 概述ranges::find_last示例代碼代碼解釋 ranges::find_last_if函數簽名參數解釋示例代碼代碼解釋 ranges::find_last_if_not示例代碼代碼解釋 使用場景總結 引言 在 C 的發…

DW_DMAC簡介

基本概念&#xff1a; DMA&#xff1a;全稱direct memory access&#xff0c;即直接存儲器訪問。dma可以在中央處理器CPU不參與的情況下&#xff0c;實現外設和內存之間的數據直接傳輸&#xff0c;從而提高數據傳輸效率 外設與計算機內存之間的數據傳輸&#xff0c;一般可通過…

信號量基礎入門:并發控制的核心概念

問題的復雜性產生的根本原因在于&#xff0c;如 2.2 節所述&#xff0c;共享變量的訪問始終是“單向信息流”。也就是說&#xff0c;一個進程可以分配新值或檢查當前值&#xff0c;但這種檢查不會為其他進程留下任何痕跡。結果是&#xff0c;當一個進程想要對共享變量的當前值作…

(十九)Java集合框架深度解析:從基礎到高級應用

一、集合框架概述 1.1 什么是集合框架 Java集合框架(Java Collections Framework, JCF)是Java語言中用于表示和操作集合的一套標準化體系結構。它提供了一組接口、實現類和算法&#xff0c;用于存儲和操作對象組&#xff0c;解決了數組在存儲對象時的諸多限制。 集合框架的主…

Blender cycles烘焙貼圖筆記

下載了一些槍模型&#xff0c;一個模型有七八個材質&#xff0c;一個扳機、準星還有單獨的材質&#xff0c;用的貼圖只有一小部分有內容&#xff0c;對Draw Call非常不友好。不得不學一下怎么用Blender減材質。 找到了這個視頻如何在Blender中將多種材料多張貼圖烘焙成一張貼圖…

mysql的高可用

1. 環境準備 2臺MySQL服務器&#xff08;node1: 192.168.1.101&#xff0c;node2: 192.168.1.102&#xff09;2臺HAProxy Keepalived服務器&#xff08;haproxy1: 192.168.1.103&#xff0c;haproxy2: 192.168.1.104&#xff09;虛擬IP&#xff08;VIP: 192.168.1.100&#x…

鴻蒙 系統-安全-程序訪問控制-應用權限管控

Ability Kit 提供了一種允許應用訪問系統資源&#xff08;如&#xff1a;通訊錄等&#xff09;和系統能力&#xff08;如&#xff1a;訪問攝像頭、麥克風等&#xff09;的通用權限訪問方式&#xff0c;來保護系統數據&#xff08;包括用戶個人數據&#xff09;或功能&#xff0…

算法-數對的使用

1、數對可用于數組排序中&#xff0c;并且可記憶化排序前的元素下標 #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10; pair<int, int> a[N]; void solve() {ll n;cin …

Linux基礎第四天

系統之間文件共享 想要實現兩個不同的系統之間實現文件共享&#xff0c;最簡單的一種方案就是設置VMware軟件的共享文件夾&#xff0c;利用共享文件夾可以實現linux系統和windows系統之間的文件共享&#xff0c;這樣就可以實現在windows系統上編輯程序&#xff0c;然后在linux系…

Docker 核心原理詳解:Namespaces 與 Cgroups 如何實現資源隔離與限制

#Docker疑難雜癥解決指南# Docker 作為容器化技術的代名詞,徹底改變了軟件的開發、部署和管理方式。它憑借其輕量、快速、一致性強的特性,成為了現代云原生架構的基石。然而,Docker 容器的神奇之處并非“無中生有”,其背后是 Linux 內核的兩大核心技術——Namespaces(命名…

GitHub 趨勢日報 (2025年05月14日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1xming521/WeClone&#x1f680;從聊天記錄創造數字分身的一站式解決方案&…

【Go】從0開始學習Go

文章目錄 從0開始學習Go0 與C對比1 代碼框架1.1 helloworld式代碼示例1.2 主體代碼元素&#xff08;核心三部分&#xff09;1.3 其他 2 與C/C區別3 有用的小工具4 注意事項 從0開始學習Go 0 與C對比 特性CGo編譯型語言需要編譯為機器碼直接編譯為二進制可執行文件靜態類型類型…