本篇主要内容包括spark 计算引擎与调度管理的实现方式,

  • Spark 计算引擎原理
  • Spark 调度管理原理
  • Spark 存储管理原理
  • Spark 监控管理

一 :Spark 计算引擎原理

  1. 通过RDD创建DAG
  2. 通过DAG生成逻辑计划
  3. 划分Stage,生成Task
  4. 调度并执行Task
  5. 分布式执行Task

通过上面图可以很清楚的看到从Job的action到中间调度在到最后的具体执行的过程,下面针对该图做一个实例,来更加清楚的理解。

图片

首先,我们启动了spark-shell 来读取本地的文件,然后做wordcount操作,然后统计出一共多少行。

那么通过这么一个简单的job操作,来看一下spark ui 里面具体的DAGScheduler方式

图片

从上图我们可以看出flatmap 和 map 为一个stage0,在reducebykey的时候,又划分了一个stage1 ,那么stage的划分是根据shuffle或者说根据依赖关系来的,后面会更加详细的说到。

接下来说一下shuffle,shuffle是什么呢?在第一节的时候,有提到shuffle整个概念,并且简单的说到了宽依赖和窄依赖,或者我们叫做完全依赖和部分依赖。

shuffle的目的或者我们说shuffle的作用就是数据分类和数据聚合。通俗而言,就是讲跨节点间的数据进行聚合和归并操作,•Shuffle是分布式计算框架的核心数据交换方式,其实现方式直接决定了计算框架的性能和扩展性,shuffle操作是会导致数据计算的效率有所降低,那么如何讲shuffle所带来的损失降到最低呢?下面来一起了解一下spark中对于shuffle处理逐步改进的方案。

spark shuffle分为两个阶段,一个是write阶段,一个是read阶段

spark shuffle write阶段

write阶段分为两种:Hash-based 和 Sort-based

Hash-based:这个是最初的spark版本时,使用的shuffle write 方式

Hash-based 实现结构图(摘自网络):

如上图所示,每一个Task在计算完之后,会将结果集存储到本地的一份文件中,那么在进行shuffle操作时,这种实现方式会有M*N条链接,如果我们的bucket数量比较多的话,那么这个是很耗费资源的。所以后来spark shuffle write 改为sort-based方式

sort-based 实现结构图(摘自网络)

如上图所示,每一个task在计算完之后,会生成一个文件,每次的结果集会追加到该文件中,同时,会有一个索引文件记录了该块数据的位置,那么在进行write时,连接数的数量就大大减少了。

spark shuffle read阶段

在进行shuffle操作的时候,spark内部隐式的创建了一个transformation操作,用于做shuffle操作

shuffle read阶段,spark内部有一个单独的类BlockStoreShuffleFetcher去获取数据,之后获取到mata信息,存入到Set中,如果数据是在本地那么直接通过BlockManager.getBlockData进行本地数据读取,如果数据实在远程Executor中,那么会通过NettyBlockTransferService.fetchBlocks去获取。

二:Spark调度管理原理

Spark 调度管理系统是Spark程序得以运转的核心,其中作业调度是调度管理模块的枢纽,调度的前提是判断多个作业任务的依赖关系(Stage),作业任务之间存在因果的依赖关系,也就是说,有些任务必须要先执行,然后相关依赖的任务才能执行,任务之间不能出现循环依赖,所以本质上就是DAG。

作业调度相关类型,以DAGScheduler,也就是基于DAG图的调度类为核心

Spark 调度相关概念

  • Task(任务):单个分区数据集上的最小处理单元
  • TaskSet(任务集):有一组关联的,但互相直接没有Shuffle依赖关系的任务组成
  • Stage(调度阶段):一个任务集对应的调度阶段
  • Job (作业):由一个RDD Action 生成的一个或多个调度阶段所组成的一次计算作业
  • Application(应用程序):Spark 应用程序,有一个或者多个作业组成

Spark 调度相关概念逻辑关系图

Spark 作业调度顶层逻辑

每个RDD Action类型的算子,内部都是一次隐式的作业提交

DAGScheduler最重要的任务之一就是计算作业和任务的依赖关系,制定调度逻辑。

DAGScheduler在SparkContext初始化的过程中被实例化,一个SparkContext应创建一个DAGScheduler

DAGScheduler内部维护着各种“任务/调度阶段/作业”的状态互相之间的映射表,用于在任务状态,集群状态更新时,能够正确的维护作业的运行逻辑

Spark 作业调度流程图

Spark作业调度交互流程

Spark 作业调度-调度阶段的拆分

当一个RDD操作触发计算,向DAGScheduler提交作业时,DAGScheduler需要从RDD依赖链的末端RDD出发,遍历整个RDD依赖链,划分调度阶段,并决定各个调度阶段之间的依赖关系调度阶段的划分是以ShuffleDependency为依据,也就是说当某个RDD的运算需要将数据进行shuffle操作时,整个包含了Shuffle依赖关系的RDD将被用来作为输入信息,构建一个新的调度阶段Spark 作业调度-finalStage的提交在划分调度阶段的步骤中会得到一个或多个有依赖关系的调度阶段,其中直接触发RDD关联的调度阶段称为FinalStage,然后DAGScheduler进一步从这个FinalStage生成一个作业实例,这两者的关系进一步存储在映射表中,用于在该调度阶段全部完成做一些后续处理,比如:状态报告,清理作业相关数据等。

Spark 作业调度-状态监控&任务结果获取

DAGScheduler对外暴露了一系列的回调函数,对于TaskScheduler而言,这些回调函数主要包括任务的开始结束失败,任务集的失败,DAGScheduler根据这些任务的生命周期进一步维护作业呵调度阶段的状态信息

Spark 作业调度-任务结果获取

一个具体任务在Executor中执行完毕后,其结果需要以某种形式返回给DAGScheduler根据调度的方式不同,返回的方式也不同。对于FinalStage所对应的任务,返回给DAGScheduler的是运算结果本身,而对于中间调度阶段对应的任务ShuffleMapTask返回给DAGScheduler的是一个MapStatus对象,MapStatus对象管理了ShuffleMapTask的运算输出结果在Blockmanager里的项目存储信息,而非结果本身。根据任务结果的大小不同,ResultTask返回的结果又非为两类,如果结果足够小,则直接放在DirectTaskResult对象内,如果超过特定尺寸则在Executor端会将

DirectTaskResult先序列化,再把序列化的结果作为一个数据快存放在BlockManager中,然后将BlockManager返回的BlockID放在IndirectTaskResult对象中,返回给TaskScheduler。TaskScheduler进而调用TaskResultGetter将IndirectTaskResult中的BlockID取出并通过BlockManager最终取得对应的DirectTaskResult。

Spark 作业调度总结

Spark的调度管理是Spark作业运行和资源分配的核心,调度的层次依次是底层计算资源,任务调度,作业调度,应用调度。了解这些层次之间的逻辑关系,可以更方便的对Spark的运行状态监控以及对于集群的配置优化。

希望本文对你有帮助!
感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。

远程连接spark_spark内部原理篇之计算引擎和调度管理相关推荐

  1. 远程连接 错误 内部错误_关于错误的性质和原因。 了解错误因素

    远程连接 错误 内部错误 Back in 2012, I was a young[er] product designer working in a small tech agency in Vale ...

  2. Linux学习总结(三)之 putty,xshell远程连接及密钥认证篇

    一:putty 下载 1:认准两个地方 a. Download putty b. chiark greenend  2:下载32位的zip包,这是一个工具包合集,不单是一个终端工具 二:putty设置 ...

  3. 《CDN 之我见》原理篇——CDN的由来与调度

    2019独角兽企业重金招聘Python工程师标准>>> CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术.它能够有效 ...

  4. 安装Linux显示内部错误,Ubuntu14.04安装XRDP远程连接及显示内部错误解决方案

    之前ubuntu14.04装的xrdp不小心删掉了,重新安装的时候一直出问题,RDP远程连接显示"内部错误",搞了差不多一天终于搞定. 1.安装xRDP及vncserver sud ...

  5. 服务器远程连接控制以及在Linux环境下安装go编译环境

    本文主要内容 一.xshell远程控制服务器 二.VS code远程控制服务器 三.在Linux环境下安装go编译环境 初学者在没有人的指导下自己摸索学习真的是太难了,回想一下从大二创新实践开始到现在 ...

  6. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接 <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式 ...

  7. 【Linux】远程连接Linux系统及故障排查

    参考资料: 1.视频课程<Linux运维> 2.书籍PDF版<Linux运维 Web集群实战> 远程连接Linux系统 原理 互联网上的计算机都会有一个32位的地址,ip地址. ...

  8. 第3章 远程连接管理Linux实践

    第3章 远程连接管理Linux实践 3.1 远程连接Linux系统管理 3.1.1 为什么要远程连接Linux系统 在很多机构的培训教学中,教员通常会直接在虚拟机界面或者虚拟机里的图形界面讲解知识,这 ...

  9. 阿里云国际版无法远程连接Windows服务器的解决方法

    免责声明:本文档可能包含第三方产品信息,该信息仅供参考.阿里云对第三方产品的性能.可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺. 概述 下面来和87cloud一起了解阿里云国际版无法 ...

最新文章

  1. 表上作业法matlab实现,高人帮忙改改,有关表上作业法的C++程序
  2. .Net Core建站(1):EF Core+CodeFirst数据库生成
  3. 【常用网址】——opencv等
  4. 微信小程序获取二维码中URL中带的参数
  5. 下三角矩阵的逆矩阵_上三角或下三角矩阵的逆矩阵能否简便方法求出??只有主副对角线不为0的矩阵能否直接写出逆矩阵。...
  6. mysql__CASE WHEN进行字符串替换处理
  7. 网易丁磊:中国的安卓分成全世界最贵 比苹果贵20%左右
  8. Linux系统下的软件安装
  9. 解决 googel 无法直接跳转网页打开搜索结果
  10. 全网最硬核换脸技术全分析ZAO换脸App
  11. axio请求获取网络数据
  12. 50岁的程序员该何去何从
  13. 用炒菜的思路搞定你的复杂分析
  14. WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)
  15. Java LTS版本——Java 11新特性
  16. MAX40026 280ps高速比较器开发资料原理图源代码
  17. Kubernetes网络三部曲之三 ~ NodePort vs LoadBalancer vs Ingress
  18. 遗传算法解整数规划IntCon
  19. 软件开发相关面经6——数据库篇
  20. Kotlin学习三:高阶函数

热门文章

  1. SAP Cloud for Customer前端url里的一长串base64code是在哪里根据什么逻辑计算的
  2. IBASE write buffer
  3. 如何查看已经archive过的product信息
  4. IPM: Enhance item implementation class
  5. SAP ABAP实用技巧介绍系列之如何创建Maintenance view
  6. SAP UI5应用部署在tomcat上运行的部署路径问题,基于Eclipse
  7. Java Spring singleton bean的创建源代码
  8. 注解实现原理学习之how does @Category work
  9. @Resource注解研究和在SAP Hybris ECP中的应用
  10. 如何更换outlook邮件的背景色