当前位置: 首页 > news >正文

【Spark精讲】Spark作业执行原理

基本流程

用户编写的Spark应用程序最开始都要初始化SparkContext。

用户编写的应用程序中,每执行一个action操作,就会触发一个job的执行,一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖,会将shuffle前后划分成两个stage,前一个stage会将计算结果临时进行存储,后一个stage则进行读取,完成数据交换。

每个stage中,需要执行的计算过程会被划分成多个逻辑相同的一组Task,每个Task会被提交到Executor中运行。当Task运行完成后,会将运行结果返回至Driver中。 

主要组件

Driver端

  1. DAGScheduler:负责将Job划分为Stage,再将Stage划分为TaskSet;
  2. TaskScheduler:负责任务的调度;
  3. SchedulerBackend:负责资源的分配,并把Task提交给Executor中执行。

Executor端

  1. BlockManager:缓存RDD、缓存Task运行结果。

Job提交执行流程

Task提交

SparkContext将RDD的action操作转化为Job,并将Job交给DAGScheduler做进一步处理。

DAGScheduler首选根据shuffle划分stage,根据stage中分区的数量,生成一组Task(即TaskSet),生成Task时还会计算Task的最佳执行位置。DAGScheduler会根据RDD是否进行了缓存来确定是否具有最佳运行位置。

DAGScheduler将Stage生成TaskSet以后,会将TaskSet交给TaskScheduler进行处理,TaskScheduler负责将Task提交到集群中运行,并负责失败重试,为DAGScheduler返回事件信息等。

当有任务提交至TaskScheduler中时,TaskScheduler会通知SchedulerBackend分配计算资源。SchedulerBackend将所有可用的Executor的资源信息转换为WorkerOffer交给TaskScheduler。TaskScheduler负责根据这些WorkerOffer在相应的Executor分配TaskSet中的Task。

SchedulerBackend中通过使用Map结构记录每一个ExecutorData的映射,即可管理所有Executor的CPU使用的情况。为计算任务分配计算资源时,只需要遍历所有的ExecutorData,分配可用的资源即可。

TaskScheduler在接受到DAGScheduler提交的TaskSet以后,会为每个TaskSet创建一个TaskSetManager,用于管理该TaskSet中所有任务的运行。TaskSetManager会根据Task中的最佳运行位置计算TaskSet的所有本地运行级别,本地运行的级别决定了Task最终在哪个Executor中运行。Spark中本地运行级别从小到大可分为进程本地化、节点本地化、无优先位置、机架本地化、任意节点。

Task执行

Executor接收到SchedulerBackend提交的LaunchTask消息后,即可运行该消息中包含的Task。Executor将接收到的Task封装到TaskRunner中,TaskRunner是一个Runnable接口,从而可以将该任务提交到线程池中运行。

当在一个Executor中同时运行多个Task时,多个Task共享Executor中SparkEnv的所有组件,共用Executor中分配的内存。如使用Spark广播变量时,每个Executor中会存在一份,Executor中所有的任务会共享这一份变量。当Executor中的BlockManager缓存了某rdd某分区的数据时,在该Executor上调度使用这个RDD的这个分区的数据的Task执行,可以有效减少网络加载数据的过程,减少网络传输。

当Executor中Task运行完成时,需要将Task的运行结果返回Driver程序,Driver程序根据结果判断该Stage是否计算完成,或者该Job是否计算完成。

http://www.lryc.cn/news/258713.html

相关文章:

  • Docker容器:Centos7搭建Docker镜像私服harbor
  • ClickHouse安装和部署
  • Spring Cloud Gateway中对admin端点进行认证
  • 2. 如何通过公网IP端口映射访问到设备的vmware虚拟机的ubuntu服务器
  • 配置android sudio出现的错误
  • 【初阶C++】前言
  • MAC IDEA Maven Springboot
  • Angular13无法在浏览器debug
  • H.264与H.265(HEVC):视频编码的演进
  • Python从入门到精通九:Python异常、模块与包
  • 无需公网IP联机Minecraft,我的世界服务器本地搭建教程
  • 机器学习-SVM(支持向量机)
  • 保姆级:Windows Server 2012上安装.NET Framework 3.5
  • 昇腾910安装驱动出错,降低Centos7.6的内核版本
  • LeetCode刷题日志-73矩阵置零
  • 基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(四)
  • 文件操作及函数
  • 阿里云国际版无法远程连接Windows服务器的排查方法
  • 华清远见嵌入式学习——QT——作业4
  • Visuial Studio 打开 Unity 脚本时,脚本继承MonoBehaviour暂时失效为白色的解决方法
  • CentOS使用kkFileView实现在线预览word excel pdf等
  • 黑豹程序员-EasyExcel实现导出
  • 【项目小结】优点分析
  • 已经写完的论文怎么降低查重率 papergpt
  • 科研论文中PPT图片格式选择与转换:EPS、SVG 和 PDF 的比较
  • mybatis xml 热部署
  • MySQL的事务以及springboot中如何使用事务
  • docker二 redis单机安装
  • 【解决】Vue elementUI table表格 列错位/滑动后切换每页显示数后错位/表格使用fixed后错位...
  • uniapp实战 —— 分类导航【详解】