例如对一个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等算子内部的操作代码拷贝到每台从节点,从节点进行分别的操作,因此内部不应该出现线程不安全的类和方法。需要注意。

Spark优化之一:分布式下的map操作是闭包的更多相关文章

  1. spark优化参数调节和故障参数调节

    1:“物尽其用”,但给spark分配多个机器后,先需配置spark-submit shell如下: /usr/local/spark/bin/spark-submit \ --class com.sp ...

  2. 【spark】spark应用(分布式估算圆周率+基于Spark MLlib的贷款风险预测)

    注:本章不涉及spark和scala原理的探讨,详情见其他随笔 一.分布式估算圆周率 计算原理:假设正方形的面积S等于x²,而正方形的内切圆的面积C等于Pi×(x/2)²,因此圆面积与正方形面积之比C ...

  3. 聊聊分布式下的WebSocket解决方案

    前言 最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的. 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人. 这里面 ...

  4. spark优化项

    一.Shuffle优化项 1.Shuffle优化配置 - spark.shuffle.file.buffer 默认值:32k 参数说明:该参数用于设置shuffle write task的Buffer ...

  5. lucene之排序、设置权重、优化、分布式搜索(转)

    lucene之排序.设置权重.优化.分布式搜索(转) 1. 基本应用 using System;using System.Collections.Generic;using System.Text;u ...

  6. spark优化设置

    ->>>配置参数优化 SparkConf sc = new SparkConf().setAppName("com.sp.test.GroupTop3").set ...

  7. (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子

    本篇先介绍HBase在伪分布式环境下的安装方式,然后将MapReduce编程和HBase结合起来使用,完成WordCount这个例子. HBase在伪分布环境下安装 一.   前提条件 已经成功地安装 ...

  8. Spark Streaming之六:Transformations 普通的转换操作

    与RDD类似,DStream也提供了自己的一系列操作方法,这些操作可以分成四类: Transformations 普通的转换操作 Window Operations 窗口转换操作 Join Opera ...

  9. spark on yarn模式下内存资源管理(笔记1)

    问题:1. spark中yarn集群资源管理器,container资源容器与集群各节点node,spark应用(application),spark作业(job),阶段(stage),任务(task) ...

随机推荐

  1. 对TPR(真正例率) 与 FPR(反正例率)的理解

    将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面. 分类过程就相当于在这个排序中以某个“截断点”(见图中阈值)将样本分为两部分,前一部分判作正例,后一部分判作反例. 我 ...

  2. Tensorflow Serving介绍及部署安装

    TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库.它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用.更加让人眼前一亮的是,它支持 ...

  3. MongoDB复制二:复制集的管理

    1.修改oplog的大小  需要在每个机器上都配置.先在secondary上操作,最后在primary上操作. 1)以单机的方式重启复制集的实例 db.shutdownServer() 在新的端口中启 ...

  4. DFS(4)——hdu1010Tempter of the Bone

    一.题目回顾 题目链接:Tempter of the Bone Problem Description The doggie found a bone in an ancient maze, whic ...

  5. CentOS7中rpm,yum软件安装命令

    RPM包常用安装位置说明 /etc/                   配置文件安装目录 /usr/bin/               可执行的命令安装目录 /usr/lib/           ...

  6. QueryHelper插件类(hql)

    package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHe ...

  7. Elasticsearch中的分词器比较及使用方法

    Elasticsearch 默认分词器和中分分词器之间的比较及使用方法 https://segmentfault.com/a/1190000012553894 介绍:ElasticSearch 是一个 ...

  8. Java-Eclipse-Jabref一条龙

    Java部分: 1. 到Oracle官网下载需要版本的JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html 2. ...

  9. 皮肤包项目的 Gradle 脚本演化

    我在做的一个项目需要有换肤功能,换肤的方案是采用第三方库 ThemeSkinning 的实现(在其基础上修复若干 bug).皮肤的制作是把相关的资源放在一个 app module 中打包成 apk,当 ...

  10. MFC中ON_UPDATE_COMMAND_UI和ON_COMMAND消息区别

    原文链接地址:http://www.cnblogs.com/orez88/articles/2217823.html 第一个是你打开这个菜单时,处理这个菜单的状态,比如选中.变灰等等.  第二个是响应 ...