如何实时计算每个事件的最后2个小时的计数?

时间:2018-03-14 11:40:01

标签: apache-flink flink-streaming

我们正在使用Flink来监控每个事件。详细信息场景是当事件到达时,flink在过去2小时内找到具有相同用户ID的所有事件并将计数字段求和。例如:

    event1<userid1, n1, t0>     -> real time result = n1
    event2<userid2, n2, t0+1h>  -> real time result = n2
    event3<userid1, n3, t0+1h>  -> real time result = n1+n3
    event4<userid1, n4, t0+2.5h>  -> real time result = n3+n4

我们怎样才能在flink中实现这样的场景?直觉上,我们想使用滑动窗口,但有两个问题:

  1. 在flink中,通过参数slide_size滑动窗口滑动。 但是,在我们的场景中,每个事件的窗口幻灯片,其中 表示每个窗口的开始/结束点不同 事件(预期窗口范围:[eventtime-2h,eventtime))。我们应该通过设置一个小的slide_size(10ms?)来实现这个吗?
  2. 过程功能由触发功能执行,这意味着一旦事件到达我们就无法立即得到结果?

2 个答案:

答案 0 :(得分:0)

您可以继续使用滑动窗口,但使用您自己的Trigger来发出到达窗口的元素。示例代码可能如下:

src.map(x => new Tuple2(x.id, x.value))
  .keyBy(0)
  .timeWindow(Time.seconds(2), Time.seconds(1))
    .trigger(new Trigger[Tuple2[String, Int], TimeWindow] {
      override def onEventTime(time: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
        TriggerResult.CONTINUE
      }

      override def onProcessingTime(time: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
        TriggerResult.FIRE
      }

      override def clear(window: TimeWindow, ctx: Trigger.TriggerContext): Unit = {
      }

      override def onElement(element: Tuple2[String, Int], timestamp: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
        TriggerResult.FIRE
      }
    })
  .sum(1)

答案 1 :(得分:0)

您可以使用ProcessFunction来实现此目的。 Here是详细信息。