我有一个关于火花关闭的基本问题。我无法区分场景2和场景3之间的代码行为,它们都产生相同的输出,但根据我的理解,场景3不应该像预期的那样工作。
以下代码对于所有场景都是常见的:
class A implements Serializable{
String t;
A(String t){
this.t=t;
}
}
//Initiaze spark context
JavaSparkContext context=....
//create rdd
JavaRDD<String> rdd = context.parallelize(Arrays.asList("a","b","c","d","e"),3);场景1:不这样做,因为A在驱动程序中初始化,在执行器上不可见。
A a=new A("pqr");
rdd.map(i->i+a.t).collect();场景2:推荐的对象共享方式
Broadcast<A> broadCast = context.broadcast(new A("pqr"));
rdd.map(i->broadCast.getValue().t+i).collect();
//output: [pqra, pqrb, pqrc, pqrd, pqre]场景3:为什么这段代码可以像预期的那样工作,即使我在驱动程序中启动了A?
class TestFunction implements Function<String, String>, Serializable {
private A val;
public TestFunction(){ }
public TestFunction(A a){
this.val = a;
}
@Override
public String call(String integer) throws Exception {
return val.t+integer;
}
}
TestFunction mapFunction = new TestFunction(new A("pqr"));
System.out.println(rdd.map(mapFunction).collect());
//output: [pqra, pqrb, pqrc, pqrd, pqre]注意:我正在以集群模式运行程序。
发布于 2017-03-29 00:16:23
为景物1&3生成的Java字节码几乎是相同的。使用广播的好处是广播对象只被发送给执行器一次,并在此执行器上的其他任务中重用它。场景1&3总是将对象A发送给每个任务的执行者。
https://stackoverflow.com/questions/43081816
复制相似问题