一、算子方面:
高性能的算子
1、使用mapPartitions替代map。
mapPartitions:处理一个partition所有的数据,可能会出现OOM;
2、使用foreachPartitions替代foreach;
3、 使用repartitionAndSortWithinPartitions替代repartition与sort类操作;
4、 使用filter之后进行coalesce操作;
避免shuffle类算子
shuffle类算子:repartition、repartitionAndSortWithinPartitions、coalesce、reduceByKey、groupByKey、sortByKey 、join、cogroup
二、RDD 方面:
1、 RDD复用
2、RDD的持久化
三、广播大变量
广播变量:需要在算子函数中使用外部变量
广播后的变量会在每个executor的内存中,只保留一份变量副本,而executor中的task执行时共享该executor中的那份变量副本。
四、kryo优化序列化
spark.serializer = org.apache.spark.serializer.KryoSerializer
五、优化数据结构
字符串替代对象;
使用原始类型替代字符串;
使用数组替代集合类型。
六、分配合理资源
提交任务时指定core和内存
七、设置合理并行度
task数量设置成 App的总cpu核数的2~3 倍
八、JVM调优