讲一下spark 的运行架构
讲一下spark 的运行架构
👉Cluster Manager(Master):在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器
👉 Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
👉 Driver: 运行Application 的main()函数
👉 Executor:执行器,是为某个Application运行在worker node上的一个进程
1、启动:用户程序启动SparkContext
,是程序的总入口,初始化过程中启动DAGScheduler
作业调度和 TaskScheduler
任务调度。
2、生成作业:DAGScheduler
:根据shuffleDependency
将作业划分为不同的stage
,根据 RDD之间的依赖关系,宽依赖和窄依赖,划分原则就是遇见窄依赖就放进当前stage,遇到宽依赖则断开。(相当于shuffle是前后的stage分界线)每一个stage里面都会划分一个taskset,也就是数据集,而DAGSchedule的下一个任务就是将这个TaskSet传给TaskSchedule(在最后一个 stage划分结束,就会触发作业的提交)。
3、提交任务集: TaskScheduler
:分配 Task到哪一个executor上去执行,SchedulerBackend
配合TaskScheduler
完成具体任务的资源分配。
4、任务执行:Executor
:实际任务的运行最终都 Execter 类来执行,对每个任务创建一个TaskRunner类,交给线程池去实现。
spark-submit
提交代码,执行new SparkContext()
,在 SparkContext 里构造DAGScheduler
和TaskScheduler
。- TaskScheduler 会通过后台的一个进程,连接 Master,向 Master 注册 Application。
- Master 接收到 Application 请求后,会使用相应的资源调度算法,在 Worker 上为这个 Application 启动多个 Executer。
- Executor 启动后,会自己反向注册到 TaskScheduler 中。 所有 Executor 都注册到 Driver 上之后,SparkContext 结束初始化,接下来往下执行我们自己的代码。
- 每执行到一个 Action,就会创建一个 Job。Job 会提交给 DAGScheduler。
- DAGScheduler 会将 Job划分为多个 stage,然后每个 stage 创建一个 TaskSet。
- TaskScheduler 会把每一个 TaskSet 里的 Task,提交到 Executor 上执行。
- Executor 上有线程池,每接收到一个 Task,就用 TaskRunner 封装,然后从线程池里取出一个线程执行这个 task。(TaskRunner 将我们编写的代码,拷贝,反序列化,执行 Task,每个 Task 执行 RDD 里的一个 partition)
- 点赞
- 收藏
- 关注作者
评论(0)