Spark 性能调优之资源分配
在资源足够的情况下,分配更多的机器、CPU、内存,对性能的提升是显而易见的;
因此,进行性能调优的时候,首先第一步,我觉得,就是要来调节最优的资源配置;在这个基础之上,
如果说你的spark作业,能够分配的资源达到了你的能力范围的顶端之后,无法再分配更多的资源了,
公司资源有限;那么才是考虑去做后面的这些性能调优的点
性能调优的王道,就是增加和分配更多的资源,资源提升使得速度的提升是显而易见的;
资源分配
- 分配哪些
- executor 数量
- 每个 executor 的核心数
- 每个 executor 的内存
- driver 的内存
- 怎么分配
在 spark-submit shell 脚本提交时:
./bin/spark-submit \
--class cn.spark.sparktest.core.WordCountCluster \
--num-executors 3 \ 配置executor的数量
--executor-memory 100m \ 配置每个executor的内存大小
--executor-cores 3 \ 配置每个executor的cpu core数量
--driver-memory 100m \ 配置driver的内存
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
- 为什么会性能提升
- 增加 executor: 增加并行执行的能力
如果executor数量比较少,那么,能够并行执行的task数量就比较少,就意味着,我们的Application的并行执行的能力就很弱
比如有3个executor,每个executor有2个cpu core,那么同时能够并行执行的task,就是6个。6个执行完以后,再换下一批6个task。
增加了executor数量以后,那么,就意味着,能够并行执行的task数量,也就变多了。比如原先是6个,现在可能可以并行执行10个,甚至20个,100个。那么并行能力就比之前提升了数倍,数十倍。
相应的,性能(执行的速度),也能提升数倍~数十倍。
- 增加 executor 的核心数: 增加并行执行的能力
和增加 executor 数量一样,增加 executor 的核心数,意味着同事可以并行处理的 task 数量也增加了;
- 增加每个executor的内存量:
增加了内存量(相当于增加了执行内存和存储内存)以后,对性能的提升,有三点:
1、如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据(存储内存增加),将更少的数据写入磁盘,甚至不写入磁盘,减少了磁盘IO。
2、对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,
需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能(执行内存增加)。
3、对于task的执行,可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了, 然后频繁GC,垃圾回收,minor GC和full GC。
(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,性能提升(其他内存的增加)。
1354

被折叠的 条评论
为什么被折叠?



