standalone模式
- 在客户端提交Application,Driver在客户端启动;
- 客户端向Master申请资源,Master返回Worker节点;
- Driver向Worker节点发送task,监控task执行,回收结果。
- 在客户端提交Application,客户端向Master申请启动Driver;
- Master随机在一台Worker中启动Driver;
- Driver启动后,向Master申请资源,Master返回资源;
- Driver发送task,监控task执行,回收结果。
综上,Driver的功能:
- 发送task;
- 监控task;
- 申请资源;
- 回收结果。
Yarn模式
Yarn与Standalone是平级关系,各自相互独立。
修改spark-env.sh.template为spark-env.sh,添加export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop,使得spark找到yarn所需配置。
- 在客户端提交Application,Driver在客户端启动;
- 客户端向ResourceManager申请启动ApplicationMaster(Driver);
- ResourceManager收到请求后,随机在一台NodeManager节点上启动ApplicationMaster;
- ApplicationMaster启动后,向ResourceManager申请资源,用于启动Excutor;
- ResourceManager收到请求后,返回给ApplicationMaster一批NodeManager节点;
- ApplicationMaster连接NodeManager,启动Excutor;
- Excutor启动后,反向注册给ApplicationMaster(Driver);
- ApplicationMaster(Driver)发送task,监控task,回收结果。
- 在客户端提交Application,客户端向ResourceManager申请启动ApplicationMaster;
- ResourceManager收到请求后,随机在一台NodeManager节点上启动ApplicationMaster(Driver);
- ApplicationMaster启动后,向ResourceManager申请资源,用于启动Excutor;
- ResourceManager收到请求后,返回给ApplicationMaster一批NodeManager节点;
- ApplicationMaster连接NodeManager,启动Excutor;
- Excutor启动后,反向注册给ApplicationMaster(Driver);
- ApplicationMaster(Driver)发送task,监控task,回收结果。
综上,ApplicationMaster(Driver)的功能:
- 申请资源;
- 启动Excutor;
- 任务调度。
资源调度与任务调度
资源调度:
- 启动集群,Worker向Master汇报资源,Master掌握了集群资源;
- 当new SparkContext时,创建两个对象DAGScheduler和TaskScheduler;
- TaskScheduler向Master申请资源;
- Master收到请求后,找到满足资源的Worker,启动Excutor;
- Excutor启动后,反向注册给TaskScheduler,Driver掌握了一批计算资源;
务调度(接资源调度后):
- Application中有一个action算子就有一个Job,Job中有RDD,RDD会形成DAG有向无环图;
- DAGScheduler负责将每个Job中的DAG按照宽窄依赖切割成stage,将stage以TaskSet形式提交给TaskScheduler;
- TaskScheduler负责遍历TaskSet,拿到一个个task,将task发送到Excutor中的ThreadPool中执行;
- TaskScheduler监控task执行,回收结果;
综上:
- TaskScheduler可以重试发送失败的task3次,如果依然失败,由DAGScheduler重试stage,重试4次,如果依然失败,则job失败,Application失败;
- TaskScheduler不仅可以重试失败的task,而且可以重试执行缓慢的task,这是Spark中的推测执行机制,默认关闭,对于ETL业务场景要关闭;
- 如果遇到Application一直执行不完,考虑1)数据倾斜问题;2)推测执行是否开启