Application(应用程序):用户编写的Spark程序,包含驱动程序(Driver)和分布在集群中多个节点上运行的Executor代码。
Driver(驱动程序):Spark中的Driver运行上述Application中的main函数并创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark 中由SparkContext负责与ClusterManager通信,进行资源调度;当Executor部分运行结束,Driver负责将SparkContext关闭。通常用SparkContext代表Driver。
Cluster Manager(集群资源管理器)
:是指在集群上获取资源的外部服务,目前有以下几种:
Worker(工作节点):集群中任务可以运行Application代码的节点,类似与Yarn中的ModeManager节点。
Master(总控进程):Spark Standalone运行模式下的主节点,负责管理和分配资源。
Executor(执行进程):Application运行在Worker节点上的一个进程,该进程负责运行task,并负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。
作业执行
作业(Job):RDD中由行动操作所生成的一个或多个调度阶段
调度阶段(Stage):每个作业会因为RDD之间的依赖关系拆分成多组任务集合,称为调度阶段,也叫任务集(TaskSet)。调度阶段的划分是由DAGScheduler来划分的,调度阶段有ShuffleMapStage和ResultStage两种。
任务(Task):分发到Executor上的工作任务,是Spark实际执行应用的最小单元。
DAGScheduler:面向调度阶段的任务调度器,负责接受Spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交给TaskScheduler。
TaskScheduler:面向任务的调度器,接受DAGScheduler提交的调度阶段,把任务分发到Work节点运行,由Work节点的Executor来执行任务。
1.Spark应用程序进行各种转换操作,通过行动操作触发作业运行。提交之后根据RDD之间的依赖关系构建DAG图,DAG图提交给DAGScheduler进行解析。
2.DAGScheduler是面向调度的高层次的调度器,DAGScheduler把DAG拆分成相互依赖的调度阶段,DAGScheduler会从最后一份RDD回溯,使用广度优先遍历整个依赖树,拆分调度遇到宽依赖就划分出新的调度阶段。每个调度阶段包含一个或多个任务,这些任务形成任务集,提交给底层调度器TaskScheduler。另外DAGScheduler还记录哪些RDD被存入磁盘等物化动作,同时寻求任务的最优调度,例如数据本地性;DAGScheduler监控运行调度阶段过程,如果某个调度阶段运行失败,则需要重新提交该调度阶段。
3.每个TaskScheduler只为一个SparkContext实例服务,TaskScheduler接受来自DAGScheduler发送过来的任务集,并负责把任务集已任务的形式分发到集群Worker节点的Executor中。如果某个任务运行失败,TaskScheduler负责重试。另外TaskScheduler发现某个任务一直未完成,就可能启动同样的任务,谁先完成则用哪个任务的结果。
4.Worker中Executor接收TaskScheduler发送过来的任务后,以线程的方式运行,每个线程负责一个任务。任务运行结束后要返回给TaskScheduler,不同类型的任务,返回的方式也不同。ShuffleMapTask返回的是一个MapStatus对象;ResultTask根据结果的大小,返回的方式又可以分为两类。
算法调度
1.应用程序之间:有条件的FIFO策略。Mater先启动等待列表中应用程序的Driver,这些Driver尽可能分散在集群的Worker节点上,然后根据集群的内存和CPU使用情况,对等待运行的应用程序进行资源分配,在分配算法上根据先来先分配,先分配的会尽可能多地获取满足条件的资源,后分配的应用程序只能在剩下的资源中筛选。(默认是最大的,通过设置spark.core.max与spark.executor.cores约束每个应用程序最大的CPU核数、每个executor上启动的CPU核数)
2.分配应用程序资源:一种是把应用程序运行在尽可能多的Work上,这种分配算法不仅能够充分使用集群资源,而且有利于数据本地性;相反,另一种是应用程序运行在尽可能少的Work上,该情况适合CPU密集型而内存使用较少的场景。由spark.deploy.spreadOut配置,默认为true,也就是第一种。
3.作业及调度阶段之间:对于多分作业,提供两种调度策略。一种是FIFO,也是默认的模式;另一种是FAIR模式,该模式的调度可以通过两个参数的配置来决定Job的优先模式,这两个参数分别为minShare(最小任务数)和weight(任务的权重)。
4.任务之间:数据本地性与延迟执行
容错、监控
容错是指一个系统的部分出现错误的情况下还能够持续的提供服务,不会因为一些细微的错误导致系统性能严重下降或者出现系统瘫痪。Spark主要实现3中异常处理:Executor、Worker、Master,并提供3种监控管理:UI监控、Spark Metrics、REST。
UI监控分为实时UI监控和历史UI监控(也就是历史记录),实时UI监控又分为Master UI监控和应用程序UI监控。