我正在研究Flink一个多星期了。我们正在处理来自Kafka的事件,我们希望事件属于特定对象id,需要按事件时间顺序处理。到目前为止,我的研究告诉我,我应该使用keyby和timeWindows,我的理解是否正确?
另一个问题,当一个任务管理器关闭时,只有那些事件属于该任务管理器才会被停止处理,直到任务管理器出现?检查点机制是否知道未处理的事件,它将如何向Kafka请求这些事件?
问题与下面的用例
在CallCenter中,座席将接收呼叫并进入不同的状态。对于代理的每个操作,如登录,空闲,忙碌等,我们通过Kafka将该操作的代理事件作为状态。要求是我们必须按代理顺序处理事件,我们无法在登录事件之前处理代理空闲事件。我们需要按顺序处理这些,同时我们需要扩展。
在具有并行进程的Flink集群中,我们不应该最终处理具有代理的不良状态的不同分区/ TaskSlots中的代理信息。我的问题是keyBy agentId会将流划分为子流并始终在指定的分区中处理它们,这样就保持了事件处理的顺序。
另一个问题是,如果有一个异常/任务管理器关闭处理特定代理数据的分区,Flink知道如何在恢复后仅请求那些代理事件。
您将需要使用keyBy(objectId)按对象ID对流进行分区。
如果必须按事件时间对流进行排序,则有几个选项。您可以使用窗口创建在ProcessWindowFunction中排序(批量)的批量事件,也可以使用KeyedProcessFunction创建连续有序流。
Flink中的检查点是全球性的。它们包括Kafka中的偏移以及分布式集群中的所有状态,这些状态是由于输入摄取到这些偏移所致。恢复涉及重新启动集群,恢复集群的状态,将Kafka使用者倒带到检查点中记录的偏移量,并从该点重放事件。请注意,如果您的接收器不是事务性的,则可能导致写入重复的结果。
更新:
如果每个密钥的所有数据只在一个Kafka分区中,并且您的数据已经在Kafka中排序(不是全局排序,但在每个密钥内),那么Flink将保留该排序,即使您执行了keyBy 。这是有效的,因为任何给定的Kafka分区仅由Flink Kafka源的一个实例使用。
至于第二个问题,如果只有一个任务管理器失效并不重要。所有任务管理器都将重新启动,它们将全部倒回并从最近检查点中存储的偏移量恢复处理。检查点是全局的,跨越整个集群 - 不支持部分恢复。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。