基本上,在一定范围之内,增加资源与性能的提升,是成正比的, 就是要来调节最优的资源配置 如果资源达到了限制, 就需要进行逻辑优化
一、资源分配 1.1、分配哪些资源?SparkContext,DAGScheduler,TaskScheduler,会将我们的算子,切割成大量的task,提交到Application的executor上面去执行。
- 1、如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘。减少了磁盘IO。
- 2、对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。
- 3、对于task的执行,可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,然后频繁GC,垃圾回收,minor GC和full GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,速度变快了。
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://nn1:7077 \
--num-executors 1 \ 配置executor的数量
--executor-memory 100M \ 配置每个executor的内存大小
--executor-cores 1 \ 配置每个executor的cpu core数量
--driver-memory 100M \ 配置driver的内存(影响不大)
/usr/hdp/2.6.1.0-129/spark/lib/spark-examples-1.6.3.2.6.1.0-129-hadoop2.7.3.2.6.1.0-129.jar 100
1.3、调节到多大,算是最大呢?
1.3.1、Spark Standalone
你应该清楚你的集群每台机器还能够给你使用的,大概有多少内存,多少cpu core;那么,设置的时候,就根据这个实际的情况,去调节每个spark作业的资源分配。比如说你的每台机器能够给你使用4G内存,2个cpu core;20台机器;executor,20;4G内存,2个cpu core,平均每个executor。
1.3.2、Yarn资源队列。资源调度。应该去查看,你的spark作业,要提交到的资源队列,大概有多少资源?500G内存,100个cpu core;executor,50;10G内存,2个cpu core,平均每个executor。