Flink函数与算子
Flink 函数与算子
富函数:
-
Flink的每个算子都有对应的富函数,该函数中有更多的方法,如生命周期管理方法open()、close()。运行时上下文RuntimeContext可以用来获取环境变量、状态(累加器、计数器...等很多)。
说明:如果是读文件每个并行实例为了确保不是异常退出而是文件的正常结束会多执行一次close()方法。状态的对象需要通过富含数中的Context对象来获取。
Process函数:
- Process函数是一个比较底层的函数,基本上所有的算子都可以调用,并且可以通过process函数来使用测输出流。
分区函数:
-
KeyBy:是按照当前数据的key的hash值进行重分区。
KeyBy底层原理:先对key调用一次hashCode方法获取hash值,然后再对当前hash值调用murmurhash算法获取二次hash值,将最终获取到hash值对默认最大并行度128取模得到keyGroupId然后用KeyGroupId乘以下游算子并行度,再除以默认最大并行度128。
-
Shuffle:对流中的元素随机分区。
-
Recalse: 均分式的局部轮询的方式发,可以有效的减少网络IO,比rebalance效率更高。
-
Rebanance: 全局轮询,可以用来解决数据倾斜。
聚合算子:
聚合算子都是KeyStream中的算子,必须在KeyBy之后调用。
- Reduce:Reduce算子的输入输出类型必须一致,不能设置具体的返回值类型,并且当分组内只有一条数据时不会调用reduce算子,会跳过reduce算子直接调用其他算子。
- Connect:两个流中存储的数据类型可以不同,但只是机械的合并在一起,内部仍然是分离的2个流,并且只能连接两个流。
- Union:将多个类型必须相同流进行Union操作,产生一个包含所有DataStream元素的新DataStream。
函数补充:
-
使用Lambda不一定存在类型擦除,只有使用泛型时才会存在类型擦除,此时需要通过returnc()指定返回数据的类型。
-
Volatite修饰符,保证不同线程读到同一个变量是一致的,必须是静态的变量。
-
Flink自己实现了一套数据TypeInformation抽象类型,实现了序列化与反序列化方式。
-
Flink内部提供了二元组tuple类型。
-
OOM内存溢出是一种现象,内存泄漏是造成内存溢出的一种原因。
-
Interval Join原理:
-
底层使用了connect进行关联,关联条件就是每条流keyby之后的Key。
-
判断数据是否迟到,如果迟到就不处理 => 事件时间 < 当前watermark 就是迟到 (以小的为准)
-
左流和右流,都初始化了一个 MapState,数据来的时候,会添加进去,Key是ts,Value是 List(数据)
-
遍历 对方 的 buffer, 判断时间是否落在区间内,如果落在区间内,匹配上,发送到用户定义的 ProcessElement方法
左流.intervalJoin(右流)
左ts + 下界 <= 右 ts <= 左ts + 上界
右ts - 上界 <= 左 ts <= 右ts - 下界 -
注册一个定时器,去清理 MapState
左流的清理时间 = 左ts + 上界
右流的清理时间 = 右ts - 下界
-