程序员人生 网站导航

spark内核揭秘-14-Spark性能优化的10大问题及其解决方案

栏目:服务器时间:2015-01-28 09:03:05

问题1:reduce task数目不适合

解决方案:

需要根据实际情况调剂默许配置,调剂方式是修改参数spark.default.parallelism。通常的,reduce数目设置为core数目的2⑶倍。数量太大,造成很多小任务,增加启动任务的开消;数目太小,任务运行缓慢。所以要公道修改reduce的task数目即spark.default.parallelism

问题2:shuffle磁盘IO时间长

解决方案:

设置spark.local.dir为多个磁盘,并设置磁盘的IO速度快的磁盘,通过增加IO来优化shuffle性能;

问题3:map|reduce数量大,造成shuffle小文件数目多

解决方案:

通过设置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源码中是把所有的结果以1个Array的方式放在内存中,可以直接输出到散布式的文件系统,然后查看文件系统中的内容;

问题7: 任务履行速度倾斜

解决方案:

如果数据倾斜,1般是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窗口时间间隔太密集了;


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐