Apache flink Beam DoFn静态变量在JVM中共享

Apache flink Beam DoFn静态变量在JVM中共享,apache-flink,apache-beam,Apache Flink,Apache Beam,所以,我试图弄清楚Beam DoFn中静态变量的行为, 它在线程之间(在同一个JVM中)共享吗 基本上是试图从编程指南中了解以下内容: 4.3.2。线程兼容性 …请注意,函数对象中的静态成员不会传递给工作实例,并且多个 可以从不同的线程访问函数的实例 现在,下面的静态对象“counter”似乎已初始化、序列化并应用于worker(Flink引擎),它是否与上面的语句一致 如果工作线程落在不同的进程/JVM中,显然不会共享。但是,如果落到同一个JVM上,“计数器”会被共享吗 public cla

所以,我试图弄清楚Beam DoFn中静态变量的行为, 它在线程之间(在同一个JVM中)共享吗

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

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

现在,下面的静态对象“counter”似乎已初始化、序列化并应用于worker(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();
         }
}
公共类myTransform扩展DoFn实现可序列化{
专用静态AtomicLong计数器=新的AtomicLong(0);
...
@过程元素
公共void processElement(ProcessContext c){
...
counter.incrementAndGet();
}
}

谢谢

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


如果它们碰巧在同一个JVM中运行,那么是的,这将被共享。Beam的人试图传达的是,无论如何,你都不应该将逻辑建立在这个基础上,操作符的并行实例可能会在任何节点上执行。

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

如果它们碰巧在同一个JVM中运行,那么是的,这将被共享。人们试图传达的是,你们不应该把逻辑建立在任何情况下,操作符的并行实例可能会在任何节点上执行