在分布式环境下,Spark 集群采用的是master/slave结构。Master是对应集群中的含有master进程的节点,slave是集群中含有worker进程的节点。Master作为整个集群的控制器,负责整个集群的正常运行;worker相当于是计算节点,接收主节点命令与进行状态汇报,client作为用户的客户端负责提交应用。
在一个 Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个中央协调节点被称为驱动器(Driver)节点,与之对应的工作节点被称为执行器(executor)节点。驱动器节点可以和大量的执行器节点进行通信,它们也都作为独立的 Java 进程运行。驱动器节点和所有的执行器节点一起被称为一个 Spark 应用(application)。其中executor负责任务的执行;driver负责控制一个应用的执行。
Spark 应用通过一个叫作集群管理器(Cluster Manager)的外部服务在集群中的机器上启动。Spark 自带的集群管理器被称为独立集群管理器。Spark 也能运行在 Hadoop YARN 和Apache Mesos 这两大开源集群管理器上。
Spark集群部署后,需要在主节点和从节点分别启动master进程和worker进程,对整个集群进行控制。在一个spark应用的执行过程中,driver和worker是两个重要角色。Driver程序是应用逻辑执行的起点,负责作业的调度,即task任务的分支,而多个worker用来管理计算节点和创建executor并行处理任务。在执行阶段,driver会将task和task所依赖的file和jar包序列化后传递给对应的worker机器,同时executor对相应数据分区的任务进行处理。
具体如下图所示:
各个组件的介绍如下:
1)Clustermanager:在standalone模式中即为master(主节点),控制整个集群,监控worker。在yarn或者mesos模式中为资源管理器。
2)Worker:从节点,负责控制计算节点,启动executor或driver。在yarn模式中为nodemanager,负责计算节点的控制。
3)Driver:运行application的main()函数并创建sparkContext.
4)Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个application拥有独立的一组executors。
5)sparkContext:整个应用的上下文,控制应用的生命周期。
6)RDD DAG:spark的基本计算单元是RDD,一组RDD可形成执行的有向无环图RDD DAG。
7)DAG Scheduler:根据作业(Job)构建基于stage的DAG,并提交stage给taskscheduler。
8)Taskscheduler:将任务(Task)分发给executor执行。
9)sparkEnv:线程级别的上下文,存储运行时的重要组件的引用。
sparkEnv内创建并包含如下一些重要组件的引用:
10)Mapoutputtracker:负责shuffle元信息的存储。
11)BroadcastManager:负责广播变量的控制与元信息的存储
12)Blockmanager:负责存储、管理、创建和查找块。
13)metricsSystem:负责运行时性能指标信息。
14)sparkConf;负责存储配置信息。
Spark处理任务的整体流程:
client提交应用,master找到一个worker启动driver,driver向master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为stage的有向无环图提交给taskscheduler,由taskscheduler提交任务到executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。