函数类
Flink的Java实现中一般使用函数式接口的形式定义针对不同功能的函数(此处称为函数更形象一些),用户通过继承、实现、匿名内部类、Lambda表达式的方式自定义自己的函数实现。我们比较常用的函数类接口有:算子函数(MapFunction、CoMapFunction、MapPartitionFunction等)、富函数(RichFunction)等。
算子函数
我们使用算子对数据进行转换的时候,除了可以使用Flink提供的一些算子函数的实现来转换我们的数据之外,还可以通过继承、实现、匿名内部类、Lambda表达式的方式自定义自己的算子函数实现,下面看例子:
1、通过实现算子接口自定义自己的数据处理方法
2、通过Lambda表达式实现
3、如果要使用Flink提供的功能,可以直接new一个对象传进算子即可,如果有自定义参数要传入,可以通过构造方法传进去。
以上就是如何自定义函数实现自己的处理需求。
富函数
很多时候我们需要在函数处理第一条记录之前进行一些初始化工作或是取得函数执行相关上下文信息,Flink提供了一类富函数接口,他和我们前面讲的算子函数这类普通函数相比可以对外提供更多功能(DataStream API中所有的算子函数都有对应的富函数)。富函数的使用位置和普通函数以及Lambda函数相同。它们可以像普通函数类一样接收参数。Flink提供的富函数的命名规则是以Rich开头,后面跟着普通转换函数的名字,例如:RichMapFunction、RichFlatMapFunction等,如果我们要对这些转换函数自定义富函数,只需要继承这些富函数就可。
在使用富函数的时候,我们可以对应函数的声明周期实现两个额外的方法:
open(Configuration parameters):它是富函数中的初始化方法,它在每个任务首次调用转换方法前调用一次,后续不在调用。所以它被用来执行那些只需进行一次的设置工作,所以你知道了它的入参为什么是Configuration参数,但是注意Configuration参数只在DataSet API中使用而并没有在DataStream API中使用到。在DataStream API中我们更多的是使用getRuntimeContext()方法。
close():它作为函数的终止方法,会在每个任务最后一次调用转换方法后调用一次,通常用于清理和释放资源,例如关闭和外部系统的连接、清空状态实例等。
在富函数中我们常用到一个方法getRuntimeContext()方法,该方法会获取到RuntimeContext对象,从运行时上下文对象中我们可以获取到一些信息:函数并行度、函数所在子任务编号以及执行函数的名称,同时他还提供访问分区状态的方法。