Spark运行原理
名词介绍
| Cluster Manager | Spark资源管理器 |
|---|---|
| Worker | 作业任务的工作节点 |
| Driver Program | 任务控制节点 |
| Executor | 负责执行具体任务的进程 |
| RDD | 弹性分布式数据集 |
| DAG | 有向无环图 |
| Application | Spark应用程序 |
| Job | 作业 |
| task | 运行在Executor的任务线程集 |
| stage | 作业调度的基本单位 |
Spark运行流程图——网图侵图删
- 我们写的Spark应用程序,在提交执行时,首先会启动一个Driver进程(每个应用程序都会对应一个Driver进程),
Driver启动后,会创建一个Spark Context对象,这个context对象就是程序的执行入口,必须第一定义,就像Java的main函数,这是程序的入口。构建Spark Context对象后,Context对象会向Cluster Manager节点申请运行资源环境(CPU,内存等),因为Cluster掌握整个集群的资源,它会首先找到离数据几点近的,资源利用率低的节点优先分配。Cluster节点会将Worker Node节点分配给Driver,具体是,Cluster节点告诉Worker节点已经被分配给Driver后,Worker节点会首先启动Executor进程,准备好基本运行环境后,会通知Driver,表示资源准备到位。也会向Cluster定时发送心跳信息,告诉资源信息。Driver收到Worker的信息后,它会根据应用程序构建DAG有向无环图,然后交给DAG调度器根据宽窄依赖划分阶段,一个阶段就是一个TaskSet(任务集合),这些任务集合会交给Task调度器,由Task去进行分配到Worker上的Executor进程中执行。Executor进程拿到具体的任务并执行,期间Executor进程会定时和Driver保持通信,如果任务在Executor进程执行任务时,出现错误(具体工作的是Executor下的线程),线程会重新从头开始计算,这个过程重复三次后,依旧错误,这个时候,Executor会告诉Driver运行出错,然后Task调度器会重新再发给他一次应用程序,如果三次后依旧出错,那么Driver会重新构建DAG图,重新分解,再次分发给Executor进程执行,如果再次出错,那么整个应用程序就会结束。如果程序执行成功,Exeutor会将结果发给Driver进程,然后告知Cluster节点任务完成,接着就是运行资源释放清零,任务彻底完成。
Tips:Spark申请运行资源时,是一次性分发到位的,就像我的应用程序需要2核2G内存一样,必须全部满足,否则不执行,这和MR有着本质不同的,MR是拿一部分资源先运行,等不够了,再次申请资源。这样资源利用率很高,但在效率上没有Spark高,同样的,Spark在分布式运行时,当某一部分任务完成时,并不是立即是释放资源,而是等所有任务都完成时,才一次性释放所有资源。



