Flink處理遲到的數據


每隔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節點上)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM