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

如何从spark设置和获取静态变量?,第1张

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

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

  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
变量将只在首次初始化它实际上是要求,并从此保持其价值。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5499709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存