广大的博客友们,你们好,在这个刚过完冬至的第一个周末,下班了坐在电脑前对着电脑想了想最近做的项目,spark实时统计分析,真的非常累,做项目的时候不是你把代码写完了就可以了,还要做优化的,让程序跑的更快,更流畅,本人在公司也负责了小段时间的spark调优,之前做的hadoop调优,自己感觉spark调优跟hadoop差不多,都是从一些层面分析的,设置一些属性值等等。好啦,不多说了,开始进入正题,这篇博客是我集合项目中正在用到跟用到的跟大家介绍下,其中有的部分也是在网上查的资料,当然这么多调优不可能全部用到,今天先给大家做一个大体的调优方案,可以从以下方面入手。更详细的下篇博客,
- 性能调优:
- 分配更多资源
- 调节并行度
- RDD持久化
- 广播变量
- JVM调优
- 降低cache操作的内存占比
- 调节executor堆外内存与连接等待时长
- Shuffle调优
- 合并map端输出文件
- 调节map端内存缓冲(32KB)跟reduce端内存占比(0.2)
- 合理使用hashShuffleManager,sortShuffleManger,tungsten-sort
- 算子调优
- MapPartitions提升Map类操作性能
- filter过后使用coalesce减少分区数量
- 使用foreachPartition优化写数据库性能
- 使用repartition解决Spark SQL低并行度的性能问题
- reduceByKey本地聚合介绍
- troubleshooting(故障排除)
- 控制shuffle reduce端缓冲大小以避免OOM
- 解决JVM GC导致的shuffle文件拉取失败
- YARN队列资源不足导致的application直接失败
- 解决各种序列化导致的报错
- 解决算子函数返回NULL导致的问题
- 解决yarn-client模式导致的网卡流量激增问题
- 解决yarn-cluster模式的JVM栈内存溢出问题
- 错误的持久化方式以及checkpoint的使用
- 数据倾斜解决方案
- 聚合源数据以及过滤导致倾斜的key
- 提高shuffle操作reduce并行度
- 提升shuffle reduce端并行度的操作方法
- 使用随机key实现双重聚合
- 将reduce join转换为map join
- ample采样倾斜key单独进行join使用随机数以及扩容表进行join