Spark天堂之门解密

 本课主题

  • 什么是 Spark 的天堂之门
  • Spark 天堂之门到底在那里
  • Spark 天堂之门源码鉴赏

 

引言

  Spark 天堂之门就是SparkContext,这篇文章会从 SparkContext 创建3大核心对象 TaskSchedulerImpl、DAGScheduler 和 SchedulerBackend 开始到注册给 Master 这个过程中的源码鉴赏,SparkContext 是整个 Spark 程序通往集群的唯一通道,它是程序起点,也是程序终点,所以把它称之为天堂之门,看过 Spark HelloWorld 程序的朋友都知道,你在程序的开头必需先定义SparkContext、接着调用 SparkContext 的方法,比如说 sc.textFile(file),最后也会调用 sc.stop( ) 来退出应用程序。现在我们就来看看 SparkContext 里面到底有什么秘密,以及为什么它会被称为天堂之门。希望这篇文章能为读者带出以下的启发:

  • 了解在 SparkContext 内部创建了哪些实例对象以及如何创建
  • 了解真正是哪个实例对象向 Master 注册以及如何注册

 

什么是 Spark 的天堂之门

  1. Spark 程序在运行的时候分为 Driver 和 Executor 两部分
  2. Spark 程序编写是基于 SparkContext 的,具体来说包含两方面
    1. Spark 编程的核心基础-RDD 是由 SparkContext 来最初创建的(第一个RDD一定是由 SparkContext 来创建的)
    2. Spark 程序的调度优化也是基于 SparkContext,首先进行调度优化。
  3. Spark 程序的注册时通过 SparkContext 实例化时生产的对象来完成的(其实是 SchedulerBackend 来注册程序)
  4. Spark 程序在运行的时候要通过 Cluster Manager 获取具体的计算资源,计算资源获取也是通过 SparkContext 产生的对象来申请的(其实是 SchedulerBackend 来获取计算资源的)
  5. SparkContext 崩溃或者结束的时候整个 Spark 程序也结束啦!

 

Spark 天堂之门到底在那里

运行一个程序,你会看见 SparkContext 从程序开始到结束都有它的身影,SparkContext 是 Spark 应用程序的核心呀!

[下图是一个 HelloWord 应用程序在 IDEA 中的运行状况]

 

Spark 天堂之门源码鉴赏

这次主要是看当提交Spark程序后,在 SparkContext 实例化的过程中,里面会创建多少个核心实例来为应用程序完成注冊,SparkContext 最主要的是实例化 TaskSchedulerImpl。

[下图是 SparkContext 在创建核心对象后的流程图]

  1. SparkContext 构建的顶级三大核心:DAGSchedulerTaskScheduler, SchedulerBackend,其中:
  • DAGScheduler 是面向 Job 的 Stage 的高层调度器;
  • TaskScheduler 是一个接口,是低层调度器,根据具体的 ClusterManager 的不同会有不同的实现,Standalone 模式下具体的实现 TaskSchedulerImpl; 
  • SchedulerBackend 是一个接口,根据具体的 ClusterManager 的不同会有不同的实现,Standalone 模式下具体的实现是SparkDeploySchedulerBackend
从整个程序运行的角度来讲,SparkContext 包含四大核心对象:DAGSchedulerTaskScheduler, SchedulerBackend, MapOutputTrackerMaster SparkDeploySchedulerBackend 有三大核心功能:
  • 负责向Master 連接连接注册当前程序 RegisterWithMaster
  • 接收集群中为当前应用程序而分配的计算资源 Executor 的注册并管理 Executors; 
  • 负责发送 Task 到具体的 Executor 執行

补充说明的是 SparkDeploySchedulerBackend 是被 TaskSchedulerImpl 来管理的!

创建 SparkContext 的核心对象
  • 程序一开始运行时会实例化 SparkContext 里的东西,所以不在方法里的成员都会被实例化!一开始实例化的时候第一个关键的代码是 createTaskScheduler,它是位于 SparkContext 的 Primary Constructor 中,当它实例化时会直接被调用,这个方法返回的是 taskScheduler 和 dagScheduler 的实例,然后基于这个内容又构建了 DAGScheduler,然后调用 taskScheduler 的 start( ) 方法,要先创建taskScheduler然后再创建 dagScheduler,因为taskScheduler是受dagScheduler管理的。
    [下图是 SparkContext.scala 中的创建 schedulerBackend 和 taskSchdulerImpl 的实例对象]
  • 调用 createTaskSchedule,这个方法创建了 TaskSchdulerImpl 和 SparkDeploySchedulerBackend,接受第一个参数是 SparkContext 对象本身,然后是字符串,(这也是平时传入 master 里的字符串)
    [下图是 HelloSpark.scala 中创建 SparkConf 和 SparkContext 的上下文信息]

    [下图是 SparkContext.scala 中的 createTaskScheduler 方法]
  • 它会判断一下你的 master 是什么然后具体进行不同的操作!假设我们是Spark 集群模式,它会:
    [下图是 SparkContext.scala 中的 SparkMasterRegex 静态对象]
  • 创建 TaskSchedulerImpl 实例然后把 SparkContext 传进去; 
  • 匹配集群中 master 的地址 e.g. spark:// 
  • 创建 SparkDeploySchedulerBackend 实例,然后把 taskScheduler (这里是 TaskSchedulerImpl)、SparkContext 和 master 地址信息传进去;
  • 调用 taskScheduler (这里是 TaskSchedulerImpl) 的 initialize 方法 最后返回 (SparkDeploySchedulerBackend, TaskSchedulerImpl) 的实例对象
  • SparkDeploySchedulerBackend 是被 TaskSchedulerImpl 来管理的,所以这里要首先把 scheduler 创建,然后把 scheduler 的实例传进去。
    [下图是 SparkContext.scala 中的调用模式匹配 SPARK_REGEX 的处理逻辑]
  • Task 默认失败后重新启动次数为 4 次
    [下图是 TaskSchedulerImpl.scala 中的类和主构造器的调用方法]

TaskSchedulerImpl.initialize( )方法是

  • 创建一个 Pool 来初定义资源分布的模式 Scheduling Mode,默认是 先进先出的 模式。

调用 taskScheduler 的 start( ) 方法

  • 在这个方法中再调用 backend (SparkDeploySchedulerBackend) 的 start( ) 方法。

  • 当通过 SparkDeploySchedulerBackend 注册程序给 Master 的时候会把以上的 command 提交给 Master 
CoarseGrainedExecutorBackend
  • Master 发指令给 Worker 去启动 Executor 所有的进程的时候加载的 Main 方法所在的入口类就是 command 中的CoarseGrainedExecutorBackend,当然你可以实现自己的 ExecutorBackend,在 CoarseGrainedExecutorBackend 中启动 Executor (Executor 是先注册在实例化),Executor 通过线程池并发执行 Task。

  • 这里调用了它的 run 方法


  • 注册成功后再实例化
SparkDeploySchedulerBackend 的 start 方法内幕
  • 然后创建一个很重要的对象,AppClient 对象,然后调用它的 client (AppClient) 的 start( ) 方法,创建一个 ClientEndpoint 对象。

  • 它是一个 RpcEndPoint,然后接下来的故事就是向 Master 注冊,首先调用自己的 onStart 方法
  • 然后再调用 registerWithMaster 方法
  • 从 registerWithMaster 调用 tryRegisterAllMasters,开一条新的线程来注册,然后发送一条信息(RegisterApplication 的case class ) 给 Master,注册是通过 Thread 来完成的。


    ApplicationDescription 的 case class
Master 接受程序的注冊
  • Master 收到了这个信息便开始注册,注册后最后再次调用 schedule( ) 方法
     

 

总结

SparkContext 开启了天堂之门:Spark 程序是通过 SparkContext 发布到 Spark集群的SparkContext 导演了天堂世界:Spark 程序运行都是在 SparkContext 为核心的调度器的指挥下进行的:SparkContext 关闭了天堂之门:SparkContext 崩溃或者结束的是偶整个 Spark 程序也结束啦!

 

程序提交整体流程如下图:

 

 

转载于:https://www.cnblogs.com/sky-sql/p/9078660.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言,使用union了解内存

今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。代码如下:#include "stdio.h" int main() {typedef union{short i;char j[2];}DATA;DATA a;a.j[0] 10;a.j[1] 1;printf("%x\n",a.i);return 0; }他的几个测试代码以及输出…

我做技术的这十年,我不做技术的这一年~

我和明哥认识是因为之前他在群里跟我们分享一件事情,当时因为明哥相信网上认识的一个朋友,说是要一起开发一个项目,结果他被骗了几万块钱。然后聊着聊着,我觉得明哥太实诚了,后面继续接触,知道他做的一些决…

Oracle Golden Gate概要

Oracle GoldenGate简介 Oracle Golden Gate用于源数据库与目标数据库的数据复制备份;可以在异构的环境(各种操作系统和数据库)之间实现数据亚秒级的实时复制备份;以及可以在实时数据仓库、数据同步、集中/分发、容灾、数 据库升级和迁移等多个场景下应用…

android 音频加载hal so调试

1. 整个加载流程图 2. 加载hal so的代码位置 2.1 在audiopolicymanager中的加载位置 diff --git a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index 632290a9…

鸿蒙的路还很长

这是昨晚看到我的老领导发的和鸿蒙有关的文章,我在下面评论了,作为科技自媒体屌丝本屌,我昨晚也是看了鸿蒙2.0的发布会,也有一些观点。鸿蒙OS是什么?鸿蒙os是一个操作系统,而且是面向智能终端的&#xff0c…

有关Accordion组件的研究——Silverlight学习笔记[27]

Accordion组件在开发中常用于信息的分类显示。本文将为大家介绍该组件的特性以及通过一个实例讲述该组件的基本运用。组件所在命名控件:System.Windows.Controls组件常用方法:SelectAll:选择所有位于Accordion组件中的Accordion项。&#xff…

螺旋格式输出数据

螺旋格式输出数据 问题:(问答题) 编程输出以下格式的数据。 When i0 1 When i1 7 8 96 1 25 4 3 When i2 21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13 1、Python: def format_…

聊聊 top 命令中的 CPU 使用率

之前写过cpu占用率的文章CPU占用率是什么?平常我们使用 top 命令来查看系统的性能情况,在 top 命令中可以看到很多不同类型的 CPU 使用率,如下图红框中标出部分:下面,我们来介绍一下这些 CPU 使用率的意义:…

哈尔特征Haar

哈尔特征(Haar-like features) 是用于物体识别的一种数字图像特征。它们因为与哈尔小波转换 极为相似而得名,是第一种即时的人脸检测運算。 历史上,直接使用图像的强度(就是图像每一个像素点的RGB值)使得特征的计算强度很大。帕帕…

乐鑫科技2022笔试面试题

来源于读者投稿,作者来源于牛客网的 galun 。投递方式:内推。岗位:嵌入式软件实习生。个人情况:本科双非电子信息工程,硕士华五软件工程研一在读;本科做过一些很水的项目 ,也拿项目搞了一些奖&a…

同事在RTOS临界区嵌套使用栽了跟头~

1裸机与RTOS的理解首先这里只针对单核CPU架构的芯片展开讨论,大部分是MCU吧,而多核CPU的讨论相对比较复杂,暂不涉及~玩RTOS的朋友都知道,裸机与OS的最大区别就是实现多任务的并发,其实你说裸机就不能实现任务的并发吗 …

一道内存分配的面试题

这是读者在知识星球上写的面试题我之前写的文章有很完整说过这部分C语言,函数不可返回指向栈内存的指针C 语言内存分配堆和栈的区别(转过无数次的文章)看完上面的文章,我觉得你至少对C语言程序变量内存有一个概念了解了。然后看下…

一道内存分配的面试题后续

昨天写的题目,在VC6.0上面测试一下一道内存分配的面试题结果发现一个问题,发现输出结果竟然没有问题,我很慌,如果这样的输出结果没有问题的话,那肯定是跟我们的理论对不上号的。所以我只能继续调试先把问题抛在printf上…

Qt学习之路(11): MainWindow

尽管Qt提供了很方便的快速开发工具QtDesigner用来拖放界面元素,但是现在我并不打算去介绍这个工具,原因之一在于我们的学习大体上是依靠手工编写代码,过早的接触设计工具并不能让我们对Qt的概念突飞猛进……前面说过,本教程很大程…

要毕业了,我应该做点啥?

这几天是高考的日子,高考结束,也意味着有很多人要离开学校,距离我毕业已经过去很多年了,现在还能记得那些无忧无虑的日子,毕竟人这一辈子,能这么肆无忌惮的时间并不多。最近因为发了几个不错的岗位招聘&…

我那个37岁的大神朋友,后续

还记得我之前写的这篇文章吗?我一个37岁的程序员朋友写这篇文章的时候,我建议我的这个朋友跳槽找更好的工作,可以换个行业,换一个更有钱的领域,做技术不能单单是做技术,需要有点眼光,比如选择行…

扒一扒中断为什么不能调printf

[导读] 大家好,我是逸珺。前面说会写一下Modbus-RTU的实现,写了1000多字了,有兴趣的稍等一下哈。前面在一个群里看到一个朋友在一个串口接收中断里打印遇到了问题,今天聊下这个话题。扒一扒printf 对于单片机中printf到底向哪里打…

躺平,躺下就能赢吗?

之前在群里讨论这个话题,说躺平挺好的,没那么大压力,我也觉得躺平是好事,每个人都要追求理想的权力,那么反过来,每个人也有不追求理想的权力。躺平如果说的好听一些,也可以认为是躺赢&#xff0…

感觉stm32太简单是一种自负吗?

其实简单或者复杂都不重要,重要的是通过STM32我们能学习到什么?做一个键盘/鼠标,可以学习USB协议。做一个联网设备,需要学习以太网,TCP/IP协议的底层实现。做一个无线设备,可能需要学习蓝牙、WIFI或者zigbe…

耗时两年,19岁小伙采用230片纯74逻辑芯片搭建出32位处理器!可玩贪吃蛇

从设计 CPU、制作原型机、最终成品到软件编程,19 岁极客小伙用了整整两年的时间。RISC-V 是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),它是对应开源软件运动的一种「开源硬件」。该项目于 2010 年…