Spark性能优化(一)

问题1:val rdd = data.filter(f1).filter(f2).reduceBy经过以上几步会有很多空任务或者小任务,这样的话将大量的开销做了Task的准备工作。

解决:使用repartition去减少RDD中的partition数量。


问题2:每个记录的开销太大

rdd.map{x=>conn=getDBConn;conn.write(x.toString);conn.close}

解决:rdd.mapPartitions(records =>conn.getDBConn;for(item <-records))write(item.toString); conn.close)

就是写代码时批量操作数据库。


问题3: 任务执行速度倾斜

解决:

1.数据倾斜:考虑并行处理方法,中间可以加入一步aggregation

具体的解决方法大概有6种。

2.Worker倾斜(在某些worker上的executor不给力)

设置spark.speculation=true 把那些持续不给力的node去掉


问题4:不设置spark.local.dir 这是spark写shuffle输出的地方 (这种方法用的不多!)

解决:设置一组磁盘

spark.local.dir=/mn1/spark, /mnt2/spar, /mnt3/spark 增加IO即加快速度


问题5: reducer数量不合适

解决:

太多的reducer,造成很多的小任务,以此产生很多启动任务的开销。

太少的reducer,任务执行慢!!

reduce的任务数还会影响到内存


问题6:collect输出大大量结果慢

解决: 直接输出到分布式⽂文件系统

问题7:序列化

Spark默认使用JDK自带的ObjectOutputStream

兼容性好,体积大,速度慢

解决: 使⽤用Kryo serialization

体积小,速度快

你可能感兴趣的:(Spark性能优化(一))