gpt4 book ai didi

java - 如何从 spark 中设置和获取静态变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:11 25 4
gpt4 key购买 nike

我有这样一个类:

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);
}

}

在我的 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();
// ...
}
}

但是,我得到了一个NullPointerException。如何将值传递给全局变量并使用它?

最佳答案

好的,基本上有两种方法可以将 master 已知的值提供给执行者:

  1. 将值放入闭包中以序列化给执行程序以执行任务。这是最常见的一种,非常简单/优雅。示例和文档 here
  2. 用数据创建一个广播变量。这对于大尺寸的不可变数据很有用,所以你要保证它只发送一次。如果一遍又一遍地使用相同的数据也很好。示例和文档 here

在这两种情况下都不需要使用静态变量。但是,如果您确实希望执行程序 VM 上有可用的静态值,则需要执行以下操作之一:

  1. 如果值是固定的或配置在执行器节点上可用(在 jar 中等),那么您可以有一个惰性 val,保证只初始化一次。
  2. 您可以使用使用上述两个选项之一的代码调用 mapPartitions(),然后将值存储在您的静态变量/对象中。 mapPartitions 保证每个分区只运行一次(比每行运行一次要好得多)并且适用于这种事情(初始化数据库连接等)。

希望这对您有所帮助!

P.S:至于你的异常(exception)情况:我只是没有在该代码示例中看到它,我敢打赌它发生在其他地方。


编辑额外说明:惰性 val 解决方案只是 Scala,不涉及 Spark ...

object MyStaticObject
{
lazy val MyStaticValue = {
// Call a database, read a file included in the Jar, do expensive initialization computation, etc
4
}
}

由于每个Executor对应一个JVM,一旦加载类,MyStaticObject就会被初始化。 lazy 关键字保证 MyStaticValue 变量只会在它第一次被实际请求时被初始化,并从那以后一直保持它的值。

关于java - 如何从 spark 中设置和获取静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com