spark性能调优04-算子调优
1、使用MapPartitions代替map
1.1 为什么要死使用MapPartitions代替map
普通的map,每条数据都会传入function中进行计算一次;而是用MapPartitions时,function会一次接受所有partition的数据出入到function中计算一次,性能较高。
但是如果内存不足时,使用MapPartitions,一次将所有的partition数据传入,可能会发生OOM异常
1.2 如何使用
有map的操作的地方,都可以使用MapPartitions进行替换
/**
* 使用mapPartitionsToPair代替mapToPair
*/
JavaPairRDD<String, Row> sessionRowPairRdd =dateRangeRdd.mapPartitionsToPair(new PairFlatMapFunction<Iterator<Row>, String, Row>() { private static final long serialVersionUID = 1L; public Iterable<Tuple2<String, Row>> call(Iterator<Row> rows) throws Exception {
List<Tuple2<String, Row>> list=new ArrayList<Tuple2<String, Row>>();
while (rows.hasNext()) {
Row row=rows.next();
list.add(new Tuple2<String, Row>(row.getString(), row));
}
return list;
}
}); /*JavaPairRDD<String, Row> sessionRowPairRdd = dateRangeRdd
.mapToPair(new PairFunction<Row, String, Row>() { private static final long serialVersionUID = 1L;
// 先将数据映射为<sessionId,row>
public Tuple2<String, Row> call(Row row) throws Exception {
return new Tuple2<String, Row>(row.getString(2), row);
}
});*/
2、使用coalesce对过滤后的Rdd进行重新分区和压缩
2.1 为什么使用coalesce
默认情况下,经过过滤后的数据的分区数和原分区数是一样的,这就导致过滤后各个分区中的数据可能差距很大,在之后的操作中造成数据倾斜
使用coalesce可以使过滤后的Rdd的分区数减少,并让每个分区中的数据趋于平等
2.2 如何使用
//过滤符合要求的ClickCategoryIdRow
filteredSessionRdd.filter(new Function<Tuple2<String,Row>, Boolean>() {
private static final long serialVersionUID = 1L;
public Boolean call(Tuple2<String, Row> tuple2) throws Exception {
return (Long.valueOf(tuple2._2.getLong())!=null)?true:false;
}
})
//使用coalesce将过滤后的数据重新分区和压缩,时新的分区中的数据大致相等
.coalesce()
3、使用foreachPartition替代foreach
3.1 为什么使用foreachPartition
默认使用的foreach,每条数据都会传入function进行计算;如果操作数据库,每条数据都会获取一个数据库连接并发送sql进行保存,消耗资源比较大,性能低。
使用foreachPartition,会把所用partition的数据一次出入function,只需要获取一次数据库连接,性能高。
3.2 如何使用
/**
* 使用foreachPartition替代foreach
*/
sessionRdd.join(sessionRowPairRdd).foreachPartition(new VoidFunction<Iterator<Tuple2<String,Tuple2<String,Row>>>>() {
private static final long serialVersionUID = 1L;
public void call(Iterator<Tuple2<String, Tuple2<String, Row>>> iterator)
throws Exception {
List<SessionDetail> sessionDetails=new ArrayList<SessionDetail>();
if (iterator.hasNext()) {
Tuple2<String, Tuple2<String, Row>> tuple2=iterator.next();
String sessionId=tuple2._1;
Row row=tuple2._2._2;
SessionDetail sessionDetail=new SessionDetail();
sessionDetail.setSessionId(sessionId);
sessionDetail.setTaskId((int)taskId);
sessionDetail.setUserId((int)row.getLong());
sessionDetails.add(sessionDetail);
}
DaoFactory.getSessionDetailDao().batchInsertSessionDao(sessionDetails);
}
}); /* sessionRdd.join(sessionRowPairRdd).foreach(new VoidFunction<Tuple2<String,Tuple2<String,Row>>>() {
private static final long serialVersionUID = 1L;
public void call(Tuple2<String, Tuple2<String, Row>> tuple2) throws Exception {
String sessionId=tuple2._1;
Row row=tuple2._2._2;
SessionDetail sessionDetail=new SessionDetail();
sessionDetail.setSessionId(sessionId);
sessionDetail.setTaskId((int)taskId);
sessionDetail.setUserId((int)row.getLong(1));
DaoFactory.getSessionDetailDao().insertSessionDao(sessionDetail);
}
});*/
4、使用repartition进行调整并行度
4.1 为什么要使用repartition
spark.default.parallelism设置的并行度只能对没有Spark SQL(DataFrame)的阶段有用,对Spark SQL的并行度是无法设置的,该并行度是通过hdfs文件所在的block块决定的。
可以通过repartition调整之后的并行度
4.2 如何使用
sqlContext.sql("select * from user_visit_action where date >= '" + startDate + "' and date <= '" + endDate + "'").javaRDD()
//使用repartition调整并行度
.repartition()
5、使用reduceByKey进行本地聚合
5.1 reduceByKey有哪些优点
reduceByKey相对于普通的shuffle操作(如groupByKey)的一个最大的优点,会进行map端的本地聚合,从而减少文件的输出,减少磁盘IO,网络传输,内存占比以及reduce端的聚合操作数据。
5.2 使用场景
只有是针对每个不同的key进行相应的操作都可以使用reduceByKey进行处理
spark性能调优04-算子调优的更多相关文章
- Spark性能调优-RDD算子调优篇(深度好文,面试常问,建议收藏)
RDD算子调优 不废话,直接进入正题! 1. RDD复用 在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如下图所示: 对上图中的RDD计算架构进行修改,得到如下图所示的优 ...
- Spark性能优化:数据倾斜调优
前言 继<Spark性能优化:开发调优篇>和<Spark性能优化:资源调优篇>讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化 ...
- 【转】Spark性能优化指南——基础篇
http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&sn=2f413828d1fdc6a ...
- spark性能调优:资源优化
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
- Spark性能调优之代码方面的优化
Spark性能调优之代码方面的优化 1.避免创建重复的RDD 对性能没有问题,但会造成代码混乱 2.尽可能复用同一个RDD,减少产生RDD的个数 3.对多次使用的RDD进行持久化(ca ...
- (转)Spark性能优化:资源调优篇
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何 ...
- [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析
本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...
- [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...
- Spark性能调优之合理设置并行度
Spark性能调优之合理设置并行度 1.Spark的并行度指的是什么? spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度! 当分配 ...
- Spark性能调优之解决数据倾斜
Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据 • 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hiv ...
随机推荐
- docker--container的port映射
使用nginx为例 先运行nginx [root@localhost ~]# docker run --name web -d nginx Unable to find image 'nginx:la ...
- elementUI table宽度自适应fit
:fit='true' 或者直接为 fit
- cmd中java的编译命令——java和javac、javap
最近重新复习了一下java基础,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象 如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行 ...
- AD中快速按模块摆放器件
AD中快速按模块摆放器件 在PCB布局的过程中,我们需要将元器件按照功能模块进行放置,如果一个一个去寻找则很麻烦,现在介绍一个快捷的方法: 1.首先在原理图中按照模块选中,然后快捷键 T+S跳转到PC ...
- 容斥原理+补集转化+MinMax容斥
容斥原理的思想大家都应该挺熟悉的,然后补集转化其实就是容斥原理的一种应用. 一篇讲容斥的博文https://www.cnblogs.com/gzy-cjoier/p/9686787.html 当我们遇 ...
- 2019牛客多校第七场H Pair 数位DP
题意:给你一个3个数A, B, C问有多少对pair(i, j),1 <= i <= A, 1 <= j <= B, i AND j > C或 i XOR j < ...
- @HttpEntity参数(怪异)
1).在Controller中写 与@RequestBody请求体对应 @HttpEntity更强大,不光有请求体,还能获取请求头 @RequestMapping("/test02" ...
- RGBA的值0-255范围如何转换成0-1范围
这样一个rgba(1,0,0,1) 如果我们要把它转换成 0-255范围 就是rgb分别乘以255 就是 rgba(255,0,0,1) 0-255转0-1范围 如 rgba(34,56,56,1)转 ...
- iSkysoft iMedia Converter Deluxe for Mac的使用方法
我们电脑上的播放器大多数的播放格式都比较少,所以在播放其它格式的时候容易出错,不能兼容其它的视频格式.今天小编要给大家推荐一种软件,iSkysoft iMedia Converter Deluxe就是 ...
- POJ A Plug for UNIX (最大流 建图)
Description You are in charge of setting up the press room for the inaugural meeting of the United N ...