目录
org.apache.spark.scheduler.DAGScheduler
org.apache.spark.scheduler.TaskScheduler
org.apache.spark.scheduler.SchedulerBackend
宏观流程
一个Spark程序的运行由Driver Program、SparkContext对象、WorkNode、Work进程、Executor执行器、Task任务和Cluster Manager集群管理器(Master结点)七个组件协同工作

Driver Program
用户编写的Spark程序称为Driver Program。每个Driver程序包含一个代表运行环境的SparkContext对象。程序的执行从Driver程序开始,所有操作执行结束后回到Driver程序中。
SparkContext对象
①每个Driver Program里都有一个SparkContext对象
SparkContext对象联系 cluster manager(集群管理器),从 cluster manager申请任务执行需要的内存和CPU资源;
②和Executor进程交互,完成任务的启动、分配和监控
Worker Node
集群上的计算节点,对应一台物理机器
Worker进程
①用于和cluster manager进程交互,向cluster manager注册和汇报自身节点的资源使用情况
②管理和启动Executor进程
Executor执行器
一个JVM进程,用于运行和计算Task,并将计算结果回传到Driver中
Task任务
执行器上执行的最小单元。比如RDD Transformation操作时对RDD内每个分区的计算都会对应一个Taskr任务。它会被SparkContxt送到某个Executor上去执行
cluster manager 集群管理器
对应Master进程, 接收Driver的资源申请,从收集的资源池中,寻找满足资源条件的worker结点,并告诉Driver,哪台worker结点可以执行当前任务

微观流程
当Spark应用程序启动后, 此时首先会创建SparkContext对象, 此对象在创建的时候, 底层同时也会创建DAGScheduler和TaskScheduler
RDD Objects
可以理解为用户实际代码中创建的RDD,这些代码逻辑上组成了一个DAG。
DAGScheduler
负责DAG流程图生成, Stage阶段划分, 每个阶段运行多少个线程;
当遇到action算子后, 就会产生一个Job任务, SparkContext对象将任务提交给DAGScheduler, DAGScheduler接收到任务后, 就会产生一个DAG执行流程图, 划分Stage, 并且确定每个stage中需要运行多少个线程, 将每一个阶段的线程放置到一个TaskSet集合中, 提交给TaskScheduler
TaskScheduler
负责每个阶段的Task线程的分配工作, 以及将对应线程任务提交到Excutor上运行;
TaskScheduler接收到各个阶段的TaskSet后, 开始进行任务的分配工作, 确认每个线程应该运行在那个executor上(尽可能保持均衡), 然后将任务提交给对应executor上,让executor启动线程执行任务即可,阶段是一个一个的运行, 无法并行执行的
简而言之,启动Executor进程,进程内运行线程执行task任务
SchedulerBackend
与Executor交互,完成Task任务的分配和资源调度,并将结果回传到Driver
代码实现

org.apache.spark.scheduler.DAGScheduler
将一个DAG划分为一个一个的Stage阶段(每个Stage是一组Task的集合)
然后把Task Set 交给TaskScheduler模块。
org.apache.spark.scheduler.TaskScheduler
从DAGScheduler接收不同Stage的任务。向Cluster Manager 申请资源。然后Cluster Manager收到资源请求之后,寻找符合条件的Worker,并在该Worker上启动Executor
org.apache.spark.scheduler.SchedulerBackend
向当前等待分配计算资源的Task分配Executor,并且在分配的Executor上启动Task,完成计算的资源调度
AKKA
一个网络通信框架,类似于Netty,在Spark1.8之后已全部替换成Netty
Spark并行度
整个Spark应用中, 影响程序并行度的因素有以下两个原因:
-
1- 资源的并行度: Executor数量 和 CPU核心数 以及 内存大小
-
2- 数据的并行度: Task的线程数 和 分区数量
推荐值(经验值):
一个CPU上运行 2~3个线程, 一个CPU需要配置3~5GB的内存, 从而充分压榨CPU性能
一个线程, 建议处理1~3GB数据, 处理时间 10~20分钟, 如果想要时间减少, 那么让每一个线程处理数据量减少 一个Executor建议占用 3~5个CPU核数
并行度设置, 需要在shuffle后生效, shuffle前的分区数量, 默认取决于初始数据源的时候确认的分区数量
857

被折叠的 条评论
为什么被折叠?



