spark算子优化

一、在聚合前在map端先预聚合

使用reduceByKey/aggregateByKey代替groupByKey

二、一次处理一个分区的数据,不过要注意一个分区里的数据不要太大,不然会报oom

* 使用mapPartitions代替map

* 使用foreachPartitions代替foreach

三、使用重分区

* 在过滤后使用算子coalesce(),避免过滤后可能产生的数据倾斜

四、对多次使用的rdd进行持久化,增加rdd的复用性。

每个rdd都会有一个血缘链,如果某个算子的上游rdd能在持久化的储存里找到,spark就会直接使用这个rdd,而不是从头开始计算

五、将外部的比较大的变量广播

在算子函数中,用到外部变量的时候,每个task会复制一份,如果对它使用时broadcast(),那么每个executor里面只会有一份,大大减少了变量的副本数量,减小了内存的开销。

六、使用kyro序列化来代替java自带的序列化机制ObjectOutputStream/ObjectInputStream

 

posted @ 2021-03-31 20:32  肥仔佳文猪  阅读(208)  评论(0)    收藏  举报