目录
1. 几个基本概念
(1)job:包含多个 task 组成的并行计算,往往由 action 催生。
(2)stage:job 的调度单位。
(3)task:被送到某个 executor 上的工作单元。
(4)taskSet:一组关联的,相互之间没有 shuffle 依赖关系的任务组成的任务集。
一个应用程序由一个 driver program 和多个 job 构成;一个 job 由多个 stage 组成;一个 stage 由多个没有 shuffle 关系的 task 组成。
2. spark 应用程序的运行架构
(1)简单点说
由 driver 向集群申请资源,集群分配资源,启动 executor。driver 将 spark 应用程序的代码和文件传送给 executor。executor 上运行 task,运行完之后将结果返回给 driver 或者写入外界。
(2)复杂点说
提交应用程序,构建 sparkContext,构建 DAG 图,提交给 scheduler 进行解析,解析成一个个 stage,提交给集群,由集群任务管理器进行调度,集群启动 spark executor。driver 把代码和文件传给 executor。executor 进行各种运算完成 task 任务。driver 上的 block tracker 记录 executor 在各个节点上产生的数据块。task 运行完之后,将数据写入 HDFS 上或者其他类型数据库里。
(3)全面点说
spark 应用程序进行各种 transformation 的计算,最后通过 action 触发 job。提交之后首先通过 sparkContext 根据 RDD 的依赖关系构建 DAG 图,DAG 图提交给 DAGScheduler 进行解析,解析时是以 shuffle 为边界,反向解析,构建 stage,stage 之间也有依赖关系。这个过程就是对 DAG 图进行解析划分 stage,并且计算出各个 stage 之间的依赖关系。然后将一个个 TaskSet 提交给底层调度器,在 spark 中是提交给 taskScheduler 处理,生成 TaskSet manager,最后提交给 executor 进行计算,executor 多线程计算,计算完反馈给 TaskSetmanager,再反馈给 taskScheduler,然后再反馈回 DAGScheduler。全部运行完之后写入数据。
(4)更加深入理解
应用程序提交后,触发 action,构建 sparkContext,构建 DAG 图,提交给 DAGScheduler,构建 stage,以 stageSet 方式提交给 TaskScheduler,构建 taskSet Manager,然后将 task 提交给 executor 运行。executor 运行完 task 后,将完成信息提交给 schedulerBackend,由它将任务完成的信息提交给 TaskScheduler。TaskScheduler 反馈信息给 TaskSetManager,删除该 task 任务,执行下一个任务。同时 TaskScheduler 将完成的结果插入到成功队列里,加入之后返回加入成功的信息。TaskScheduler 将任务处理成功的信息传给 TaskSet Manager。全部任务完成后 TaskSet Manager 将结果反馈给 DAGScheduler。如果属于 resultTask,交给 JobListener;如果不属于 resultTask,保存结果。
3. 在集群上运行 spark 应用的详细过程
(1)用户通过 spark-submit 脚本提交应用。
(2)spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。
(3)驱动器程序与集群管理器通信,申请资源以启动执行器节点。
(4)集群管理器为驱动器程序启动执行器节点。
(5)驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器程序。
(6)任务在执行器程序中进行计算并保存结果。
(7)如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。