首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花关闭行为

火花关闭行为
EN

Stack Overflow用户
提问于 2017-03-28 23:43:20
回答 1查看 185关注 0票数 0

我有一个关于火花关闭的基本问题。我无法区分场景2和场景3之间的代码行为,它们都产生相同的输出,但根据我的理解,场景3不应该像预期的那样工作。

以下代码对于所有场景都是常见的:

代码语言:javascript
复制
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在驱动程序中初始化,在执行器上不可见。

代码语言:javascript
复制
A a=new A("pqr");
rdd.map(i->i+a.t).collect();

场景2:推荐的对象共享方式

代码语言:javascript
复制
Broadcast<A> broadCast = context.broadcast(new A("pqr"));
rdd.map(i->broadCast.getValue().t+i).collect();
//output: [pqra, pqrb, pqrc, pqrd, pqre]

场景3:为什么这段代码可以像预期的那样工作,即使我在驱动程序中启动了A?

代码语言:javascript
复制
 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]

注意:我正在以集群模式运行程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 00:16:23

为景物1&3生成的Java字节码几乎是相同的。使用广播的好处是广播对象只被发送给执行器一次,并在此执行器上的其他任务中重用它。场景1&3总是将对象A发送给每个任务的执行者。

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

https://stackoverflow.com/questions/43081816

复制
相关文章

相似问题

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