给足资源

分配更多资源:性能调优的王道,就是增加和分配更多的资源,性能和速度的提升是显而易见的;基本上,在一定的范围内,增加资源与性能的提升是成正比的。写成一个复杂的spark作业之后,性能调优的第一步,就是要调节最优的资源配置,在这基之上,如果spark作业能够分配的资源达到你能力范围的顶端,无法再分配更多资源了,公司资源有限,那么才考虑做后面的调优的点

搭建集群

 在spark安装包的conf下spark-env.sh

SPARK_WORKER_CORES
SPARK_WORKER_MEMORY
SPARK_WORKER_INSTANCE

提交任务时 

在提交任务时使用 spark-submit  --master xxx 可设置参数来分配资源

--executor-cores
--executor-memory
--total-executor-cores
--num-executors
    这个配置之前没有见过,是因为我们一直在用standalone模式运行,在standalone模式中默认一个worker只有一个executor,
但在工作中很少有人用standalone模式。在yarn模式下,Application只会启动2个executor,不足我们使用,需要这个配置修改

 提高并行度 

并行度:其实就是指:spark作业中,各个stage的task的数量,也就是代表了spark在各个阶段的并行度

如果不调节并行度,导致并行度过低,会怎样?

假设:现在spark作业中有50个executor,每个executor有10内存,每个executor有3个cpu core。已将达到了集群或者yarn的资源队列上限。但task没有设置,或者设置的很少,比如就设置了100个task。也就是说:总数有150个cpu core可以并行运行,但每个executor平均分配到2个task,剩了一个cpu core,就浪费掉了。

资源虽然分配到了,但问题是,并行度没有与资源匹配,导致分配的资源都浪费掉了

如何提高并行度?

:一个core一般分配2~3个task,每一个task一般处理1G数据

  1. 如果读取的数据在HDFS上,降低block块的大小
  2. sc.textFile(path,numPartitions)
  3. sc.parallelize(list,numPartitions) 一般用于测试
  4. coalesce、repartition可以提高RDD的分区数。
  5. 配置信息:
  1. spark.default.parallelism  not set (默认executor core的总个数)
  2. spark.sql.shuffle.partitions 200:sparksql发生shuffle的时候 我们可以配置这个属性 增大并行度 一般用于join操作
  1. 自定义分区