问题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
体积小,速度快