Flink ProcessFunction介绍及KeyedProcessFunction实例
1. ProcessFunction简介
- 转换算子是无法访问事件的时间戳信息和水位线信息的。而这在一些应用场景下,极为重要。例如我们常用的MapFunction转换算子就无法访问时间戳或者当前事件的事件时间。
- 基于此,DataStream API提供了一系列的Low-Level转换算子。可以
访问时间戳
、watermark
以及注册定时事件
。还可以输出特定的一些事件
,例如超时事件
等。 - Process Function用来构建事件驱动的应用以及实现自定义的业务逻辑(使用之前的window函数和转换算子无法实现)。例如,
Flink SQL就是使用Process Function实现的。
- Flink提供了8个Process Function:
- ProcessFunction dataStream
- KeyedProcessFunction 用于KeyedStream,keyBy之后的流处理
- CoProcessFunction 用于connect连接的流
- ProcessJoinFunction 用于join流操作
- BroadcastProcessFunction 用于广播
- KeyedBroadcastProcessFunction keyBy之后的广播
- ProcessWindowFunction 窗口增量聚合
- ProcessAllWindowFunction 全窗口聚合
2. KeyedProcessFunction简单使用
2.1. Java版本
-
CountWithTimestamp.java
package com.xiaofan.flinkstudy.keyedprocessfunction; /** *@author xiaofan *@email 594042358@qq.com *@date 2020/7/7 16:34 *@description 实体类,保存在key状态中 */ public class CountWithTimestamp { public String key; public long count; public long lastModified; }
-
Splitter.java
package com.xiaofan.flinkstudy; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.util.Collector; import org.apache.flink.util.StringUtils; /** *@author xiaofan *@email 594042358@qq.com *@date 2020/7/7 16:33 *@description 通用的FlatMap操作Function */ public class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception { if(StringUtils.isNullOrWhitespaceOnly(s)) { System.out.println("invalid line"); return; } for(String word : s.split(" ")) { collector.collect(new Tuple2<String, Integer>(word, 1)); } } }
-
ProcessTime.java
package com.xiaofan.flinkstudy.keyedprocessfunction; import com.xiaofan.flinkstudy.Splitter; import org.apache.flink.api