Apache flink 生成;心跳“;键入事件以向前推送事件时间

Apache flink 生成;心跳“;键入事件以向前推送事件时间,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在构建一个Flink流媒体应用程序,并且更喜欢使用事件时间,因为它将确保在历史数据出现故障或重播时,所有设置的计时器都将决定性地触发。事件时间的问题在于,只有当事件发生时,时间才会向前移动。我们的数据源(物理传感器)有时产生的数据很少,因此有时单个数据点可能会打开一个5分钟的聚合窗口,但下一个数据点会在20分钟后关闭,因此窗口会很晚关闭并发出输出记录 我们提出的解决方案是使用AWS lambda函数,该函数计划每X分钟运行一次,将一个虚拟事件输出到Flink读取的Kinesis流中,从而强制

我正在构建一个Flink流媒体应用程序,并且更喜欢使用事件时间,因为它将确保在历史数据出现故障或重播时,所有设置的计时器都将决定性地触发。事件时间的问题在于,只有当事件发生时,时间才会向前移动。我们的数据源(物理传感器)有时产生的数据很少,因此有时单个数据点可能会打开一个5分钟的聚合窗口,但下一个数据点会在20分钟后关闭,因此窗口会很晚关闭并发出输出记录

我们提出的解决方案是使用AWS lambda函数,该函数计划每X分钟运行一次,将一个虚拟事件输出到Flink读取的Kinesis流中,从而强制生成一个水印,使时间提前

我担心的是,只有当水印是真正全局的时,这才有效,这意味着单个心跳消息可以导致创建一个水印,该水印可以提前Flink应用程序中每个操作员/任务的事件时间,该应用程序使用源自此流的数据。这些文档让我相信,Flink将从一个源进行parellizes读取,其中每个并行读取操作符生成自己的水印,然后一个下游操作符(比如一个窗口)获取它所看到的各种水印的最小值。如果是这种情况,这对我来说似乎有问题,因为每个并行水印生成器都需要一个虚拟心跳事件,但我无法控制哪些节点从流中读取心跳消息

所以,我的问题是,下游运营商如何准确地使用水印来提前事件时间,是否可以向kinesis流中添加一条伪消息来提前整个Flink应用程序的事件时间


如果没有,我如何才能强制活动时间向前移动?

你说得对;这里有一个问题。
boundedAutofordernessTimestampExtractor
实现的标准周期性水印生成器依赖于看到时间戳较大的新事件来推进水印

有几种方法可以解决此问题:

  • 在并行度为1的任务中运行源和水印赋值器(如果需要,然后增加管道其余部分的并行度)。这样一条心跳信号就足够了

  • 广播心跳信息。这样,每个并行实例都将接收它们,它们都可以推进水印

  • 与心跳消息不同,实现一个水印生成器,该生成器使用处理时间计时器在缺少传入事件的情况下人工推进水印。有关示例,请参见

  • 请注意,第三种方法不太可取,因为它与处理时间产生耦合,消除了纯事件时间方法的一些核心优势

    如果使用心跳信号源,则需要为另一个(有时为空闲)返回MAX_水印的源实现水印生成器。否则,来自该流的水印将保留整个水印


    此外,AWS Lambda让人感觉有点过头了。您可以实现一个简单的自定义Flink源来创建心跳事件。

    您是对的;这里有一个问题。
    boundedAutofordernessTimestampExtractor
    实现的标准周期性水印生成器依赖于看到时间戳较大的新事件来推进水印

    有几种方法可以解决此问题:

  • 在并行度为1的任务中运行源和水印赋值器(如果需要,然后增加管道其余部分的并行度)。这样一条心跳信号就足够了

  • 广播心跳信息。这样,每个并行实例都将接收它们,它们都可以推进水印

  • 与心跳消息不同,实现一个水印生成器,该生成器使用处理时间计时器在缺少传入事件的情况下人工推进水印。有关示例,请参见

  • 请注意,第三种方法不太可取,因为它与处理时间产生耦合,消除了纯事件时间方法的一些核心优势

    如果使用心跳信号源,则需要为另一个(有时为空闲)返回MAX_水印的源实现水印生成器。否则,来自该流的水印将保留整个水印


    此外,AWS Lambda让人感觉有点过头了。您可以实现一个简单的自定义Flink源来创建心跳事件。

    更具体地说,我的应用程序从单个流读取。它从该流中获取事件,反序列化它们,分配时间戳并生成水印,按设备id为它们设置密钥,然后将它们发送到ProcessFunction()。我希望能够发送一条心跳消息,创建一个水印,使每个KeyedProcessFunction的事件时间提前,以确保我在KeyedProcessFunction中注册的计时器不会延迟太多处理时间。此心跳消息本质上有一个事件\u时间戳,但其设备\u id字段将为空。它从该流中获取事件,反序列化它们,分配时间戳并生成水印,按设备id为它们设置密钥,然后将它们发送到ProcessFunction()。我希望能够发送一条心跳消息,创建一个水印,使每个KeyedProcessFunction的事件时间提前,以确保我在KeyedProcessFunction中注册的计时器不会延迟太多处理时间。此心跳消息本质上有一个事件\u时间戳,但其设备\u id字段将为空