Spark优化之一:分布式下的map操作是闭包

例如对一个JavaPairRDD<String, String>做遍历操作,常见的,我们可以通过先通过collect()操作将它转化为Map对象再进行遍历,也可以使用Spark提供的mapToPair方法进行遍历。然而两者的性能差距是非常显著的。

仅仅遍历1500条长度为155的序列,前者需要消耗6s,后者只需要消耗不到1s的时间。这说明,将Spark内存对象转化为普通Java对象有时会产生巨大的开销!

这里需要提到的是,我依旧还没有源代码,过年争取看一下。

贴上两个遍历操作的源代码:

 

第一种Map遍历: 

        List<String> s_key = new ArrayList<>();
        fastaDataJavaPairRDD.collect().forEach(a -> {
            s_key.add(a._1);
        });
        fastaDataJavaPairRDD = null;
        List<String> s_out1 = new ArrayList<>();
        List<String> s_out2 = new ArrayList<>();
        fastaMSADataJavaPairRDD.collect().forEach(a -> {
            s_out1.add(a._1);
            s_out2.add(a._2);
        });
        fastaMSADataJavaPairRDD = null;
        System.out.println((System.currentTimeMillis()-startTime)+"ms");

  

第二种mapToPair遍历:

        List<String> s_key = new ArrayList<>();
        fastaDataJavaPairRDD.mapToPair(
                (PairFunction<Tuple2<String, String>, String, String>) stringTuple2 -> {
                    s_key.add(stringTuple2._1);
                    return new Tuple2<>(null, null);
                }
        );
        fastaDataJavaPairRDD = null;
        List<String> s_out1 = new ArrayList<>();
        List<String> s_out2 = new ArrayList<>();
        fastaMSADataJavaPairRDD.mapToPair(
                (PairFunction<Tuple2<String, String>, String, String>) stringTuple2 -> {
                    s_out1.add(stringTuple2._1);
                    s_out2.add(stringTuple2._2);
                    return new Tuple2<>(null, null);
                }
        );
        fastaMSADataJavaPairRDD = null;
        System.out.println((System.currentTimeMillis()-startTime)+"ms");

  

但是,也请注意,分布式下的map,mapToPair等操作都是闭包的,也要注意这些操作内部调用的类和方法都必须是序列化后的,否则是线程不安全的。Spark在操作时,将map等算子内部的操作代码拷贝到每台从节点,从节点进行分别的操作,因此内部不应该出现线程不安全的类和方法。需要注意。

转载于:https://www.cnblogs.com/shixiangwan/p/6193050.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值