富函數是DataStream API提供的函數接口,Flink的函數都有它的Rich版本,它與其他函數不同的是,富函數可以獲取到運行環境上下文,初始化參數,擁有生命週期方法等,可通過它進行自定義複雜功能。我們常見的如RichMapFunction、RichFilterFunction等。
富函數的生命週期主要通過重寫三個方法來實現。
(1)提供open()方法,它是 rich function 的初始化方法,當一個算子例如 map 或者 filter被調用之前 open()會被調用。
(2)close()方法是生命週期中的最後一個調用的方法,做一些清理工作。
(3)getRuntimeContext()方法提供了函數的 RuntimeContext 的一些信息,例如函數執行的並行度,任務的名字,以及 state 狀態。
具體java代碼使用可參考:
public class MyRichMapFunction extends RichMapFunction<Tuple2<String, Integer>, Tuple2<String, Integer>> { // 可以在 open 方法中初始化資源 @Override public void open(Configuration config) throws Exception { super.open(config); // 初始化代碼,例如從配置中讀取參數,或者打開文件等 System.out.println("Initializing MyRichMapFunctionWithOpenClose"); } // map 方法用於定義轉換邏輯 @Override public Tuple2<String, Integer> map(Tuple2<String, Integer> value) throws Exception { // 轉換邏輯 return new Tuple2<>(value.f0, value.f1 * 2); // 示例:將整數部分翻倍 } // 可以在 close 方法中清理資源 @Override public void close() throws Exception { // 清理代碼,例如關閉文件,釋放資源等 System.out.println("Cleaning up MyRichMapFunctionWithOpenClose"); super.close(); } }
根據編寫的代碼查看類關係圖如圖1,綠色虛線代表實現一個接口,綠色實線代表繼承一個類,藍色實線代表繼承一個抽象類。