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

断开连接情况下的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

    • 问题内容: StackExchange.Redis的“ 基本用法”文档解释说,该方法是长期存在的,有望重新使用。 但是,当与服务器的连接断开时该怎么办?是否自动重新连接,或者是否有必要像此答案一样编写代码(引用该答案): 上面的代码是处理断开连接恢复的好方法,还是实际上会导致多个实例?同样,该属性应如何解释? [另外:我相信上面的代码是惰性初始化的一种非常糟糕的形式,尤其是在多线程环境中-请参阅