網站首頁 編程語言 正文
我們都知道,Flink的核心是流式處理,但同時也支持批處理,Flink底層是一個流式引擎,在這個上面實現了流處理和批處理,而窗口則是批處理的實現。
在Flink中window從大的分類上主要有三種:Time Window(根據時間)、Count Window(根據數據量)、Session Window(會話窗口)
窗口類型有如下兩種:
- Tumbling Window 滾動窗口,窗口之間的數據沒有重疊
- Sliding Window 滑動窗口,窗口之間的數據有可能重疊
Count Window
Count Window主要有兩類:
- Tumble Count Window:累積固定個數的數據就作為一個窗口,按照數據量來統計,不是按照時間,比如countWindow(100) 表示當窗口中的數據有100個的時候開始計算
- Sliding Count Window: 累積固定個數的數據就作為一個窗口,超過指定數量個數數據開啟新一個窗口計算,比如 coutnWindow(100,10)窗口大小是100,滑動間隔是10,每增加10個元素就會對前面的100個元素計算一次
Time Window
Time Window是根據時間對數據進行分組的,
- Tumble Time Window: 在時間上按照給定的窗口大小切分窗口,窗口之間不會重疊
- Sliding Time Window: 在時間上按照給定的窗口大小、滑動步長切分窗口,窗口之間可能會存在數據重疊
Session Window
session window意為會話窗口,與HTTP請求的session概念類似,當超過一段時間,窗口沒有收到數據時,認為窗口結束,計算窗口內的數據,窗口之間數據不會重疊
對于TimeWindow,在Flink中有幾個時間語義:
Flink中主要有如下三種時間語義:
- Event Time ,數據自帶的時間屬性,使用這個語義時需要指定數據中哪個字段表示該時間同事必須設置WaterMark。使用Event Time時,數據可能是亂序的。在計算時,Flink會緩存窗口內的數據直到接收到WaterMark,WaterMark假設不會有更晚的數據到達,意味著在同一個時間窗口下,Flink會等待一個有限的時間,在一定程度上降低了計算結果的絕對準確性,并且增加了系統的延遲
- Processing Time: 數據進入某個算子,算子開始執行時的系統時間,不需要WaterMark機制,只依賴當前節點的操作系統時間
- Ingestion Time: 數據到達Flink Source的時間,從Source到下游的各個算子中可能有多個計算環節,任何一個算子處理速度的快慢可能影響下游算子的Processing Time,而 Ingestion Time定義的是數據流入Flink的時間,不會被下游算子處理速度影響,因此Ingestion Time通常是Event Time和Processing Time的一個折中方案,Ingestion Time不需要設置復Water Mark,也不需要太多緩存,延遲較低。
watermark水印
watermark一般是在Event Time語義下使用,我們知道,Event Time 是事件發生的時間,但是進入到Flink中并不一定按照EventTime順序進入,導致窗口收到的時間會存在亂序問題,這種情況下,數據可能出現亂序和延遲情況,而WaterMark就是為了解決這個問題。
我們假設窗口為滾動窗口,窗口大小為1分鐘,正常情況下,窗口如下:
窗口1 : [20212-08 08:00:00 , 20212-08 08:01:00)
窗口2: [20212-08 08:01:00 , 20212-08 08:02:00)
窗口3: [20212-08 08:02:00 , 20212-08 08:03:00)
如果有一條數據的時間時間為 20212-08 08:00:30 在 20212-08 08:01:15到達,這個時候窗口1在20212-08 08:01:00已經處理完了,按照正常情況下,這條數據會被丟棄。
采用WaterMark機制之后,比如設置MaterMark為延遲20秒,那么這時候窗口1要在 20212-08 08:01:20的是才會觸發計算,相當于這個窗口等了20秒之后才觸發計算,而在等待20s的時間內,如果在[20212-08 08:00 , 20212-08 08:01:00)在這延遲的20s能夠到達,那么也會納入窗口1的計算中。
在Flink中如果時間語義設置為Event Time:env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
的話必須設置WaterMark。
Flink中WaterMark生成方式有兩種:
- 周期性生成,一般每隔200ms生成一個WaterMark
- 數據流中每個數據eventTime都產生一個watermark
原文鏈接:https://blog.csdn.net/LeoHan163/article/details/122293795
相關推薦
- 2022-07-25 Android實現Tab切換界面功能詳解_Android
- 2022-06-18 C語言?詳細講解#pragma的使用方法_C 語言
- 2023-07-18 List集合循環刪除特殊元素之六種方法(實踐)
- 2022-05-12 基于nginx反向代理獲取用戶真實Ip地址詳解_nginx
- 2023-01-10 redis中Could?not?get?a?resource?from?the?pool異常及解決方
- 2023-05-15 GoLang中的加密方法小結_Golang
- 2022-08-17 C++詳解鏈棧的實現_C 語言
- 2022-04-06 .Net使用加密升級數據安全_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支