Apache flink Flink和recovery中事件处理的顺序

Apache flink Flink和recovery中事件处理的顺序,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,我正在研究Flink一个多星期了。我们正在使用来自Kafka的事件,我们希望事件属于特定的对象id,并且需要按照事件时间的顺序进行处理。到目前为止,我的研究告诉我,我应该使用keyby和timeWindows,我的理解正确吗 另一个问题,当一个taskmanager出现故障时,只有属于该taskmanager的事件才会停止处理,直到taskmanager出现为止?检查点机制是否知道未被处理的事件,它将如何请求Kafka处理这些事件 下面有用例的问题 在呼叫中心,代理将接收呼叫并进入不同的状态。对

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

另一个问题,当一个taskmanager出现故障时,只有属于该taskmanager的事件才会停止处理,直到taskmanager出现为止?检查点机制是否知道未被处理的事件,它将如何请求Kafka处理这些事件

下面有用例的问题

在呼叫中心,代理将接收呼叫并进入不同的状态。对于代理的每个操作,比如登录、空闲、忙碌等,我们通过Kafka获得该操作的代理事件状态。要求我们必须按代理顺序处理事件,不能在登录事件之前处理代理空闲事件。我们需要按顺序处理这些问题,同时我们需要扩大规模

在具有并行进程的Flink集群中,我们不应该在代理状态不好的情况下处理不同分区/任务槽中的代理信息。我的问题是keyBy agentId会将流划分为子流,并始终在指定的分区中处理它们,这样可以保持事件处理的顺序

另外,另一个问题是,如果处理特定代理数据的分区出现异常/任务管理器故障,Flink如何知道在恢复后只请求这些代理事件。

您将希望使用keyBy(objectId)按对象id对流进行分区

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

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

更新:

如果每个键的所有数据仅在一个Kafka分区中,并且您的数据已在Kafka中排序(不是全局排序,而是在每个键中),则Flink将保留该顺序,即使您执行了keyBy。这是因为任何给定的卡夫卡分区只被Flink Kafka源的一个实例使用

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

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

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

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

更新:

如果每个键的所有数据仅在一个Kafka分区中,并且您的数据已在Kafka中排序(不是全局排序,而是在每个键中),则Flink将保留该顺序,即使您执行了keyBy。这是因为任何给定的卡夫卡分区只被Flink Kafka源的一个实例使用


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

感谢David的回答。我已经修改了这个问题以添加我的用例,如果您需要更多信息,请告诉我。谢谢David的回答。我已经修改了这个问题以添加我的用例,如果您需要更多信息,请告诉我。