Spark性能调优第一步,就是为任务分配更多的资源,在一定的范围内,增加资源的分配与性能的提升是成正比的。
资源的分配在使用脚本提交Spark任务时指定,标准的Spark任务提交脚本如下所示
/usr/opt/modules/spark/bin/spark-submit \
--class com.star.spark.Stars\
--num-executors 80 \
--driver-memory 6g \
--executor-memory 6g \
--executor-cores 3 \
/usr/opt/modules/spark/jar/spark.jar \
名称 |
说明 |
--num-executors |
配置Executor的数量 |
--driver-memory |
配置Driver内存(影响不大) |
--executor-memory |
配置每个Executor的内存大小 |
--executor-cores |
配置每个Executor的CPU co调节 |
调节原则:尽量将任务分配的资源调节到可以使用资源的最大限度
对于具体资源的分配,我们分别讨论Spark的两种Cluster运行模式
1.Standalone模式
在提交任务前,一定知道或者可以从运维部门获取到你可以使用的资源情况,在编写submit脚本的时候,就根据可用的资源情况进行资源的分配,比如说集群有15台机器,每台机器为8G内存,2个CPU core,那么就指定15个Executor,每个Executor分配8G内存,2个CPU core。
2.Yarn模式
由于Yarn使用资源队列进行资源的分配和调度,在表写submit脚本的时候,就根据Spark作业要提交到的资源队列,进行资源的分配,比如资源队列有400G内存,100个CPU core,那么指定50个Executor,每个Executor分配8G内存,2个CPU core。
名称 |
解析 |
增加Executor·个数 |
在资源允许的情况下,增加Executor的个数可以提高执行task的并行度。比如有4个Executor,每个Executor有2个CPU core,那么可以并行执行8个task,如果将Executor的个数增加到8个(资源允许的情况下),那么可以并行执行16个task,此时的并行能力提升了一倍。 |
增加每个Executor的CPU core个数 |
在资源允许的情况下,增加每个Executor的Cpu core个数,可以提高执行task的并行度。比如有4个Executor,每个Executor有2个CPU core,那么可以并行执行8个task,如果将每个Executor的CPU core个数增加到4个(资源允许的情况下),那么可以并行执行16个task,此时的并行能力提升了一倍。 |
增加每个Executor的内存量 |
在资源允许的情况下,增加每个Executor的内存量以后,对性能的提升有三点:
|
3.生产环境Spark submit脚本配置
/usr/local/spark/bin/spark-submit \
--class com.star.spark.WordCount \
--num-executors 80 \
--driver-memory 6g \
--executor-memory 6g \
--executor-cores 3 \
--master yarn-cluster \
--queue root.default \
--conf spark.yarn.executor.memoryOverhead=2048 \
--conf spark.core.connection.ack.wait.timeout=300 \
/usr/local/spark/spark.jar
名称 |
数值 |
--num-executors |
50-100 |
--driver-memory |
1G-5G |
--executor-memory |
6G-10G |
--executor-cores |
3 |
--master | 实际生产环境一定要用yarn-cluster |