火花作业中的静态变量 -Java

Static variable inside spark job -Java

我在使用 spark 和静态变量时遇到了一些问题。我有一个带有一些静态变量的配置 class,我在运行时从 属性 文件初始化这些变量。

        System.out.println("Outside : "+ActiveMQConfig.HOST_ADDRESS);
        rePartition.foreachRDD(new Function<JavaRDD<String>, Void>() {
            public Void call ( JavaRDD<String> rdd ) throws Exception
            {
                rdd.map(new Function<String, String>() {
                    public String call ( String line ) throws Exception
                    {
                        System.out.println("Inside :" + ActiveMQConfig.HOST_ADDRESS);
                        return null;
                    }
                }).count();
                return null;
            }
        });
        ssc.remember(new Duration(1 * 60 * 1000));
        ssc.start();

ActiveMQConfig.HOST_ADDRESS 的默认值是 localhost,我在运行时从 属性 文件设置一些 IP。

第一个 system out 打印 ip Outside : ip 但 system out inside map 方法打印默认值 Inside :localhost。我在这里做错了什么?我需要广播我想在 spark 中使用的所有变量吗?谁能指出我正确的方向?

谢谢!

这与 JVM 中的对象初始化有关。 每个工作人员都将加载并初始化 class 保存静态变量,但可能(未在问题中显示)只有驱动程序在驱动程序的 VM 上初始化此类变量的值。

结果是驱动程序有更新的值,但每个执行程序都有默认值。

解决这个问题的一种方法是明确地为闭包提供值:

rePartition.foreachRDD(new Function<JavaRDD<String>, Void>() {
     String host = ActiveMQConfig.HOST_ADDRESS 
     ...
          System.out.println("Inside :" + host)
     ...
}