一、分配更多资源
性能调优的王道,就是增加和分配更多的资源,性能和速度上会得到很大提升。基本上,在一定的范围之内,增加的资源和性能的提升是成正比的。所以,性能调优的第一步是增加资源,调节最优的资源配置;第二步,能够分配的资源达到能力范围的顶端后,无法再分配更多的资源,需要考虑下面几个性能调优的点。
二、性能调优的点
①分配哪些资源?
- executor
- cup per executor
- memory per executor
- driver memory
②在哪里分配资源?
在我们的生产环境中,提交spark作业时,用的spar-submit shell脚本,调整对应的参数
/usr/local/spark/bin/spark-submit \ --class cn.spark.sparktest.core.WordCountCluster \ --num-executors 3 \ 配置executor的数量 --driver-memory 100m \ 配置driver的内存(影响不大) --executor-memory 100m \ 配置每个executor的内存大小 --executor-cores 3 \ 配置每个executor的cpu core数量 /usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ |
③调节到多大才算最大?
第一种,Spark Standalone,公司的Spark集群上,根据实际情况,调节每个spark作业的资源分配。比如集群有30台机器,每台机器8G内存,4个cpu core;20个executor;那么,每个executor分配12G内存,6个cpu core。
第二种,Yarn。spark作业提交到yarn资源队列执行,需要查看队列剩下的可以使用的资源。比如500G内存,200个cpu core;50个executor;那么每个executor分配10G内存,4个cpu core。
三、为什么调节了资源之后,性能可以提升?
①增加executor
如果executor的数量少,那么能够 并行执行的task数量就会变少,这就意味着Application的并行执行能力比较弱。
比如有3个executor,每个executor有2个cpu core,那么同时能够执行的task数量为6个。执行完当前的6个task后,再执行下一批6个task。
增加了executor后,能够并行执行的task的数量就会变多,就以为着性能得到提升。
②增加每个executor的cpu core
根据上面一点,Application的并行执行能力跟每个executor的cpu core数量有关。
比如,原来有20个executor,每个executor有2个cpu core,那么并行执行的task数量为40个;
现在还是20个executor,把每个executor的数量增加到5个,那么并行执行的task数量为100个,性能提升了2.5倍。
③增加每个executor的内存
增加每个executor的内存,对性能的提升有3点:
- 如果需要对RDD进行cache,更多的内存意味着可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘,减少了磁盘IO,性能得到提升;
- 对于shuffle操作,reduce端需要内存,来存放拉取过来的数据并进行聚合。如果内存不够,会写入磁盘。如果给executor分配更多的内存,那么需要写入磁盘的数据就会变少,甚至没有数据需要写入磁盘,减少了磁盘IO,性能得到提升;
- 对于task的执行,可能需要创建对象。如果内存比较小,可能会导致频繁的JVM存内存满了,然后频繁的GC垃圾回收(minor GC和full GC),导致性能下降。内存加大之后,GC变少了,避免了性能下降,性能得到提升。