Spark作业中的静态变量-Java

时间:2015-06-30 13:02:44

标签: java apache-spark spark-streaming

我遇到了一些关于spark和static变量的问题。我有一个配置类,其中包含一些静态变量,我在运行时从属性文件初始化。

        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。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

double d = (2.0*100)/3