栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Spark中,在所有工作线程上拥有静态对象的正确方法是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Spark中,在所有工作线程上拥有静态对象的正确方法是什么?

这不是关于Spark的问题,而是关于Scala如何生成代码的问题。请记住,Scalaobject几乎是一个充满静态方法的Java类。考虑一个像这样的简单示例:

object foo {  val value = 42  def func(i: Int): Int = i + value  def main(args: Array[String]): Unit = {    println(Seq(1, 2, 3).map(func).sum)  }}

那将被翻译成3个Java类。其中之一将是闭包,该闭包是map方法的参数。javap在该类上使用将产生以下内容:

public final class foo$$anonfun$main$1 extends scala.runtime.AbstractFunction1$mcII$sp implements scala.Serializable {  public static final long serialVersionUID;  public final int apply(int);  public int apply$mcII$sp(int);  public final java.lang.Object apply(java.lang.Object);  public foo$$anonfun$main$1();}

请注意,没有任何字段。如果您查看反汇编的字节码,它所做的就是调用func()方法。在Spark中运行时,这是将被序列化的实例;由于它没有字段,因此不需要序列化。

至于您的问题,即如何初始化静态对象,您可以在关闭开始时调用一个幂等的初始化函数。第一个将触发初始化,随后的调用将成为无操作。不过,清理工作要复杂得多,因为我不熟悉执行“在所有执行程序上运行此代码”之类的API。

如果需要清理,一种有用的方法在此博客的“ setup()和cleanup()”部分中进行了说明。

编辑:只是为了澄清,这是实际进行调用的方法的反汇编。

public int apply$mcII$sp(int);  Code:   0:   getstatic       #29; //Field foo$.MODULE$:Lfoo$;   3:   iload_1   4:   invokevirtual   #32; //Method foo$.func:(I)I   7:   ireturn

了解它如何仅引用保存单例的静态字段并调用该func()方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号