Spark 执行流程 解析
1、我们提交Spark程序通过 spark-submit (shell)提交到Spark集群中 我们提交程序后 会创建一个Driver 进程
2、Driver 构造SparkConf 初始化SparkContext ,SparkContext 构建 DAGScheduler和TaskScheduler
3、TaskScheduler 初始化后会调用会去连接Master,向Master注册Application
4、Master 接受TaskScheduler 注册的请求之后会调用自己的资源调度算法,在spark集群的Worker上,为这个Application分配多个Executor
5、Master 并通知Worker启动Executor进程,Executor启动后会反向注册到 TaskScheduler
6、Driver继续执行 我们提交的(JAR)代码,读取文件生成RDD,
7、Driver每执行一个Action都会创建一个Job提交给DAGScheduler
8、DAGScheduler Job会为每个Job Stage划分算法,划分多个Stage,然后每个Stage 会创建一个TaskSet
9、DAGScheduler 会将TaskSet提交到TaskScheduler,TaskScheduler会将每个TaskSet里面的Task,提交到Executor
10、Executor每接受到一个Task后都会用TaskRunner封装,然后从线程池中获取一个线程来执行TaskRunner
11、TaskRunner 将我们编写的代码,也就是要执行的算子以及函数,拷贝、反序列化,然后执行Task (Task有两种 ShuffleMapTask和ResultTask,只有最后一个Stage是ResultTask,其他都是ShuffleMapTask)
总结 :整个Spark 应用程序的执行,就是Stage分批次作为taskset提交到executor执行 针对RDD的一个partition,执行我们定义的算子和函数,以此类推直到所有操作执行完为止
Yarn-Cluster 运行模式
1、spark-submit提交 到ResourceManager
2、ResourceManager 分配一个Container 在某个NodeManager上,启动ApplicationMaster
3、ApplicationMaster(相当于是Driver)找到ResourceManager请求Container,启动Executor
4、ResourceManager 分配一批Container,用于启动Executor
5、ApplicationMaster 连接分配的NodeManager 启动 Executor
6、Executor 反向向ApplicationMaster注册
7、ApplicationMaster 开始执行我们编写的代码,每执行一个Action 操作都会创建一个Job 提交给DAGScheduler
8、DAGScheduler Job会根据Stage划分算法,划分多个Stage,每个Stage都会创建一个TaskSet
9、DAGScheduler会将TaskSet提交给TaskScheduler
10、TaskScheduler会将TaskSet里面的每个Task提交到Executor上执行
11、Executor接受到Task后都会用一个TaskRunner来进行封装,然后从线程池中获取一个线程来执行这个Task
12、Task分为两种 一个是ShuffeMapTask和ResultTask,只有最后一个Task是ResultTask其他都是ShuffMapTask
基于Yarn-Client
1、spark-submit提交 到ResourceManager 会在本地启动Driver
2、ResourceManager 分配一个Container 在某个NodeManager上,启动ApplicationMaster(这里的AM其实只是ExecutorLanucher)
3、ApplicationMaster向ResourceManager申请container 启动Executor
4、ResourceManager 分配一批Container,
5、ApplicationMaster 连接其他NodeManager 启动Executor
6、Executor 启动后反向注册 到本地提交的Driver进程上 而不是注册到ApplicationMaster上