当前位置: 首页 > 知识库问答 >
问题:

跨JVM共享Beam DoFn静态变量

南宫泓
2023-03-14

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

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

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

https://beam.apache.org/documentation/programming-guide/#requirements-用于编写梁变换的用户代码

现在,下面的静态对象“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();
         }
}

谢啦

共有1个答案

孔硕
2023-03-14

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

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

 类似资料:
  • 问题内容: 我的高级Java课堂上有关线程的老师说了一些我不确定的东西。以下代码不一定会更新ready变量。根据他的说法,这两个线程不一定共享静态变量,特别是在每个线程(主线程与)在其自己的处理器上运行并且因此不共享相同的寄存器/缓存/等和一个CPU的情况下。不会更新其他。 从本质上讲,他说有可能在主线程中进行更新,而不是在中进行更新,因此将无限循环。 他还声称该程序可以打印或打印。我了解如何打印

  • 问题内容: 我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。 问题的阐述: 说是有一个静态/全局变量在。exe 和dll 都具有,因此变量都在两个图像中。 现在,动态加载(或静态)。然后,问题是该变量是否由exe和dll共享。 在Windows中,这两个家伙 永远不会 共享:exe和dll将具有的单独副本。但是,在Li

  • 问题内容: 我有一个项目,其中有一个静态库,另一个有我的实际共享库。我的目标是链接到。在Linux / BSD上可以吗?尝试创建测试程序时,出现以下错误: ./prog1:/usr/local/lib/libtestlib.so.1.0:未定义的符号’‘ 我的猜测是,这是因为libhelper.a不是用while 编译的。使用共享库(也依赖于静态库)来构建程序的正确方法是什么? 谢谢! 问题答案:

  • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两

  • 一般情况下,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量被复制到每台机器上,并且这些变量在远程机器上 的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变量(broadcast variable)和累加器(acc

  • Shared variables (共享变量)是为所有模板定义的变量。可以使用 setSharedVariable 方法向配置中添加共享变量: Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); ... cfg.setSharedVariable("warp", new WarpDirective()); cfg