首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花工之间的代码共享

火花工之间的代码共享
EN

Stack Overflow用户
提问于 2016-07-05 12:19:52
回答 2查看 268关注 0票数 1

根据Spark文档,最好在RDD转换中使用匿名或scala对象函数。我有下一个代码的对象:

代码语言:javascript
复制
object Util {
  val someManager = new Manager()

  def process(data: String) = someManager.manage(data)
}

我把它称为下一种方式:

代码语言:javascript
复制
myRDD.map(Util.process)

如何序列化Util对象并将其发送给火花工作人员?经理是为每次发送还是只发送一次而创建的?多少次经理的实例将被发送给火花工人?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-06 13:37:59

如何序列化Util对象并将其发送给火花工作人员?经理是为每次发送还是只发送一次而创建的?多少次经理的实例将被发送给火花工人?

Util.process在编译时被包装在一个AbstractFunction1中,它实现了它的apply方法,这就是被序列化的方法。您可以在解压缩此代码时看到这一点(这是根据JVM字节码重构的):

代码语言:javascript
复制
par.map(new AbstractFunction1() {
  public static final long serialVersionUID = 0L;

  public final void apply(String data)
  {
    Util..MODULE$.process(data);
  }
 }, ClassTag..MODULE$.Unit());
}

我们希望看到的另一件事是如何将Util对象编译成字节码:

代码语言:javascript
复制
public final class Util$
{
  public static final  MODULE$;
  private final Manager someManager;

  public Manager someManager()
  {
    return this.someManager;
  }

  private Util$()
  {
    MODULE$ = this;
    this.someManager = new Manager();
  }

  public void process(String data)
  {
    someManager().manage(data);
  }
}

这意味着我们仍然有一个用于Manager的实例字段。将会发生的情况是,Spark将使用它的ClosureCleaner来清除Util实例,因为它不需要它,但它将使用serialize将Manager实例序列化给工作人员,并且每次它需要调用map时都会这样做。这并不意味着会有多个Manager实例,它仅仅意味着需要序列化单个实例并通过线路发送。我们可以在ClosureCleaner文档中看到详细信息

  • 其机制是遍历封闭闭包的层次结构,并在此过程中空出启动闭包实际使用的任何引用,但这些引用仍然包含在编译的匿名类中。注意到,简单地更改封闭闭包是不安全的,因为其他代码路径可能依赖于它们。相反,我们克隆每个封闭闭包并相应地设置父指针。
票数 2
EN

Stack Overflow用户

发布于 2016-07-05 13:20:08

Util需要是可序列化的,否则您将得到一个异常。经理每一次都会被派去(如带着每项任务)。不过,每个分区只能发送一次,为此您需要首先广播它,请参阅http://spark.apache.org/docs/latest/programming-guide.html

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38203303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档