首先,用户编写好的 spark 应用程序之后,打包成 Jar 包,通过 spark-submit 进行提交。最终转交给 SparkSubmit.class,通过提交模式可以找到对应的客户端启动类。这个客户端类启动好了之后,执行一些参数解析,执行 Jar 包处理等相关准备动作之后,就发送请求(ApplicationRegistion)给对应的资源调度系统的节点 Master。Master 首先找到一个空闲节点,来启动一个 Driver(Master 发送消息 LauchDriver 给 Worker),启动 Driver (启动 Driver 之后,启动这个 Job 需要的 Executor),解析和执行用户编写的应用程序 main 方法。首先执行的是 SparkContext 的初始化。然后执行各种操作算子,构建 DAG,最后触发 Action 提交到 Job。
- 应用程序在 Driver 端执行
- Driver 中执行应用程序,首先初始化 SparkContext
- 初始化 SparkContext ,会初始化三大组件 DAGScheduler,TaskScheduler,SchedulerBackEnd
- 在初始化 ScheduleBackEnd 时,会初始化两个通信组件 ClientEndpoint 和 DriverEndpoint
- ClientEndpoint 和 Master 打交道,负责任务提交和 Driver 状态汇报
- DriverEndpoint 和 Worker 中的 Executor 打交道,负责任务派发和跟踪 Task 执行状态
- DriverEndpoint 会发送 LaunchTask 命令给 ExecutorBackEnd
- ExecutorBackEnd 接收到命令之后,会调用 launchTask 方法来启动任务,其实就是封装一个 TaskRunner 的线程对象,提交给 Executor 的线程池来执行
- 整个过程,Executor 都会维持与 Driver 的心跳,整个过程中,Driver 也会维持和 Master 的心跳