spark算子优化
一、在聚合前在map端先预聚合
使用reduceByKey/aggregateByKey代替groupByKey
二、一次处理一个分区的数据,不过要注意一个分区里的数据不要太大,不然会报oom
* 使用mapPartitions代替map
* 使用foreachPartitions代替foreach
三、使用重分区
* 在过滤后使用算子coalesce(),避免过滤后可能产生的数据倾斜
四、对多次使用的rdd进行持久化,增加rdd的复用性。
每个rdd都会有一个血缘链,如果某个算子的上游rdd能在持久化的储存里找到,spark就会直接使用这个rdd,而不是从头开始计算
五、将外部的比较大的变量广播
在算子函数中,用到外部变量的时候,每个task会复制一份,如果对它使用时broadcast(),那么每个executor里面只会有一份,大大减少了变量的副本数量,减小了内存的开销。
六、使用kyro序列化来代替java自带的序列化机制ObjectOutputStream/ObjectInputStream
浙公网安备 33010602011771号