Spark-Job调度流程

目录

宏观流程

Driver Program

SparkContext对象

Worker Node

Worker进程

Task任务

cluster manager 集群管理器

微观流程

RDD Objects

DAGScheduler

TaskScheduler

SchedulerBackend

代码实现

org.apache.spark.scheduler.DAGScheduler  

org.apache.spark.scheduler.TaskScheduler

org.apache.spark.scheduler.SchedulerBackend

AKKA

Spark并行度


宏观流程

一个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前的分区数量, 默认取决于初始数据源的时候确认的分区数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值