spark核心原理

spark核心原理

一 消息通信原理

二 spark的作业原理

三spark的调度策略(像极了yarn的均衡)

 

一 消息通信原理

 

  1. spark消息通信架构
  2. spark启动消息通信
  3. spark运行时消息同喜

spark消息通信架构

spark启动消息通信

(1)当Master启动后,随之启动各Worker, Worker启动时会创建通信环境RpcEnv和终端
点EndPoint,并向Master发送注册Woker的消息RegisterWorker。
由于Woker可能需要注册到多个Master中(如HA环境),在Worker的tryRegisterAllMasters
方法中创建注册线程池registerMasterThreadPool, 把需要申请注册的请求放在该线程池中,然
后通过该线程池启动注册线程。在该注册过程中,获取Master 终端点引用,接着调用
registerWithMaster方法,根据Master终端点引用的send方法发送注册RegisterWorker 消息。
 

spark运行时消息通信

二 spark作业原理

spark-on-yarn

三 spark的调度策略

几个重要的调度规则


APP调度
默认情况下,用户向以Standalone模式运行的Spark集群提交的应用使用FIFO(先进先
出)的顺序进行调度。 每个应用会独占所有可用节点的资源。 用户可以通过配置参数
spark.cores.max决定一个应用可以在整个集群申请的CPU core数。 注意,这个参数不是控
制单节点可用多少核。 如果用户没有配置这个参数,则在Standalone模式下,默认每个应用
可以分配由参数spark.deploy.defaultCores决定的可用核数。

算法对应的类
- FIFO:FIFOSchedulingAlgorithm
- FAIR:FairSchedulingAlgorithm

JOB调度
Action 触发的JOB的本质就是调用了SparkContent 的runjob方法。JOB的调度在FIFO与FAIR的行为有点不同

FIFO
在默认情况下,Spark的调度器以FIFO(先进先出)方式调度Job的执行。 每个Job被切分为多个Stage。 第一个Job优先获取所有可用的资源,接下来第二个Job再获取剩余资源。 以此类推,如果第一个Job并没有占用所有的资源,则第二个Job还可以继续获取剩余资源,这样多个Job可以并行运行。 如果第一个Job很大,占用所有资源,则第二个Job就需要等待第一个任务执行完,释放空余资源,再申请和分配Job。

FAIR
在FAIR共享模式调度下,Spark在多Job之间以轮询(round robin)方式为任务分配资源,所有的任务拥有大致相当的优先级来共享集群的资源。
这就意味着当一个长任务正在执行时,短任务仍可以分配到资源,提交并执行,并且获得不错的响应时间。 这样就不用像以前一样需要等待长任务执行完才可以。 这种调度模式很适合多用户的场景。
用户可以通过配置spark.scheduler.mode方式来让应用以FAIR模式调度。
FAIR调度器同样支持将Job分组加入调度池中调度,用户可以同时针对不同优先级对每个调度池配置不同的调度权重
在默认情况下,每个调度池拥有相同的优先级来共享整个集群的资源,同样default pool中的每个Job也拥有同样优先级进行资源共享,但是在用户创建的每个资源池中,Job是通过FIFO方式进行调度的。

Stage调度
每个Stage对应的一个TaskSetManager,通过Stage回溯到最源头缺失的Stage提交到调度池pool中,在调度池中,
这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然
后一个Job内的TaskSetManager ID小的先调度,并且如果有未执行完的父母Stage的
TaskSetManager,则是不会提交到调度池中。

Task调度
当Stage不存在缺失的ParentStage时,会将其转换为TaskSet并提交。转换时依Stage类型进行转换:将ResultStage转换成ResultTask, ShuffleMapStage转换成ShuffleMapTask. Task个数由Stage中finalRDD 的分区数决定。

当转换成的TaskSet提交之后,将其通过taskScheduler包装成TaskSetManager并添加至调度队列中(Pool),等待调度。在包装成TaskSetManager时,根据task的preferredLocatitions将任务分类存放在pendingTasksForExecutor, pendingTaskForHost, pendingTasksForRack, pendingTaskWithNoPrefs及allPendingTasks中, 前三个列表是是包含关系(本地性越来越低),范围起来越大,例如:在pendingTasksForExecutor也在pendingTaskForHost,pendingTasksForRack中, 分类的目的是在调度时,依次由本地性高à低的查找task。

在进行Task调度时,首先根据调度策略将可调度所有taskset进行排序,然后对排好序的taskset待调度列表中的taskset,按序进行分配Executor。再分配Executor时,然后逐个为Executor列表中可用的Executor在此次选择的taskset中==按本地性由高到低查找适配任==务。此处任务调度为延迟调度,即若本次调度时间距上一任务结束时间小于当前本地性配制时间则等待,若过了配制时间,本地性要求逐渐降低,再去查找适配的task。当选定某一task后后将其加入runningtask列表,当其执行完成时会加入success列表,下次调度时就会过滤过存在这两个列表中的任务,避免重复调度。

当一个任务执行结束时,会将其从runningtask中移除,并加入success,并会适放其占用的执行资源,供后序task使用, 将判断其执行成功的task数与此taskset任务总数相等时,意为taskset中所有任务执行结束,也就是taskset结束。此时会将taskset移除出可调度队列。

重复上述过程直到taskset待调度列表为空。即所有作业(job)执行完成。

总结:整体的Task分发由TaskSchedulerImpl来实现,但是Task的调度(本质上是Task在哪个
分区执行)逻辑由TaskSetManager完成。 这个类监控整个任务的生命周期,当任务失败时
(如执行时间超过一定的阈值),重新调度,也会通过delay scheduling进行基于位置感知
(locality-aware)的任务调度

 

参考资料:

1.图解spark

2.尚硅谷spark

3.铁猴 csdn  blog  连接   :https://blog.csdn.net/eric_sunah/article/details/52595930

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值