KeyedProcessFunction功能详解与状态算子State结合实战(附github两个实战案例源码)

本文详细介绍了Flink的KeyedProcessFunction,包括其功能、方法和使用案例。KeyedProcessFunction提供了事件处理、状态管理和计时器支持。案例一展示了如何在处理用户行为时避免SessionWindows的限制,而案例二则演示了如何利用KeyProcessFunction计算广告每小时的点击用户数,处理数据滞后问题。文章提供了完整的GitHub源码供读者参考学习。
摘要由CSDN通过智能技术生成

目录

一、KeyedProcessFunction功能介绍

二、使用案例

案例一:

案例二:


一、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", &
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值