富函数是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 方法中初始化资源@Overridepublic void open(Configuration config) throws Exception {super.open(config);// 初始化代码,例如从配置中读取参数,或者打开文件等System.out.println("Initializing MyRichMapFunctionWithOpenClose");}// map 方法用于定义转换逻辑@Overridepublic Tuple2<String, Integer> map(Tuple2<String, Integer> value) throws Exception {// 转换逻辑return new Tuple2<>(value.f0, value.f1 * 2); // 示例:将整数部分翻倍}// 可以在 close 方法中清理资源@Overridepublic void close() throws Exception {// 清理代码,例如关闭文件,释放资源等System.out.println("Cleaning up MyRichMapFunctionWithOpenClose");super.close();} }
根据编写的代码查看类关系图如图1,绿色虚线代表实现一个接口,绿色实线代表继承一个类,蓝色实线代表继承一个抽象类。