问题1:reduce task数目不合适web
解决方案:apache
须要根据实际状况调整默认配置,调整方式是修改参数spark.default.parallelism。一般的,reduce数目设置为core数目的2-3倍。数量太大,形成不少小任务,增长启动任务的开销;数目过小,任务运行缓慢。因此要合理修改reduce的task数目即spark.default.parallelismwindows
问题2:shuffle磁盘IO时间长
分布式
解决方案:性能
设置spark.local.dir为多个磁盘,并设置磁盘的IO速度快的磁盘,经过增长IO来优化shuffle性能;优化
问题3:map|reduce数量大,形成shuffle小文件数目多
spa
解决方案:orm
经过设置spark.shuffle.consolidateFiles为true,来合并shuffle中间文件,此时文件数为reduce tasks数目;内存
问题4:序列化时间长、结果大
源码
解决方案:
spark默认使用JDK 自带的ObjectOutputStream,这种方式产生的结果大、CPU处理时间长,能够经过设置spark.serializer为org.apache.spark.serializer.KeyoSerializer。
另外若是结果已经很大,那就最好使用广播变量方式了,结果你懂得。
问题5:单条记录消耗大
解决方案:
使用mapPartition替换map,mapPartition是对每一个Partition进行计算,而map是对partition中的每条记录进行计算;
问题6 : collect输出大量结果时速度慢
解决方案:
collect源码中是把全部的结果以一个Array的方式放在内存中,能够直接输出到分布式的文件系统,而后查看文件系统中的内容;
问题7: 任务执行速度倾斜
解决方案:
若是数据倾斜,通常是partition key取得很差,能够考虑其余的并行处理方式,并在中间加上aggregation操做;若是是Worker倾斜,例如在某些Worker上的executor执行缓慢,能够经过设置spark.speculation=true 把那些持续慢的节点去掉;
问题8: 经过多步骤的RDD操做后有不少空任务或者小任务产生
解决方案:
使用coalesce或者repartition去减小RDD中partition数量;
问题9:Spark Streaming吞吐量不高
能够设置spark.streaming.concurrentJobs
问题10:Spark Streaming 运行速度忽然降低了,常常会有任务延迟和阻塞
解决方案:
这是由于咱们设置job启动interval时间间隔过短了,致使每次job在指定时间没法正常执行完成,换句话说就是建立的windows窗口时间间隔太密集了;