Spark系统运行内幕机制循环流程

这里写图片描述
一、TaskScheduler原理解密
1.DAGScheduler在提交TaskSet给底层调度器的时候是面向接口TaskScheduler的,这符合面向对象中依赖抽象而不依赖的原则,带来底层资源调度器的可插拔性,导致Spark可以运行的众多资源调度器模式上,例如Standalone、Yarn、Mesos、Local、EC2、其它自定义的资源调度器。在Standalone的模式下,我们聚焦于TaskSchedulerImpl
2.在SparkContext实例化的时候通过createTaskScheduler创建TaskSchedulerImpl和SparkDEploySchedulerBackend:

case SPARK_REGEX(sparkUrl)=>
val scheduler = new TaskSchedulerImpl(sc)
val masterUrls=sparkUrl.split(",").map("spark://"+_)
val backend=new SparkDeploySchedulerBackend(scheduler,sc,masterUrls)
scheduler.initialize(backend)
(backend,scheduler)

在TaskSchedulerImpl的initialize方法中把SparkDeploySchedulerBackend传进来从而赋值为TaskSchedulerImpl的Backend;在TaskSchedulerImpl调用start方法的时候回调用backend.start方法,在start方法中会最终注册应用程序

3.TaskScheduler的核心任务是提交TaskSet到集群运算并汇报结构
a)为TaskSet创建和维护一个TaskSetManager并追踪任务的本地性以及错误信息;
b)遇到Straggle任务会放到其它的节点进行重试
c)向DAGScheduler汇报执行情况,包括在Shuffle输出lost的时候报告fetch failed错误等信息
4.TaskScheduler内部会握有SchedulerBackend,从Standalone的模式来讲具体实现是SparkDeploySchedulerBackend
5.SparkDeploySchedulerBackend在启动的时候构造了APPClient实例并在该实例start的时候启动了ClientEndPoint这个消息循环体,ClientEndPoint在启动的会向Master注册当前程序;而SparkDeploySchedulerBackend的父类CoarseGrainedSchedulerBackend在start的时候会实例化类型为DriverEndPoint(这就是我们程序运行时候的经典对象Driver)的消息循环体.SparkDeploySchedulerBackend专门负责收集Worker上的资源信息,当ExecutorBackend启动的时候会向DriverEndPoint注册;此时SparkDeploySchedulerBackend就掌握了当前应用程序拥有的计算资源,TaskScheduler就是通过SparkDeploySchedulerBackend拥有的计算资源来具体运行Task
6.SparkContext,TaskSchedulerImpl,DAGScheduler,SparkDeploySchedulerBackend在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象:

大总结:在SparkContext实例化的时候调用createTaskScheduler来创建TaskSchedulerImpl和SparkDeploySchedulerBackend,同时在SparkContext实例化的时候会调用TaskSchedulerImpl的start,在start方法中会调用SparkDeploySchedulerBackend的start,在该start方法中会创建APPClient对象并调用APPClient对象的start方法,在该start方法中会创建ClientEndPoint,在创建ClientEndPoint会传入Command来指定具体为当前应用程序启动的Executor进行的入口类的名称为CoarseGrainedExecutorBackend,然后ClientEndPoint启动并通过tryRegisterMaster来注册当前的应用程序到Master中,Master接受到注册信息后如何可以运行程序,则会该程序生产Job ID并通过Schedule来分配计算资源,具体计算资源的分配是通过应用程序的运行方式、Memory、cores等配置信息来决定的,最后Master会发送指令给Worker,Worker中为当前应用程序分配计算资源时会首先分配ExecutorRunner,ExecutorRunner内部会通过Thread方式构建ProcessBuilder来启动另外一个JVM进程,这个 JVM进程启动时候加载的main方法所在类的名称就是在创建ClientEndPoint时传入的Command来指定具体名称为CoarseGrainedExecutorBackend的类,此时JVM在通过ProcessBuilder启动的时候获得了CoarseGrainedExecutorBackend后加载并调用其中的Main方法,在main方法中会实例化CoarseGrainedExecutorBackend本身这个消息循环体,而CoarseGrainedExecutorBackend在实例化的时候会通过回调onStart向DriverEndPoint发送RegisterExecutor来注册当前的CoarseGrainedExecutorBackend,此时DriverEndPoint收到该注册信息并保存在了SparkDeploySchedulerBackend实例的内存数据结构中,这样Driver就获得了计算资源。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark运行机制可以总结为以下几个步骤: 1. 构建Spark Application的运行环境,即启动SparkContext。SparkContext会向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源。\[2\] 2. 每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行tasks。这种Application隔离机制有其优势,每个Driver调度自己的任务,并且来自不同Application的Task运行在不同的JVM中。但这也意味着Spark Application不能跨应用程序共享数据,除非将数据写入到外部存储系统。\[1\] 3. TaskScheduler负责将TaskSet提交给Worker(集群)运行,并在此处分配每个Executor运行什么Task。\[2\] 4. 在TaskScheduler中,每个task描述会被序列化成二进制,并发送给对应的executor。如果二进制信息的大小超过了akkaFrameSize的限制(默认为10M减去akka留空的200K),会出错并中止整个TaskSet。此时,可以增大akka frame size来解决问题。如果二进制数据大小可接受,会将任务信息发送给executor的actor,处理LaunchTask(serializedTask)事件。\[3\] 5. Executor是Spark中的进程模型,可以适用于不同的资源管理系统。它包含一个线程池、正在运行的任务映射以及一个actor,用于接收来自SchedulerBackend的事件。\[3\] 总结起来,Spark运行机制包括构建运行环境、分配Executor资源、提交任务给Worker运行以及Executor的处理过程。通过这些步骤,Spark能够高效地执行分布式计算任务。 #### 引用[.reference_title] - *1* *2* *3* [Spark任务提交方式和执行流程](https://blog.csdn.net/weixin_37796929/article/details/93711780)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值