目录
一、KeyedProcessFunction功能介绍
KeyProcessFunction是一个低级的Stream处理操作(Operator),可以更加灵活的处理Stream的业务逻辑,它可以访问所有流应用程序的基本构建块:
- 事件(Event)
- 状态(State,仅支持KeyedStream)
- 计时器(支持EventTimeTimer(事件时间定时器)和ProcessingTimeTimer(处理时间定时器),仅支持KeyedStream)
KeyProcessFunction的方法介绍:
- processElement(I value, Context ctx, Collector<O> out)
参数1:每个Element元素对象
参数2:为KeyedProcessFunction中定义的上下文对象
参数3:收集器
- onTimer(long timestamp, OnTimerContext ctx, Collector<O> out)
参数1:触发定时器的时间
参数2:定时器的上下文
参数3:收集器,一般收集定时器触发后的数据。
知识点:
- ctx.timerService().registerEventTimeTimer 同一个key窗口内,设置多个定时器会触发多次onTimer,不会覆盖
- 如果设置了watermark,需要取数据事件时间 - watermark时间 > 注册时间,才会触发onTimer方法
二、使用案例
案例一:
需要获取用户15分钟后未浏览商品页面,需要将这个用户捞出,给这些用户推送一些优惠商品
这个场景,可以使用SessionWindows.withGap基于Event Time来做,但是有个问题,如果基于Event Time,在下一条水印没来到,不会触发当前定时器,假设在凌晨2点到4点,没有用户的日志行为,那么在凌晨1点45分到2点之间的符合条件的用户,就不会捞出。这个问题我们后来采用了ProcessingTimeTrigger来进行触发计算。
其实这个功能可以用KeyProcessFunction实现,比SessionWindows.withGap实现起来更加灵活,案例如下:
- EventTimeFunctionCase
/**
* 以事件事件为例:
* 需要获取用户2分钟后未浏览商品页面,需要将这个用户捞出,给这些用户推送一些优惠商品。
*
* 数据
* 411,page1,1578466369000 08:11:00
* 411,page1,1578269580000 08:13:00
* 411,page1,1578269760000 08:16:00
* 411,page1,1578271800000 08:50:00
*/
object EventTimeFunctionCase {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val properties = new Properties()
properties.setProperty("bootstrap.servers", "localhost:9092")
properties.setProperty("zookeeper.connect", &