如何在不同的Flink运算符中访问相同的变量

问题描述

我有一个收藏,例如val m = ConcurrentMap(),通常我可以使用以它为参数的方法,并且不同的线程可以调用传递相同的m方法

可能是

val s = StreamExecutionEnvironment.getExecutionEnvironment
s.addSource(new MySource(m))
      .map(new MyMap(m))
      .addSink(new MySink(m))

这些参数将被序列化到不同的计算机,并且似乎无法由不同的操作员共享。我发现ColocationGroup可能接近解决方案。这样对吗?怎么做?

解决方法

由于操作员的每个实例都可以在单独的JVM中运行,因此无法在操作员之间甚至在相同操作员的并行子任务之间共享内存中的数据结构。

通常,您会想出如何设计工作流以避免共享数据的方法,因为这通常会导致并发性和可伸缩性问题。

如果不能使用数据分区来消除每个子任务都能看到所有数据的要求,则可以使用广播流来确保操作员的每个子任务获得相同的数据。

最坏的情况是,您为此数据映射使用了一些共享数据存储(Cassandra,HBase等),但是几乎总是可以通过重新设计工作流来避免这种情况。

,

从理论上讲,当两个子任务(顶点)在同一任务插槽(JVM)中时,可以让它们共享一些内存中状态。但是,以这种方式构建不正确参与检查点的事情很容易,从而使您的应用程序在发生故障时容易遭受状态丢失。

更好的解决方案是在需要任意连接的用例中使用Stateful Functions