一、Flink 的 Watermark(水位線 水印)
每隔3秒統計前3秒的元素個數,那么flink系統會事先在系統中划分好20(60/3)個window
制定watermark的策略: 周期性提取watermark,默認時間為200ms,我們可以認為在1號數據被分配到window之后的200ms,flink系統就開始計算水位線了
假設允許數據亂序的最大時間為10秒 數據開始流入flink系統
1號數據 01:01:22---hello
2號數據 01:01:35---flink
在此之后 又來一條數據(遲到) 3號數據 01:01:23---later
第一條數據流入 01:01:22---hello
這條數據的event time是01:01:22, 那么它將會被放置到[00:00:21-00:00:24)窗口內
(100ms后)此時水位線(Watermark)為 12 (22-10)
Watermark(12) < WindowEndTime(24) 所以 不會觸發該window的計算
第二條數據流入 01:01:35---flink
這條數據的event time是01:01:35, 那么它會被放置在[00:00:33-00:00:36)窗口內
(100ms后)此時水位線(Watermark)為 25 (35-10)
由於Watermark(25) >= WindowEndTime(24), 所以 會觸發水位線(25)之前window的計算, ([21, 24))
計算后窗口直接銷毀
第三條數據流入 01:01:23---later
正常情況下數據應放到[00:00:21-00:00:24)窗口, 由於此窗口被銷毀,所以數據被丟棄
為保證數據完整性,修改 AllowedLateness 為2s 也就是窗口觸發計算后2s再銷毀
(35-37流入)這條數據的event time是01:01:23,
那么它將會被放置到[00:00:21-00:00:24)窗口(此窗口在37時會被銷毀)內
(100ms后)此時計算水位線: 23-10=13 < Watermark=25, 所以水位線不變仍為25
由於 Watermark(25) < WindowEndTime(24) + AllowedLateness(2),
所以 [00:00:21-00:00:24)窗口會再次(多次)觸發
此時, 窗口銷毀時機 Watermark >= WindowEndTime + AllowedLateness
二、Flink核心概念
參考鏈接(侵刪): https://blog.csdn.net/believe2017slwx/article/details/79978244
1. Flink程序三個基本構建塊
- source:數據源
- transformations:基於數據流的一組operate操作
- sink:數據處理結果的目的地
2. 並行數據流
- 在flink中,transformation是由一組operator組成,每一個operator被分割成operator subtask,同一個operator的多個 subtasks在不同的線程、不同的物理機或不同的容器中彼此互不依賴得並行執行。
- Stream在operator有兩種形式
(1) One-to-one:類似於spark中的窄依賴
(2) Redistributing:類似於spark中的寬依賴
3. operator chains
- 出於分布式程序效率考慮,Flink將前后有依賴關系的一組operator的subtask鏈接在一起形成operator chains。operator chain在一個線程中執行,它能減少線程之間的切換和基於緩存區的數據交換,在減少時延的同時提升吞吐量。鏈接的行為可以在編程API中進行指定
4. 窗口概念
flink可以基於窗口對在流上對數據進行聚合操作。flink支持的窗口有:
- 時間窗口(tumbing windows(滾動窗口 不重疊),sliding windows(滑動窗口 有重疊,session windows(有空隙的活動))
- 數據窗口(tumbing windows(滾動窗口 不重疊),sliding windows(滑動窗口 有重疊,session windows(有空隙的活動))
- 事件窗口
5. 時間概念
Stream中的記錄時,記錄中通常會包含各種典型的時間字段,Flink支持多種時間的處理:
- event Time(事件時間):表示事件創建時間
- Ingestion Time(攝取時間):表示事件進入到Flink Dataflow的時間(即流處理器第一次看到這個消息的時間)
- Processing Time(處理時間):表示某個Operator對事件進行處理事的本地系統時間(是在TaskManager節點上)