如何解决如何在不同的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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。