本文為《Flink大數據項目實戰》學習筆記,想通過視頻系統學習Flink這個最火爆的大數據計算框架的同學,推薦學習課程:
Flink大數據項目實戰:http://t.cn/EJtKhaz
1. Process Function
1.1分層API
Flink提供三層API. 每個API在簡潔性和表達之間提供不同的權衡,並針對不同的用例
1.SQL/Table API (dynamic tables)
2.DataStream API(streams, windows)
3.ProcessFunction(event,state,time)
1.2ProcessFunction
不要跟ProcessWindowFunction混為一談。
ProcessFunction是一個低階的流處理操作,它可以訪問流處理程序的基礎構建模塊:
1.事件(event)(流元素)。
2.狀態(state)(容錯性,一致性,僅在keyed stream中)。
3.定時器(timers)(event time和processing time, 僅在keyed stream中)。
ProcessFunction可以看作是一個具有keyed state 和 timers訪問權的FlatMapFunction
1.通過RuntimeContext訪問keyed state 。
2.計時器允許應用程序對處理時間和事件時間中的更改作出響應。對processElement(…)函數的每次調用都獲得一個Context對象,該對象可以訪問元素的event time timestamp和TimerService。
3.TimerService可用於為將來的event/process time瞬間注冊回調。當到達計時器的特定時間時,將調用onTimer(…)方法。在該調用期間,所有狀態都再次限定在創建計時器時使用的鍵的范圍內,從而允許計時器操作鍵控狀態。
1.3低階join(CoProcessFunction)
CoProcessFunction實現對兩個輸入的低階操作,它綁定到兩個不同的輸入流,分別調用processElement1(…)和processElement2(…)對兩個輸入流的數據進行處理。
實現低階join通常遵循此套路:
1.為一個(或兩個)輸入創建一個狀態對象。
2.當從輸入源收到元素時,更新狀態。
3.從另一個輸入接收元素后,檢索狀態並生成連接的結果。
1.4KeyedProcessFunction
KeyedProcessFunction作為ProcessFunction的擴展,在其onTimer(…)方法中提供對定時器對應key的訪問。
2. Timers
2.1TimerService
processing-time/event-time timer都由TimerService在內部維護並排隊等待執行,僅在keyed stream中有效。
由於Flink對(每個key+timestamp)只維護一個計時器。如果為相同的timestamp注冊了多個timer ,則只調用onTimer()方法一次。
Flink保證同步調用onTimer()和processElement() 。因此用戶不必擔心狀態的並發修改。
2.2容錯
Timer具有容錯和checkpoint能力(基於flink app的狀態)。從故障恢復或從savepoint啟動應用程序時,Timer將被恢復。
大量計時器會增加檢查點時間,因為計時器是檢查點狀態的一部分。
2.3計時器合並
由於Flink對每個鍵和時間戳只維護一個計時器,因此可以通過降低計時器頻率來合並計時器,從而減少計時器的數量。 event-time timer只會在watermarks到來時觸發。