《Learning Spark》第七章:Spark集群运行
2020/07/11 -
引言
本章节属于对Spark的运行架构进行简单介绍的部分,通过对其底层的运行基础进行讲解,这部分讲解可以对底层的运行原理有更深入的理解,后续进行调优会更方便。比如说,我之前一直纠结的(其实,当时也学会了,但是没有记录,所有还是都忘了),worker在执行过程中的身份,然后资源如何分配会更好,这些内容。
(当前2020年,spark已经到了3.0版本,是否这本书的内容已经过期,或者部分不适用,暂时不清楚,需要进一步了解)
运行架构
在分布式运行的模式下,spark采用主从的架构,由driver作为中心协调的角色,驱动(driver)和执行器共同组成了一个spark应用。同时还有一个外部服务来辅助,就是集群管理,例如yarn,mesos,或者spark自带的standalone模式。
驱动器(driver)
驱动器是用户模式下的程序,也是用户与应用进行交互的入口,例如spark-shell启动之后,就是一个driver。driver的任务主要是接受用户的命令,然后将这些命令转化为相应的任务,然后在执行器上进行调度任务。用户可以执行的操作就是之前提到的那些,创建RDD,进行转化,数据留存等。他主要负责两个任务:
-
将用户的程序转化为任务(tasks)
任务作为最小的执行单元,需要driver先把用户的程序进行转化:将程序创建为一个逻辑的操作DAG,然后将其转化为物理执行计划,执行计划又分为stages,stages由一个或多个task组成。tasks是机器执行的实际部分。 -
在执行器上进行调度
基于实际的执行计划,driver需要在执行器上协调任务。当执行器启动之后,他们首先向driver注册自己,所以driver对于应用过程中,所有的执行器的运行状态以及其所存储的RDD都很清楚。基于数据所在位置,driver将任务分发给最合适的地点。同时,如果是缓存过的数据,也会寻找最好的位置来执行它。
其实这里由一个疑问,我一直以为这些工作都是cluster manager来做的,但是这里说白了,其实是driver在做。
执行器
执行器也是两个工作目的,1)执行任务,task作为最小单位 2)缓存RDD
Spark应用的运行过程
1)用户提交应用(spark-submit)
2)spark-submit启动驱动程序并且执行用户的操作
3)driver程序与机器管理器进行沟通资源情况来启动执行器
4)集群管理器代表驱动程序启动执行器(这里跟我理解的不一样)
5)driver将用户的程序转化为最终的task单位,并将其发往执行器
6)执行器执行任务,并返回结构
7)如果driver的main停止,或者调用了sc.stop(),这个应用也就结束了,然后释放资源。
这完整的执行过程了;了解了这些之后,对后续进行调优等内容才能更轻松。