架构对于技术来说,是技术的灵魂,它体现了技术对于需求的取舍,决定了技术的优点与缺点。Spark的架构也是如此,在分布式技术中,架构无非两种,即主从架构(master-slave)和点对点架构(p2p), Spark采取了前者,也是MapReduce的选择——主从架构。
Spark程序的入口是Driver中的SparkContext。与Spark 1.x相比,在Spark 2.0中,有一个变化是用SparkSession统一了与用户交互的接口,曾经熟悉的SparkContext、SqlContext、HiveContext都是SparkSession的成员变量,这样更加简洁。SparkContext的作用是连接用户编写的代码与运行作业调度和任务分发的代码。
当用户启动一个Driver程序时,会通过SparkContext向集群发出命令,Executor会遵照指令执行任务。一旦整个执行过程完成,Driver结束整个作业。ClusterManager负责所有Executor的资源管理和调度,根据底层资源管理和调度平台的不同,ClusterManager可以有多种选择,对应了多种资源管理平台,如YARN的ResourceManager与Mesos的ClusterManager,此外Executor也会根据资源管理平台的不同运行在不同的容器中。
Driver解析用户编写的代码,并序列化字节级别的代码,这些代码将会被分发至将要执行的Executor上。当执行Spark作业时,这些计算过程实际上是在每个节点本地计算并完成。
首先Driver根据用户编写的代码生成一个计算任务的有向无环图(Directed Acyclic Graph, DAG),接着,DAG会根据RDD(弹性分布式数据集)之间的依赖关系被DAGScheduler切分成由Task组成的Stage(TaskSet), TaskScheduler会通过ClusterManager将任务调度到Executor上执行。在DAG中,每个Task的输入就是一个Partition(分区),而一个Executor同时只能执行一个Task,但一个Worker(物理节点)上可以同时运行多个Executor。
在Spark的架构中,Driver主要负责作业调度工作,Executor主要负责执行具体的作业计算任务,ClusterManager主要负责资源管理和调度,Driver中还有几个重要的组件——SparkContext、DAGScheduler、TaskScheduler。Driver是整个架构中最重要的角色,它通过监控和管理整个执行过程保证了一切按照计划正常运行,此外它还在Spark容错中起到了重要的作用。
在MapReduce这类型的计算框架中,中间结果的传输是整个计算过程中最重要的一个步骤,Spark也是如此,在Spark作业中,这也是Stage划分的依据,我们称之为数据混洗(Shuffle)。