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


0

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

可能是在 Flink

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

这些参数将被序列化到不同的机器上,似乎不能被不同的操作员共享。我发现这个词组可能接近解决方案。对吗?怎么做?

2 答案


0

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

通常,您应该知道如何设计 job 流以避免需要共享数据,因为这通常会导致并发性和可伸缩性问题。

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

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


0

理论上,当两个子任务(顶点)在同一个任务槽(JVM)中时,它们共享一些内存状态是可能的。但是,通过这种方式构建一些不能正确参与 checkpoints的东西很容易,从而使应用程序在发生故障时容易发生状态丢失。

更好的解决方案是对需要任意 join的用例使用有状态函数。


我来回答

写文章

提问题

面试题