A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

其实性能优化的王道,就是增加更多的资源


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分配更多的内存后,就有更少的数据写入磁盘,甚至不用写入磁盘。提高速度



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马