其实性能优化的王道,就是增加更多的资源
1. 分配哪些资源 2. 在哪里分配这些资源 3. 为什么多分配了这些资源以后,性能会得到提升?
1. executor、cpu per executor、memory per executor、driver memory 2. 在生产环境中,提交spark作业,用的spark-submit shell脚本,里面调整对应的参数 /usr/local/spark/bin/spark-submit\ --class cn.spark.sparktest.core.WordCountCluster\ --num-executor 3\ //配置executor的数量 --driver-memory 100m\ 配置driver的内存 --executor-memory 100m\ 配置每个executor的内存大小 --executor-cores 3\ 配置每个executor的cpu core数量 /usr/local/SparkTest.jar\
3. 调节多大,算最优 第一种,如果使用的是Spark Standalone这种模式,公司集群上,搭建了一套Spark集群,你心里应该清楚每台机器还能够给你使用的,大概有多少内存,多少cpu core,那么设置的时候,就根据这个实际的情况,去调节每个spark作业的资源分配,比如你的每台机器能够给你使用4G内存,2个cpu Core ;20台机器,如果你同一时间只用一个spark作业 那么你就可以分配20个executor,4G内存,2个cpu core
第二种,基于yarn集群,资源队列,资源调度。应该去查看,你的spark作业,要提交到资源队列,大概有多少资源?500G内存,100个cpucore;executor 50个,平均下来,每个executor10G内存,2个cpucore。
一个原则,能使用的资源有多大,那么你去调节到最大的数量(executor数量,几十个到几百个不等,executor内存,executorcpu core) 为什么我们要给executor更多的资源 增加executor:如果executor数量比较少,那么,能够并行执行的task数量就比较少,就意味着,我们的Application的并行执行的能力很弱 比如有3个executor,每个executor有俩个cpu core,那么同时能够并行执行的task,就是6个,6个执行完以后,再换下一批6个task 增加了executor数量后,就意味着能够并行执行的task数量就变多了,
增加每个executor的cpu core也是增加了task执行的并行能力 增加每个executor的内存量,增加了内存量对性能的提升大致俩点: 第一点:如果需要对RDD进行cache,那么更多的内存就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘 第二点:对于task的执行,可能会创建很多对象,如果内存比较小,可能会造成频繁的导致JVM堆内存满,然后GC minor GC 和 full GC 内存加大后,带来更少的GC,垃圾回收,避免速度变慢 第三点:对于shuffle操作,reduce端会需要内存来存放数据,并进行聚合,如果内存不够,也会写入磁盘,如果给executor分配更多的内存后,就有更少的数据写入磁盘,甚至不用写入磁盘。提高速度
|