总览
一般对于一个flink任务有四个步骤:
获取执行环境 -> source(源算子)-> transformation(转换操作)->sink(输出)
执行环境
关于执行环境部分,默认一个main方法可以有多个execute,但是没有意义,因为执行到第一个是就已经阻塞
env.executeAsync()可以异步触发,不进行阻塞
source-数据源
数据源中数据在flink中会解析为POJO对象,如果没有按照POJO来定义,Flink当作泛型类进行处理,Flink无法获取到它们内部属性;它们不是由flink本身序列化,由kryo序列化的。
Flink POJO类型要求
类是共有的(public)
有一个无参的构造方法
所有属性都是共有的(public)
所有属性的类型都是可以序列化的
转化操作
转换操作通常使用转换算子进行实现
map 1对1 映射
filter 过滤
flatmap 1对多 映射
keyby keyby不是一个转换算子,keyby是对数据进行分组,保证相同key的数据在同一个分区。分区:一个子任务可以可以理解为同一个分区,一个分区中可能存在0到多个分组。
聚合算子,一般跟在keyby后调用的算子,一般常用的有sum,max,min。max/maxby 对于max只会取比较字段的最大值,非比较字段保留第一次的指,maxby,取比较字段的最大值,非比较字段也会取最大值那条数据的其他属性。
聚合算子(reduce):也是跟在keyby之后,
复函数():多了生命周期管理方法:open()\close()
物理重分区:
shuffle()-随机分区
rebalance()->轮询分区(完成负载均衡,防止数据倾斜)
rescale() 缩放:实现轮询,局部组队,比rebalance更高效
broadcast() 广播:发送给下游的所有子任务
global 全局:数据全部发往第一个子任务
keyby() 指定key去发送
one-to-one forward分区器
自定义分区器
数据分流:使用filter也能完成数据分流,但是相当于一条数据会被处理两边,会影响数据处理的性能;使用侧输出流则保证处理一次。
数据合流(union):前提是数据类型要一致;一次可以合并多条流;
数据连接(connect):两个流连接之后得到的不再是datastreamsource 而是一个 connectedStreams
数据输出
输出的对象是数据流,
分桶是分目录
必须开启checkpoint,否则一直是.inprogress
输出到mysql中需要注意点:连接超时问题,需要为mysql连接时设置超时时间。
自定义sink比较中的方法是对于invoke的实现,每条数据来了都会调用一次,如果仅在初始时调用一次这种应该实现open接口,