spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
2016-05-28 17:22
363 查看
问题1:reduce task数目不合适
解决方案:
需要根据实际情况调整默认配置,调整方式是修改参数Spark.default.parallelism。通常的,reduce数目设置为core数目的2-3倍。数量太大,造成很多小任务,增加启动任务的开销;数目太小,任务运行缓慢。所以要合理修改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源码中是把所有的结果以一个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窗口时间间隔太密集了;
解决方案:
需要根据实际情况调整默认配置,调整方式是修改参数Spark.default.parallelism。通常的,reduce数目设置为core数目的2-3倍。数量太大,造成很多小任务,增加启动任务的开销;数目太小,任务运行缓慢。所以要合理修改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源码中是把所有的结果以一个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窗口时间间隔太密集了;
相关文章推荐
- 老调重弹:对kvo的封装思路
- 类型转换对 MySQL 选择索引的影响
- strtoul (将字符串转换成无符号长整型数)
- ftok函数(file to key)
- 老调重弹:对kvo的封装思路
- [BetterExplained]为什么你应该(从现在开始就)写博客
- Linux下C++静态库、动态库的制作与使用
- iOS中在oc中制作一个霓虹灯
- 如何使用XML作为小型数据库
- opencv-ios开发笔记6 利用canny简单提取轮廓
- Apache服务器 配置多个网站解决方案
- 如何在onCreate方法中获取视图的宽度和高度
- XML标签
- 【原】iOS学习之第三方-AFNetworking1.3.0
- XML是什么,它可以做什么?——写给XML入门者
- 快速学习者的高效学习策略
- ImageView常用属性
- pair的使用
- 期末作业第二周
- centos 截图命令 screenshot