1、Spark调优背景
目前Zeppelin已经上线一段时间,Spark作为底层SQL执行引擎,需要进行整体性能调优,来提高SQL查询效率。本文主要给出调优的结论,因为涉及参数很多,故没有很细粒度调优,但整体调优方向是可以得出的。
环境:服务器600+,spark 2.0.2,Hadoop 2.6.0
2、调优结果
调优随机选取线上9条SQL,表横轴是调优测试项目,测试在集群空闲情况下进行,后一个的测试都是叠加前面测试参数。从数据可参数经过调优,理想环境下性能可提高50%到300%
3、 下面为调优分享PPT
1)一图概览
2) Spark集群优化——数据本地性
3)Spark集群优化——存储格式选择
4)Spark参数优化——计算资源
5) Spark参数优化——并行度
6)Spark参数优化——offheap内存
7)Spark参数优化——大小表join
8)Spark参数优化——其他
9) Spark参数优化——shuffle过程
10)Spark代码优化——RDD复用
11)Spark代码优化——选择合适算子
12) Spark代码优化——shuffle算子并行度调优
13)Spark代码优化——数据倾斜
14)Spark代码优化——优化数据结构
15)Spark代码优化——使用DateSet API
16)Spark代码优化——使用DateSet API
17) 目前Spark的瓶颈——内存
18) 目前Spark的瓶颈——内存
3、总结
调优参数虽名目多样,但最终目的是提高CPU利用率,降低带宽IO,提高缓存命中率,减少数据落盘。 不同数据量的最优参数都不相同,调优目的是让参数适应数据的量级以最大程度利用资源,经调优发现并不是所有参数有效,有的参数的效果也不明显,最后折中推荐如下调优参数以适应绝大多数SQL情况,个别SQL需要用户单独调参优化。(以下参数主要用于Spark Thriftserver,仅供参考)
参数 | 含义 | 默认值 | 调优值 |
---|---|---|---|
spark.sql.shuffle.partitions | 并发度 | 200 | 800 |
spark.executor.overhead.memory | executor堆外内存 | 512m | 1.5g |
spark.executor.memory | executor堆内存 | 1g | 9g |
spark.executor.cores | executor拥有的core数 | 1 | 3 |
spark.locality.wait.process | 进程内等待时间 | 3 | 3 |
spark.locality.wait.node | 节点内等待时间 | 3 | 8 |
spark.locality.wait.rack | 机架内等待时间 | 3 | 5 |
spark.rpc.askTimeout | rpc超时时间 | 10 | 1000 |
spark.sql.autoBroadcastJoinThreshold | 小表需要broadcast的大小阈值 | 10485760 | 33554432 |
spark.sql.hive.convertCTAS | 创建表是否使用默认格式 | false | true |
spark.sql.sources.default | 默认数据源格式 | parquet | orc |
spark.sql.files.openCostInBytes | 小文件合并阈值 | 4194304 | 6291456 |
spark.sql.orc.filterPushdown | orc格式表是否谓词下推 | false | true |
spark.shuffle.sort.bypassMergeThreshold | shuffle read task阈值,小于该值则shuffle write过程不进行排序 | 200 | 600 |
spark.shuffle.io.retryWait | 每次重试拉取数据的等待间隔 | 5 | 30 |
spark.shuffle.io.maxRetries | 拉取数据重试次数 | 3 | 10 |