本篇围绕spark开发中的优化展开
参考致谢:
https://blog.csdn.net/u012715448/article/details/79457664
https://www.cnblogs.com/itboys/p/9226479.html
九项原则
一、避免重复创建RDD
二、复用同一RDD
三、频繁使用的RDD进行持久化
.persist(StorageLevel.MEMORY_AND_DISK());
记得释放资源
rdd.unpersist();
四、尽量避免shuffle算子
讲这个之前,我们先来聊一聊什么是shuffle。
shuffle描述数据从map task 输出到 reduce task的这段过程
Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程。
众所周知,rdd3=rdd1.join(rdd2);
join操作会导致shuffle操作
这时候我们可以使用Broadcast将一个数据量小的RDD作为广播变量
val rdd2Data=rdd2.collect();
val rdd2DataBroadcast=sc.broadcast(rdd2Data);
Broadcast+map的join,不会导致shuffle操作
五、使用map-side预聚合的shuffle操作
通关两张图来演示预聚合的含义
groupByKey
在这里插入图片描述
reduceByKey
通过两个图分别展示 了groupByKey和reduceByKey的大致过程,即groupByKey是先shuffle,后聚合;
所有的键值对都会进行shuffle,这将增加很多无谓的数据进行网络传输。而reduceByKey则使用了预聚合
六、使用高性能的算子
(1)使用mapPartitions 代替map
(2)使用foreachPartitions代替foreach
(3)使用filter之后进行coalesce操作
七、广播变量
八、使用kyro优化序列化性能
spark2.0版本中默认使用
九、优化数据结构
Java中,有三种较为耗费内存
- 对象
- 字符串
- 集合类型
使用中能用简单 类型,不用复杂类型