dip*_*uru 7 java apache-spark spark-streaming
我有一个班级:
public class Test {
private static String name;
public static String getName() {
return name;
}
public static void setName(String name) {
Test.name = name;
}
public static void print() {
System.out.println(name);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Spark驱动程序中,我正在设置这样的名称并调用print()命令:
public final class TestDriver{
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("TestApp");
// ...
// ...
Test.setName("TestName")
Test.print();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到了一个NullPointerException.如何将值传递给全局变量并使用它?
Dan*_*don 23
好的,基本上有两种方法可以将master知道的值带给执行者:
在任何一种情况下都不需要使用静态变量.但是,如果您希望在执行程序VM上提供静态值,则需要执行以下操作之一:
希望这可以帮助!
PS:至于你的异常:我只是没有在代码示例中看到它,我的赌注是它正在其他地方发生.
编辑以获得额外的说明:懒惰的val解决方案只是Scala,没有涉及Spark ...
object MyStaticObject
{
lazy val MyStaticValue = {
// Call a database, read a file included in the Jar, do expensive initialization computation, etc
4
}
}
Run Code Online (Sandbox Code Playgroud)
由于每个Executor都对应一个JVM,因此一旦加载了类MyStaticObject就会被初始化.该lazy关键字保证了MyStaticValue变量将只在首次初始化它实际上是要求,并从此保持其价值.
驱动程序进程中的类副本不是执行程序中的副本.它们不在同一台ClassLoader甚至相同的JVM中,甚至不在同一台机器上.在驱动程序上设置静态变量对其他副本没有任何作用,因此您可以远程找到它.
| 归档时间: |
|
| 查看次数: |
12230 次 |
| 最近记录: |