
# 调整Spark Core进程参数
#### 操作场景
Spark on Yarn模式下，有Driver、ApplicationMaster、Executor三种进程。在任务调度和运行的过程中，Driver和Executor承担了很大的责任，而ApplicationMaster主要负责container的启停。
因而Driver和Executor的参数配置对Spark应用的执行有着很大的影响，用户可通过如下操作对Spark集群性能做优化。
#### 操作步骤
1. 配置Driver内存。 
   Driver负责任务的调度，和Executor、AM之间的消息通信。当任务数变多，任务并行度增大时，Driver内存都需要相应增大。
   您可以根据实际任务数量的多少，为Driver设置一个合适的内存。
   - 将"spark-defaults.conf"中的"spark.driver.memory"配置项设置为合适大小。
   
   - 在使用spark-submit命令时，添加"--driver-memory MEM"参数设置内存。
   
   
   
   
2. 配置Executor个数。 
   每个Executor每个核同时能跑一个task，所以增加了Executor的个数相当于增大了任务的并发度。在资源充足的情况下，可以相应增加Executor的个数，以提高运行效率。
   - 将"spark-defaults.conf"中的"spark.executor.instance"配置项或者"spark-env.sh"中的"SPARK_EXECUTOR_INSTANCES"配置项设置为合适大小。
   
   - 在使用spark-submit命令时，添加"--num-executors NUM"参数设置Executor个数。
   
   
   
   
3. 配置Executor核数。 
   每个Executor多个核同时能跑多个task，相当于增大了任务的并发度。但是由于所有核共用Executor的内存，所以要在内存和核数之间做好平衡。
   - 将"spark-defaults.conf"中的"spark.executor.cores"配置项或者"spark-env.sh"中的"SPARK_EXECUTOR_CORES"配置项设置为合适大小。
   
   - 在使用spark-submit命令时，添加"--executor-cores NUM"参数设置核数。
   
   
   
   
4. 配置Executor内存。 
   Executor的内存主要用于任务执行、通信等。当一个任务很大的时候，可能需要较多资源，因而内存也可以做相应的增加；当一个任务较小运行较快时，就可以增大并发度减少内存。
   - 将"spark-defaults.conf"中的"spark.executor.memory"配置项或者"spark-env.sh"中的"SPARK_EXECUTOR_MEMORY"配置项设置为合适大小。
   
   - 在使用spark-submit命令时，添加"--executor-memory MEM"参数设置内存。
   
   
   
   
 
#### 示例
- 在执行spark wordcount计算中。1.6T数据，250个executor。 在默认参数下执行失败，出现Futures timed out和OOM错误。
  因为数据量大，task数多，而wordcount每个task都比较小，完成速度快。当task数多时driver端相应的一些对象就变大了，而且每个task完成时executor和driver都要通信，这就会导致由于内存不足，进程之间通信断连等问题。
  当把Driver的内存设置到4g时，应用成功跑完。
  

- 使用JDBCServer执行TPC-DS测试套，默认参数配置下也报了很多错误：Executor Lost等。而当配置Driver内存为30g，executor核数为2，executor个数为125，executor内存为6g时，所有任务才执行成功。
 
