Beam DoFn跨JVM共享的静态变量

问题描述 投票:1回答:1

所以,我试图找出Beam DoFn中静态变量的行为,是否在线程之间共享(在同一JVM中)?

基本上是试图从编程指南中了解以下内容:

4.3.2。线程兼容性…请注意,函数对象中的静态成员不会传递给工作程序实例,并且多个您的函数实例可以从不同的线程访问。

https://beam.apache.org/documentation/programming-guide/#requirements-for-writing-user-code-for-beam-transforms

现在,似乎以下静态对象“计数器”已初始化,序列化并应用到工作程序(Flink引擎)中,是否与上述语句对齐?

如果工作线程属于不同的进程/ JVM,则显然不会共享。但是,如果使用相同的JVM,将共享“计数器”吗?

public class myTransform extends DoFn<KV<String >,String> implements Serializable {
    private static AtomicLong counter = new AtomicLong(0);
         ...
         @ProcessElement
         public void processElement(ProcessContext c) {
             ...
             counter.incrementAndGet();
         }
}

感谢

apache-flink apache-beam
1个回答
0
投票

我认为初始化部分是指在DoFn的构造函数中设置一些值。您的代码将被初始化,因为Worker必须加载myTransform类。

如果它们碰巧在同一JVM中运行,那么,这将是共享的。 Beam人们试图传达的是,您无论如何都不应基于逻辑,并且运算符的并行实例可能会在任何节点上执行。

© www.soinside.com 2019 - 2024. All rights reserved.