所以,我试图找出Beam DoFn中静态变量的行为,是否在线程之间共享(在同一JVM中)?
基本上是试图从编程指南中了解以下内容:
4.3.2。线程兼容性…请注意,函数对象中的静态成员不会传递给工作程序实例,并且多个您的函数实例可以从不同的线程访问。
现在,似乎以下静态对象“计数器”已初始化,序列化并应用到工作程序(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();
}
}
感谢
我认为初始化部分是指在DoFn
的构造函数中设置一些值。您的代码将被初始化,因为Worker必须加载myTransform
类。
如果它们碰巧在同一JVM中运行,那么,这将是共享的。 Beam人们试图传达的是,您无论如何都不应基于逻辑,并且运算符的并行实例可能会在任何节点上执行。