Contenu connexe Similaire à Spark性能调优分享 (20) Spark性能调优分享3. Spark集群优化——数据本地性
sql locality情况 执行时间(s)
Node local Rack local Any
sql1 214 232 0 140.2
326 122 0 26.4
sql6 52067 1492 635 139
49456 1392 142 41
49998 1380 53 36
数据本地性越好,数据网络传输越少,计算也就越快,所以要尽量避免数据跨节点和跨机架传输
数据locality相关参数:
• spark.locality.wait.process 默认3s
• spark.locality.wait.node 默认3s
• spark.locality.wait.rack 默认3s
4. Spark集群优化——存储格式选择
格式 读取数据量(KB) 存储大小(byte) 查询时间(s)
sql-10 text 1167.5 1164841 10.5
orc 1028.3 572035 10.9
parquet 1083 1093378 10.7
sql-11
text 41.7 42687 7.8
orc 33.1 25841 4.3
parquet 21.7 45112 4.9
从测试结果来看,orc格式相对text和parquet格式在存储大小和查询时间方面都有较好的性能。
相关参数:
spark.sql.hive.convertCTAS 默认false
spark.sql.sources.default 默认parquet
5. Spark参数优化——计算资源
1core
4G Mem
2core
6G Mem
2core
7G Mem
2core
8GMem
3core
6G Mem
3core
9GMem
sql1 37.7 30 44 29.5 78.6 30
sql6 61 122 107 164 377 144
sql7 1240 failed failed 1176 failed failed
core表示executor同时计算的task数,memory表示执行的内存,从测试结果看到比例过多过小都不合适,
内存调大会出现内存瓶颈,内存太小会出现作业失败;core太小导致并行度小计算慢,太大会引起disk
IO瓶颈。
备注:测试在spark.sql.shuffle.partitions=600情况下进行
相关参数:
--executor-memory 默认1G
--executor-cores 默认1core
6. Spark参数优化——并行度
sql NO. 200 partitions 400 partitions 600 partitions
sql1 71 50 37.7
sql2 96.6 95 61
sql3 138.5 126 47.3
sql4 154. 179 76.8
sql5 393 303.8 265
sql6 147.7 186 173
sql7 2467 1626 1240
sql8 232.7 37 40
sql9 127 136 113
相关参数:
spark.sql.shuffle.partitions 默认200
并行度增大数据能分配到更多分区,减少数据倾斜,默认值为200,不适合公司目前的数据量级,
从测试可看出调大分区数,能显著增加执行时间,而且能跑通原来跑不通的SQL。
7. Spark参数优化——offheap内存
spark.yarn.executor.overhead 200 partitions 400 partitions
512M failed 522
1024M 393 303.8
SQL 200partitions 400partitions
SQL4 288.7 199.1
SQL5 failed 522
overhead memory不同值调优记录
overhead memory=512M情况测试记录
offheap内存主要由系统内存和spark内部对象占用,当offheap内存很小的时候作业失败率很高,增大该
内存可以提高作业执行效率和通过率。
相关参数:
spark.executor.overhead.memory 默认executor内存的0.1
10. Spark参数优化——shuffle过程
shuffle(sort based)
shuffle过程文件数和shuflle write的缓存:
shuffle file: core * R
shuffle write buffer: core * R * 32
相关参数:
spark.shuffle.manager 默认sort
spark.shuffle.file.buffer 默认32k
spark.reducer.maxSizeInFlight 默认48m
spark.shuffle.io.maxRetries 默认3
spark.shuffle.io.retryWait 默认5s
spark.shuffle.memoryFraction 默认0.2
spark.shuffle.sort.bypassMergeThreshold默认200
对于shuffle过程,测试验证,如果executor内存比较大如10G以上,提高spark.shuffle.file.buffer、spark.reducer.maxSizeInFlight、 spark.shuffle.
memoryFraction会提高shuffle效率,同时对于大作业,提高spark.shuffle.io.maxRetries和spark.shuffle.io.retryWait能提高大作业稳定运行概率。
11. Spark代码优化——RDD复用
错误用法
1)重复创建RDD
val rdd1 = sc.textFile(“hdfs://*:9000/hello.txt”)
rdd1.map(...)
val rdd2 = sc.textFile(“hdfs://*:9000/hello.txt”)
rdd2.reduce(...)
2)不复用RDD
JavaPairRDD<Long, String> rdd1= ...
JavaRDD<String> rdd2 = rdd1.map(...)
rdd1.reduceByKey(...)
rdd2.map(...)
正确用法
1)避免重复创建RDD
val rdd1 = sc.textFile(“hdfs://*:9000/hello.txt”)
rdd1.map(...)
rdd1.reduce(...)
2)尽量复用RDD,且多次使用的需要cache
JavaPairRDD<Long, String> rdd1= ....cache()
rdd1.reduceByKey(...)
rdd1.map(tuple._2...)
参考: http://tech.meituan.com/spark-tuning-basic.html
18. Spark调优案例
sql7参数 stage1并发数 执行时间
2core,8Gmem,600partitions
1G executor.memoryOverhead
2160 failed
2core,12Gmem,1500partitions
1G executor.memoryOverhead
1280 1308
2core,12Gmem,3500partitions
1G executor.memoryOverhead
1280 1132
3core,12Gmem,3500partitions,
2G executor.memoryOverhead
1748 986
3core,8Gmem,3500partitions,
2G executor.memoryOverhead
2160 954
3core,8Gmem,5000partitions,
2G executor.memoryOverhead
2160 838.1
Notes de l'éditeur 有一个RDD的数据格式是key-value类型的,另一个是单value类型的,这两个RDD的value数据是完全一样的。那么此时我们可以只使用key-value类型的那个RDD,因为其中已经包含了另一个的数据。对于类似这种多个RDD的数据有重叠或者包含的情况,我们应该尽量复用一个RDD,这样可以尽可能地减少RDD的数量,从而尽可能减少算子执行的次数。 treeReduce的工作更多放在executor,reduce算子在driver计算数据,对driver压力很大
算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时就应该使用Spark的广播(Broadcast)功能来提升性能。
treeReduce的工作更多放在executor,reduce算子在driver计算数据,对driver压力很大
算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时就应该使用Spark的广播(Broadcast)功能来提升性能。