Spark任务执行流程分析
(1)使用算子操作进行各种transformation操作,最后通过action操作触发Spark作业运行。提交之后Spark会根据转换过程所产生的RDD之间的依赖关系构建有向无环图。
(2)DAG切割主要根据RDD的依赖是否为宽依赖来决定切割节点,当遇到宽依赖就将任务划分为一个新的调度阶段(stage)。每个stage中包含一个或多个task。这些task将形成任务集(TaskSet),提交给底层调度器进行调度运行。
(3)每一个Spark任务调度器只为一个SparkContext实例服务。当任务调度器收到任务集后负责把任务集以及Task任务的形式分发至Worker节点的Executor进程中执行,如果某个任务失败,任务调度器负责重新分配该任务的计算。
(4)当Executor收到发送过来的任务后,将以多线程(会在启动executor的时候就初始化好了一个线程池)的方式执行任务的计算,每个线程负责一个任务,任务结束后会根据任务的类型选择相应的返回方式将结果返回给任务调度器。
Spark核心概念:
1.Application:表示你的应用程序,包含一个Driver Program和若干个Executor
2.Driver program:Spark中的Driver即允许上述Appliication的main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭SparkContext。
3.ClusterManager:在Standalone模式中即为Master(主节点),控制整个集群,监控Worker。在Yarn模式中为资源管理器。
4.SparkContext:整个应用的上下文,控制应用程序的生命周期。负责调度各个运算资源,协调各个Worker上的Executor。初始化的时候,会初始化DAGScheduler和TaskScheduler两个核心组件。
5.RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。
6.DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是RDD之间的依据关系;宽依赖,也叫shuffle依赖。
7.TaskScheduler:将TaskSet提交给Worker(集群)运行,每个Executor运行什么Task就在此次分配的。
8:Worker:集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on yarn模式中指的就是NodeManager节点。
9:Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或磁盘上。一个CoarseGrainedExecutorBackend进程有且仅有一个exector对象,它负责将Task包装成taskRunner,并从线程池中抽取一个空闲线程运行task,这样,每个CoarseGrainedExecutorBackend能并行运行Task的数据就取决于分配给它的CPU的个数。
10.Stage:每个Job会被拆分为多组Task,每组作为一个TaskSet,其名称为Stage
11.Job:包含多个Task组成的并行计算,是由Action行为触发的
12.Task:在Executor进程中执行任务的工作单元,多个Task组成一个Stage
13.SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。SparkEnv内创建并包含如下一些重要组件的引用。
MapOutPutTracker:负责Shuffle元信息的存储。
BroadcastManager:负责广播变量的控制与元信息的存储。
BlockManager:负责存储管理、创建和查找块。
MericsSystem:监控运行时性能指标信息。
SparkConf:负责存储配置信息。