Flink學習筆記:Operators之Process Function


本文為《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到來時觸發。

 

 

 


免責聲明!

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



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