1. driver进程始终对应用中所有的executor进程有完整的记录。每个executor进程代表一个能够处理任务和存储RDD 数据的进程。
2.Spark driver程序会根据当前的executor节点集合,尝试把所有任务基于数据所在位置分配给合适的executor进程。当任务执行时,executor进程会把缓存数据存储起来,而driver进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。executor进程有两大作用:第一,它们负责运行组成Spark 应用的任务,并将结果返回给driver进程;第二,它们通过自身的块管理器(Block Manager),为用户程序中要求缓存的RDD 提供内存式存储。RDD 是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
3.在本地模式下,Spark driver程序和各executor程序在同一个Java 进程中运行。这是一个特例;executor程序通常都运行在专用的进程中。
4.集群上运行Spark 应用的详细过程:
(1) client用户通过spark-submit 脚本提交应用。
(2) spark-submit 脚本启动driver程序,driver调用用户定义的main() 方法。
(3) driver与集群管理器通信,申请资源以启动executor节点。
(4) 集群管理器(eg,Spark自身的cluster manager或Yarn的resource manager等)为driver程序启动executor节点。
(5) driver进程执行用户应用中的操作。根据程序中所定义的对RDD 的转化操作和行动操作,driver节点把工作以任务的形式发送到executor进程。
(6) 任务在executor程序中进行计算并保存结果。
(7) 如果driver程序的main() 方法退出,或者调用了SparkContext.stop(),driver程序会终止executor进程,并且通过集群管理器释放资源。
5.使用spark-submit部署应用
# 使用独立集群模式提交Java应用
$ ./bin/spark-submit \
--master spark://hostname:7077 \
--deploy-mode cluster \
--class com.databricks.examples.SparkExample \
--name "Example Program" \
--jars dep1.jar,dep2.jar,dep3.jar \
--total-executor-cores 300 \
--executor-memory 10g \
myApp.jar "options" "to your application" "go here"
# 使用YARN客户端模式提交Python应用
$ export HADOP_CONF_DIR=/opt/hadoop/conf
$ ./bin/spark-submit \
--master yarn \
--deploy-mode client \
--name "Example Program" \
--py-files somelib-1.2.egg,otherlib-4.4.zip,other-file.py \
--queue exampleQueue \
--num-executors 40 \
--executor-memory 10g \
my_script.py "options" "to your application" "go here"