1.分配更多资源

       性能调优的王道,就是增加和分配更多的资源,性能和速度上会得到很大提升。基本上,在一定的范围之内,增加的资源和性能的提升是成正比的。所以,性能调优的最重要的两步:
       第一步是增加资源,调节最优的资源配置;
       第二步,能够分配的资源达到能力范围的顶端后,无法再分配更多的资源,需要考虑下面几个性能调优的点。

2.性能调优的点

2.1分配哪些资源

executor
cup per executor
memory per executor
driver memory

2.2哪里分配资源

/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 \

2.3调节到多大才算最大

        第一种,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。

3.为什么调节了资源之后,性能可以提升

3.1增加executor

         如果executor的数量少,那么能够 并行执行的task数量就会变少,这就意味着Application的并行执行能力比较弱。比如有3个executor,每个executor有2个cpu core,那么同时能够执行的task数量为6个。执行完当前的6个task后,再执行下一批6个task。增加了executor后,能够并行执行的task的数量就会变多,就以为着性能得到提升。

3.2增加每个executor的cpu core

         根据上面一点,Application的并行执行能力跟每个executor的cpu core数量有关。比如,原来有20个executor,每个executor有2个cpu core,那么并行执行的task数量为40个;
        现在还是20个executor,把每个executor的数量增加到5个,那么并行执行的task数量为100个,性能提升了2.5倍。

3.3增加每个executor的内存

         增加每个executor的内存,对性能的提升有3点:
        1.如果需要对RDD进行cache,更多的内存意味着可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘,减少了磁盘IO,性能得到提升;
        2.对于shuffle操作,reduce端需要内存,来存放拉取过来的数据并进行聚合。如果内存不够,会写入磁盘。如果给executor分配更多的内存,那么需要写入磁盘的数据就会变少,甚至没有数据需要写入磁盘,减少了磁盘IO,性能得到提升;
       3.对于task的执行,可能需要创建对象。如果内存比较小,可能会导致频繁的JVM存内存满了,然后频繁的GC垃圾回收(minor GC和full GC),导致性能下降。内存加大之后,GC变少了,避免了性能下降,性能得到提升。