一、目前Spark最为常用户的运行模式有四种:
1)local:本地线程方式运行,主要用于开发调试Spark应用程序;
2)Standalone:利用Spark自带的资源管理与调度器运行Spark集群,采用Master/Slave结构。若想避免单点故障可以采用ZooKeeper实现高可靠性(High Availiabilty);
3)Mesos:Apache著名的资源管理框架Mesos,该集群运行模式将资源管理交给Mesos,Spark只负责任务调度与计算;
4)YARN:Hadoop资源管理器Yarn,资源管理交给Yarn而Spark只负责任务调度与计算部分。技术较为成熟、最为常用,Spark与Hadoop生态圈的完美结合,组成强大的集群,较为流行
二、Spark应用程序执行过程中的术语
Term(术语) |
Meaning(解释) |
Application |
运行于Spark上的用户程序,由集群上的一个driver program(包含SparkContext对象)和多个executor线程组成 |
Application jar |
Jar包中包含了用户Spark应用程序,如果Jar包要提交到集群中运行,不需要将其它的Spark依赖包打包进行,在运行时 |
Driver program |
包含main方法的程序,负责创建SparkContext对象 |
Cluster manager |
集群资源管理器,例如Mesos,Hadoop Yarn |
Deploy mode |
部署模式,用于区别driver program的运行方式:集群模式(cluter mode),driver在集群内部启动;客户端模式(client mode),driver进程从集群外部启动 |
Worker node |
工作节点,集群中可以运行Spark应用程序的节点 |
Executor |
Worker node上的进程,该进程用于执行具体的Spark应用程序任务,负责任务间的数据维护(数据在内存中或磁盘上)。不同的Spark应用程序有不同的Executor |
Task |
运行于Executor中的任务单元,Spark应用程序最终被划分为经过优化后的多个任务的集合(在下一节中将详细阐述) |
Job |
由多个任务构建的并行计算任务,具体为Spark中的action操作,如collect,save等) |
Stage |
每个job将被拆分为更小的task集合,这些任务集合被称为stage,各stage相互独立(类似于MapReduce中的map stage和reduce stage),由于它由多个task集合构成,因此也称为TaskSet |
各Spark应用程序以相互独立的进程集合运行于集群之上,由SparkContext对象进行协调,SparkContext对象---应用程序的入口,亦被称为Driver Program,SparkContext可以与不同各类的集群资源管理器打交道,比如HadoopYarn、ApacheMesos等等,从而分配进程所需要的资源,获取到集群运行的所需要的资源后SparkContextuqf得到的集群中其它工作节点(WorkerNode)上对应的Executors(不同的Spark应用程序有不同的Excutors,它们之间是独立的进程,Excutor为应用程序提供分布式计算及数据存储功能),之后 SparkContext将应用程序代码分发到各个Executor,最后将任务(Task)分配给Executors执行。
三、SparkJob的运行原理
spark-submit提交Spark应用程序后,其执行流程如下:
1、创建SparkContext对象,然后SparkContext会向Cluster Manager(集群资源管理器,eg:Yarn、Standalone、Mesos等)申请资源;
2、资源管理器在worker node上创建executor并分配资源(CPU、内存等),后期executor会定时向资源管理器发送心跳信息;
3、SparkContext启动DAGScheduler将提交的作业(job)转化成若干Stage,各Stage构成DAG(Directed Acyclic Grapth有向无环图),各个Stage包含若干task,这些task的集合称为TaskSet;
4、TaskSet发送给TaskSet Scheduler,TaskSet Scheduler将Task发送给对应的Executor,同时SparkContext将应用程序代码发送到Executor,从而启动任务的执行;
5、Executor执行Task完成后释放受益人资源;
具体如下图所示: