开发者社区> 问答> 正文

Flink和恢复中的事件处理顺序

我正在研究Flink一个多星期了。我们正在处理来自Kafka的事件,我们希望事件属于特定对象id,需要按事件时间顺序处理。到目前为止,我的研究告诉我,我应该使用keyby和timeWindows,我的理解是否正确?

另一个问题,当一个任务管理器关闭时,只有那些事件属于该任务管理器才会被停止处理,直到任务管理器出现?检查点机制是否知道未处理的事件,它将如何向Kafka请求这些事件?

问题与下面的用例

在CallCenter中,座席将接收呼叫并进入不同的状态。对于代理的每个操作,如登录,空闲,忙碌等,我们通过Kafka将该操作的代理事件作为状态。要求是我们必须按代理顺序处理事件,我们无法在登录事件之前处理代理空闲事件。我们需要按顺序处理这些,同时我们需要扩展。

在具有并行进程的Flink集群中,我们不应该最终处理具有代理的不良状态的不同分区/ TaskSlots中的代理信息。我的问题是keyBy agentId会将流划分为子流并始终在指定的分区中处理它们,这样就保持了事件处理的顺序。

另一个问题是,如果有一个异常/任务管理器关闭处理特定代理数据的分区,Flink知道如何在恢复后仅请求那些代理事件。

展开
收起
flink小助手 2018-12-13 13:55:05 2669 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    您将需要使用keyBy(objectId)按对象ID对流进行分区。

    如果必须按事件时间对流进行排序,则有几个选项。您可以使用窗口创建在ProcessWindowFunction中排序(批量)的批量事件,也可以使用KeyedProcessFunction创建连续有序流。

    Flink中的检查点是全球性的。它们包括Kafka中的偏移以及分布式集群中的所有状态,这些状态是由于输入摄取到这些偏移所致。恢复涉及重新启动集群,恢复集群的状态,将Kafka使用者倒带到检查点中记录的偏移量,并从该点重放事件。请注意,如果您的接收器不是事务性的,则可能导致写入重复的结果。

    更新:

    如果每个密钥的所有数据只在一个Kafka分区中,并且您的数据已经在Kafka中排序(不是全局排序,但在每个密钥内),那么Flink将保留该排序,即使您执行了keyBy 。这是有效的,因为任何给定的Kafka分区仅由Flink Kafka源的一个实例使用。

    至于第二个问题,如果只有一个任务管理器失效并不重要。所有任务管理器都将重新启动,它们将全部倒回并从最近检查点中存储的偏移量恢复处理。检查点是全局的,跨越整个集群 - 不支持部分恢复。

    2019-07-17 23:20:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载