当前位置: 首页 > 面试题库 >

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

骆利
2023-03-14
问题内容

我有一个这样的课:

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。如何将值传递给全局变量并使用它?


问题答案:

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

  1. 将值放在闭包中,然后序列化到执行程序以执行任务。这是最常见的一种,非常简单/优雅。示例和文档 在这里
  2. 用数据创建一个广播变量。这对于大容量的不可变数据很有用,因此您要保证仅发送一次。如果反复使用相同的数据,也很好。示例和文档 在这里

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

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

希望这可以帮助!

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

由于每个执行器都对应一个JVM,因此一旦加载了类,MyStaticObject便会初始化。该lazy关键字保证了MyStaticValue变量将只在首次初始化它实际上是要求,并从此保持其价值。



 类似资料:
  • 假设我有三个类:,,和 我从类a传递一个变量,该变量将传递的变量设置为类数据中的变量,使用数据的类,并尝试使用数据的类获取数据()在类

  • 我正在编写一个程序,需要从mingw为当前进程设置环境变量(在使用-call时可用于子进程)。 我知道如何在linux和windows中使用msvc和clang。然而,我找不到任何关于如何使用MingW-G++实现这一点的好的例子。 如何实现具有这种行为的函数? 如果您想用c语言回答,请省略std::string:) 编辑: 当使用(linux方式)时,我得到: 当使用_putenv_s(我在wi

  • 库加载良好,但似乎找不到静态变量。为什么没有加载静态变量?

  • 我想在我的Python项目中添加一些全局环境变量。我的想法是添加一个<代码>。env,并设置一些变量,如下所示: 在Python中,我如何能够在我的项目中访问这些变量。在网上,我看到,其中也被导入,但这似乎不起作用。有人知道我如何做到这一点吗?我还可以设置一个文件来包含这些全局变量。或者,如果有更好的Python实践,有人能分享一下吗?

  • 问题内容: 将DataFrame设置为redis之后,再将其取回,redis返回一个字符串,但我想不出一种将该str转换为DataFrame的方法。 我该如何适当地做这两个? 问题答案: 组: 得到:

  • 运行时出现此代码错误,获取错误-:非静态变量,无法从静态上下文中引用此变量我应该如何解决此代码