1、避免创建重复的RDD
2、尽可能复⽤同⼀个RDD
3、对多次使⽤的RDD进⾏持久化
4、尽量避免使⽤shuffle类算⼦
5、使⽤map-sid预聚合的shuffle操作
所谓的map-side预聚合,说的是在每个节点本地对相同的key进⾏⼀次聚合操作,类似MapReduce中的本地combiner。map-side预聚合之后,每个节点本地就只会有⼀条相同的key,因为多条相同的key都被聚合起来了。其他节点在拉取所有节点上的相同key时,就会⼤⼤减少需要拉取的数据数量,从⽽也就减少了磁盘IO以及⽹络传输开销。如reduceByKey或者aggregateByKey代替groupByKey。
6、使⽤⾼性能算⼦
⽐如使⽤reduceByKey/aggregateByKey替代groupByKey
使⽤mapPartitions替代普通map
使⽤foreachPartitions替代foreach
使⽤filter之后进⾏coalesce操作
7、⼴播⼤变量
有时在开发过程中,会遇到需要在算⼦函数中使⽤外部变量的场景(尤其是⼤变量,⽐如100M以上的⼤集合),那么此时就应该使⽤Spark的⼴播(Broadcast)功能来提升性能。
8、调整参数
⽐如num-executors,executor-memory,executor-cores,driver-memory 等参数