本课主题

  • 什么是 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
  2. 从整个程序运行的角度来讲,SparkContext 包含四大核心对象:DAGSchedulerTaskScheduler, SchedulerBackend, MapOutputTrackerMaster
  3. 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 程序也结束啦!

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

Spark天堂之门解密的更多相关文章

  1. [Spark内核] 第28课:Spark天堂之门解密

    本課主題 什么是 Spark 的天堂之门 Spark 天堂之门到底在那里 Spark 天堂之门源码鉴赏 引言 我说的 Spark 天堂之门就是SparkContext,这篇文章会从 SparkCont ...

  2. Spark RDD解密

    1.  基于数据集的处理: 从物理存储上加载数据,然后操作数据,然后写入数据到物理设备; 基于数据集的操作不适应的场景: 不适合于大量的迭代: 不适合交互式查询:每次查询都需要对磁盘进行交互. 基于数 ...

  3. 14.spark RDD解密

    开篇:spark各种库,sparksql,sparkmachicelearning,等这么多库底层都是封装的RDD.意味着 1:RDD本身提供了通用的抽象, 2:spark现在有5个子框架,sql,S ...

  4. [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

    本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...

  5. [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等

    本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...

  6. TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等

    本课主题 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...

  7. Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

    本课主题 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 Spark Executor 工作 ...

  8. 王家林 大数据Spark超经典视频链接全集[转]

    压缩过的大数据Spark蘑菇云行动前置课程视频百度云分享链接 链接:http://pan.baidu.com/s/1cFqjQu SCALA专辑 Scala深入浅出经典视频 链接:http://pan ...

  9. Spark 学习笔记大纲

    Spark 内核 第28课:Spark天堂之门解密 (点击进入博客)从 SparkContext 创建3大核心对象开始到注册给 Master 这个过程中的源码鉴赏 第29课:Master HA彻底解密 ...

随机推荐

  1. HDU - 3652 数位DP 套路题

    题意:统计能被13整除和含有13的数的个数 解法没法好说的..学了前面两道直接啪出来了 PS.HDU深夜日常维护,没法交题,拿网上的代码随便对拍一下,输出一致 #include<bits/std ...

  2. java获取缓存通用类

    1 class JedisHelper { public static <T, R> T getBySecond(String cacheKey, int seconds, R p, Fu ...

  3. python-基础学习篇(一)

    python基础学习(一) 不积硅步,无以至千里.基础的学习越加透彻,才能更清楚的理解和分析需求,我贯彻基础学习“永无止境”的理念,故把自学的知识梳理在博客中,基础学习篇无限更新. python介绍 ...

  4. http和web缓存

    1.http的缓存类型   缓 存对于一个网站来说非常重要,可以提高网站性能,减少冗余的数据传输,增加服务器负担,web存储则给浏览器提供了更加强大的保存文件的接口.关于web下的http缓存类型比较 ...

  5. Vue添加新的响应式属性

    vm.userProfile = Object.assign({}, vm.userProfile, { age: , favoriteColor: 'Vue Green' })

  6. spring利用cors处理跨域问题

    参考 http://blog.csdn.net/isea533/article/details/50449907 写的很全面 http://blog.csdn.net/a317560315/artic ...

  7. phantomJs原理

    引用文段:链接:https://www.jianshu.com/p/0254391918f7 网页渲染可分为服务端渲染和客户端渲染,前者是指你在浏览器地址栏输入一个网址,Web服务器处理请求过程就将所 ...

  8. oracle 基础知识(十五)----高水位线

    一,oracle的逻辑存储管理 ORACLE的逻辑存储管理,分4个粒度:表空间,段,区和块. ## 块 粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是 ...

  9. oracle12C--DG搭建配置

    一,主库前期操作 搭建的话和11g差不多,点点点. 两台服务器,一台主库,一台从库 01,配置主库hosts cat /etc/hosts 192.168.0.31 node12c01 192.168 ...

  10. Murano Weekly Meeting 2016.08.16

    Meeting time: 2016.August.16 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: ...