当前位置: 首页 > 知识库问答 >
问题:

断开连接情况下的Flink事件时间处理

丁经国
2023-03-14

Flink在这里提供了一个示例:https://www.ververica.com/blog/stream-processing-introduction-event-time-apache-flink这描述了这样一个场景:有人在玩游戏,由于subway而失去连接,然后当他重新联机时,所有数据都恢复了,可以进行排序和处理。

我的理解是,如果有更多的球员,有两种选择:

>

  • 所有其他的将被延迟,等待该用户恢复连接并发送数据,允许推送水印;

    该用户被分类为空闲用户,允许水印向前移动,当他连接时,他的所有数据将进入最新的数据流;

    我希望有以下选项:每个用户都独立处理,其会话窗口都有自己的水印。理想情况下,我甚至会使用摄取时间(因此,当他恢复连接时,我会将所有数据放入一个唯一的会话中,该会话将在会话关闭后按事件时间戳排序),并且我正在处理的窗口的当前时间和最后一个时间戳(摄取)之间会有一个间隙(会话窗口根据终止会话的时间间隙来保证这一点);我也不希望一旦一个用户失去连接,水印就会被卡住,我也不想管理空闲状态:只需继续正常处理所有其他事件,一旦该用户回来,不要将任何数据归类为延迟数据,因为与用户失去连接的时刻相比,水印在时间上提前了;

    我如何实现上面的要求?由于水印是全局的,我一直很难在没有这样的场景中工作。每个键都没有水印有一个简单的解释吗?

    提前谢谢你!

  • 共有1个答案

    郎德馨
    2023-03-14

    Flink最直接支持这一点的水印可能是对每Kafka分区水印的支持——这并不是您所描述情况的实际解决方案(因为每个用户都有Kafka分区是不现实的)。

    可以做的是简单地忽略水印,并使用KeyedProcessFunction自己实现逻辑。

    顺便说一句,最近在每个密钥粒度水印支持主题下的flink-user和flink-dev邮件列表上都有一个关于这个的线程。

     类似资料:
    • 我有一个用例,我想我需要一些关于如何处理它的帮助。因为我是流媒体和Flink的新手,所以我会尽量描述我想要实现的目标。对不起,如果我没有使用正式和正确的语言。 我的代码将用java编写,但我不想用python编写代码,也不想用伪代码或方法编写代码。 TL: DR 在某个时间限制内对同一密钥的事件进行分组 背景: 我有来自传感器的数据,就像Kafka的数据流一样。 我需要使用eventTime,因为

    • 请检查上面的代码,并告诉我是否做得正确。在事件时间和水印分配之后,我想在process函数中处理流,其中我将为不同的密钥收集10分钟的流数据。

    • 总之,我希望flatMap1()和flatMap2()按照我在事件中设置的时间戳的顺序被调用。但那不是真的。

    • 我试图使用process函数对一组事件进行处理。我正在使用事件时间和键控流。我面临的问题是,水印值始终为9223372036854725808。我已经对print语句进行了调试,它显示如下: 时间戳------1583128014000提取时间戳1583128014000当前水印------9223372036854775808 时间戳------1583128048000提取时间戳1583128

    • 查看Flink的留档和书籍,我对时间戳有疑问:如果流设置为事件时间模式,这意味着时间戳在进入Flink之前具有源的时间(甚至在通过消息传递队列之前,可能是Kafka),为什么Flink将时间戳作为元数据附加到记录中?幻灯片3根据它们所占的内容具有不同类型的时间戳:https://www.slideshare.net/dataArtisans/apache-flink-training-time-a

    • null 此窗口具有一个允许延迟为一分钟的BoundedOutoFordernesTimeStampExtractor。 水印:据我的理解,Flink和Spark结构化流中的水印定义为(max-event-timestamp-seen-so-far-alloged-lateness)。事件时间戳小于或等于此水印的任何事件都将被丢弃并在结果计算中忽略。 在此场景中,几个事件到达Flink运算符时具有