Apache flink 具有多重并行性的Flink映射函数,以及如何确定最终接收器的顺序

Apache flink 具有多重并行性的Flink映射函数,以及如何确定最终接收器的顺序,apache-flink,Apache Flink,管道简单代码如下所示: source = env.addSource(kafkaConsumer) .map(func).setParallelism(2).sink() 如何确保out的顺序?首先,假设示例中的所有其他内容都具有1的并行性,并且只有map函数将并行运行。(尽管要真正实现这一点,必须在某个地方进行配置;默认并行度高于1。) 我们还假设您的Kafka使用者正在使用一个分区阅读单个主题,并且您正在询问如何实现并行转换以保留输入中存在的顺序 根据这些假设,答案是你能做的不多。map操

管道简单代码如下所示:

source = env.addSource(kafkaConsumer)
.map(func).setParallelism(2).sink()

如何确保out的顺序?

首先,假设示例中的所有其他内容都具有1的并行性,并且只有map函数将并行运行。(尽管要真正实现这一点,必须在某个地方进行配置;默认并行度高于1。)

我们还假设您的Kafka使用者正在使用一个分区阅读单个主题,并且您正在询问如何实现并行转换以保留输入中存在的顺序

根据这些假设,答案是你能做的不多。map操作符的两个实例之间存在竞争,非并行接收器将以任意方式交错这两个传入流

如果流记录以某种方式标记,比如使用递增的时间戳或ID,那么您可以假设引入一些缓冲并重新建立原始顺序,或者在自定义接收器中,或者在map和接收器操作符之间的非并行RichCoMap函数中


另一方面,如果您的源以某种方式进行了分区或设置了密钥,并且您只需要在每个密钥的基础上维护或建立排序,那么就有更好的答案

非常感谢。我终于发现异步函数是我最好的解决方案。