一、spark开发调优
1.避免重复RDD
- 原则一:避免创建重复的RDD
- 对同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据
- 极大浪费内存
2.尽可能复用RDD
- 原则二:尽可能复用同一个RDD
- 比如:一个RDD数据格式是key-value,另一个是单独value类型,这两个RDD的value部分完
全一样,这样可以复用达到减少算子执行次数
- 比如:一个RDD数据格式是key-value,另一个是单独value类型,这两个RDD的value部分完
3.多次使用的RDD持久化
-
原则三:对多次使用的RDD进行持久化处理
- 每次对一个RDD执行一个算子操作时,都会重新从源头处理计算一遍,计算出那个RDD出来,然后进一步操作,这种方式性能很差
- 对多次使用的RDD进行持久化,将RDD的数据保存在内存或磁盘中,避免重复劳动
- 借助cache()和persist()方法
-
原则三:对多次使用的RDD进行持久化处理
- persist持久化级别
- persist持久化级别
4.避免shuffle
- 原则四:避免使用shuffle类算子
- 在spark作业运行过程中,最消耗性能的地方就是shuffle过程
- 将分布在集群中多个节点上的同一个key,拉取到同一个节点上,进行聚合和join处理,比如
groupByKey、reduceByKey、join等算子,都会触发shuffle
- Broadcast+map的join操作,不会导致shuffle操作,但前提适合RDD数据量较少时使用
5.map-side预聚合
- 原则五:使用map-side预聚合的shuffle操作
- 一定要使用shuffle的,无法用map类算子替代的,那么尽量使用map-site预聚合的算子
- 思想类似MapReduce中的Combiner
- 可能的情况下使用reduceByKey或aggregateByKey算子替代groupByKey算子,因为
reduceByKey或aggregateByKey算子会使用用户自定义的函数对每个节点本地相同的key进行
预聚合,而groupByKey算子不会预聚合
6.使用Kryo优化序列化性能
- 原则六:使用Kryo优化序列化性能
- Kryo是一个序列化类库,来优化序列化和反序列化性能
- Spark默认使用Java序列化机制(ObjectOutputStream/ ObjectInputStream API)进行序列化和反序列化
- Spark支持使用Kryo序列化库,性能比Java序列化库高很多,10倍左右
7.数据倾斜解决方案
1、提高shuffle操作的并行度。
2、使用随机数前缀进行Join操作。对key增加随机数。
3、将reduce join转为map join。
4、过滤少数导致数据倾斜的 key。如null值数据。
5、使用hive预处理数据。
6、使用两阶段聚合操作。
7、单独处理倾斜的key
8、rangepartioner+key转换处理