我遇到了一些关于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中广播我想要使用的所有变量吗?有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
这与JVM中的对象初始化有关。 每个worker都将加载并初始化保存静态变量的类,但可能(未显示有问题)只有驱动程序在驱动程序的VM上初始化此类变量的值。
结果是驱动程序具有更新的值,但每个执行程序都具有默认值。
解决此问题的一种方法是明确地为闭包提供值:
double d = (2.0*100)/3