Spark内核作业调度机制

以一个简单的WordCount代码为例

sc.textFile("hdfs://...").flatMap(_.split(" ")).map(_,1).reduceByKey(_+_).map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1)).saveAsTextFile("hdfs://....")

以上代码的作用是读取指定位置的文件,经过map和reduceByKey之后按照数量大小进行排序,最后保存在hdfs中

首先应用程序创建SparkContext的实例sc,利用sc读取文件生成初始的RDD,经过一连串的transformation操作,将原始的RDD转换成其他类型的RDD

当action作用于转换之后的RDD时,会触发sc的runJob方法,这是引起Spark内核一系列反应的起点

提交这个作业到Spark集群中,Spark是如何工作的?中间的处理过程RDD经过怎样的转换?都需要经过什么样的处理过程?

首先来看网上一张简单的Spark事件流示意图:

Spark的作业分为transformation(flatmap等)和action(reduceByKey等)两种,action获取结果之前的transformation操作都是不执行的,而是绘制成一张DAG有向无环图,真正执行作业的时候会根据这个DAG图来执行

runJob中会将例如WordCount等作业,生成的DAG图和argetRDD,partitions等信息提交给DAGScheduler

DAGScheduler会根据DAG图中RDD之间的依赖关系将整个DAG图分成若干个stage,并生成taskSet(由stage组成)然后将这些taskSet通过submitTasks提交到TaskSchaduler

TaskSchaduler会将作业提交到集群或者本地中环境进行计算,并对有错误的taskSet进行相应的容错处理,最后将运行结果返回

上面是对Spark作业调度的一次简单描述,这其中可能会有一些关于RDD依赖关系的疑问

RDD之间的依赖关系是什么:

依赖关系可以分两种,窄依赖和宽依赖

窄依赖:子RDD中的每个数据块只依赖于父RDD中对应的有限个固定的数据块,可以理解成父子RDD是一对一的关系,例如:map变换,前后的数据都是一行对一行的。一个子RDD可以根据其父RDD直接计算得出,因而子RDD出现计算错误的时候,只需要重新计算对应的父RDD即可

宽依赖:子RDD中的一个数据块可以依赖于父RDD中的所有数据块。即一对多的情况,例如:groupByKey变换,子RDD中的数据块会依赖于多个父RDD中的数据块,因为一个key可能存在于父RDD的任何一个数据块中 。宽依赖中的子RDD要等到所有的父RDD计算完成之后才能进行计算,当数据丢失时需要对所有祖先RDD进行重新计算

之前是在应用程序作业提交的角度看Spark的作业调度机制,下面换一个视角,即从Spark集群的角度看作业调度

1.在集群启动的时候,各个slave节点(也可以说是worker)会向集群的Master注册,告诉Master我随时可以干活了,随叫随到

2.Master会根据一种心跳机制来实时监察集群中各个worker的状态,是否能正常工作

3.Driver Application提交作业的时候也会先向Master注册信息

4.作业注册完毕之后,Master会向worker发射Executor命令

5.worker产生若干个Executor准备执行

6.各个worker中的Executor会向Driver Application注册Executor信息,以便Driver Application能够将作业分发到具体的Executor

7.Executor会定期向Driver Application报告当前的状态更新信息

8.Driver Application发射任务到Executor执行

每个worker中会包含若干个Executor,Executor是比worker更小的单位,作业的具体执行都是在Executor上完成

结合以上两张图和之前的描述可以得出一些结论:

DAGSchaduler的输入是DAG图,按照RDD依赖关系划分stage之后,输出的是TaskSet

TaskSchaduler的输入是TaskSet,输出结果是将Task加到队列中,指定由哪个worker来执行Task

在这些worker中启动Executor来执行tasks

下图是Spark集群中作业执行完毕之后的处理事件流示意图:

最后记录一下提交Spark作业的方法

在spark的bin目录下

执行spark-submit脚本

./spark-submit \

–class 入口函数所在的类名全称 \

–master spark master节点的地址(默认端口7077)\

–executor-memory 指定worker中Executor的内存 \

–total-executor-cores 100 \

jar文件所在的目录 \

时间: 2024-12-23 19:07:31

Spark内核作业调度机制的相关文章

大数据计算平台Spark内核全面解读

1.Spark介绍 Spark是起源于美国加州大学伯克利分校AMPLab的大数据计算平台,在2010年开源,目前是Apache软件基金会的顶级项目.随着Spark在大数据计算领域的暂露头角,越来越多的企业开始关注和使用.2014年11月,Spark在Daytona Gray Sort 100TB Benchmark竞赛中打破了由Hadoop MapReduce保持的排序记录.Spark利用1/10的节点数,把100TB数据的排序时间从72分钟提高到了23分钟. Spark在架构上包括内核部分和4

精通Spark:Spark内核剖析、源码解读、性能优化和商业案例实战

这是世界上第一个Spark内核高端课程: 1, 该课程在对Spark的13个不同版本源码彻底研究基础之上提炼而成: 2, 课程涵盖Spark所有内核精髓的剖析: 3, 课程中有大量的核心源码解读: 4, 全景展示Spark商业案例下规划.部署.开发.管理技术: 5, 涵盖Spark核心优化技巧 该课程是Spark的高端课程,其前置课程是“18小时内掌握Spark:把云计算大数据速度提高100倍以上!”. 培训对象 1,  系统架构师.系统分析师.高级程序员.资深开发人员: 2, 牵涉到大数据处理

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

【Spark 内核】 Spark 内核解析-下

Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spark内核原理,能够帮助我们更好地完成Spark代码设计,并能够帮助我们准确锁定项目运行过程中出现的问题的症结所在. Spark Shuffle 解析 Shuffle 的核心要点 ShuffleMapStage与ResultStage 在划分stage时,最后一个stage称为finalStage,它本质上是一个ResultSt

[内核同步]浅析Linux内核同步机制

转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral 很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本书的相关章节.趁刚看完,就把相关的内容总结一下.为了弄清楚什么事同步机制,必须要弄明白以下三个问题: 什么是互

Spark内核架构解密(DT大数据梦工厂)

只有知道内核架构的基础上,才知道为什么要这样写程序? 手工绘图来解密Spark内核架构 通过案例来验证Spark内核架构 Spark架构思考 ==========Spark Runtime的几个概念============ 下载下来运行,基本都是standalone模式,如果掌握了standalone,则yarn和mesos,以后不做特别说明,一律是standalone模式 application=driver+executor,executor是具体处理数据分片,里面是线程池并发的处理数据分片

2.Spark Streaming运行机制和架构

1 解密Spark Streaming运行机制 上节课我们谈到了技术界的寻龙点穴.这就像过去的风水一样,每个领域都有自己的龙脉,Spark就是龙脉之所在,它的龙穴或者关键点就是SparkStreaming.这是上一节课我们非常清晰知道的结论之一.而且上一节课,我们采用了降维的方式.所谓降维的方式,是指把时间放大,就是把时间变长的情况下,我们做SparkStreaming的案例演示的实战,实战的结果是,我们发现在特定的时间段里面,确实是具体的RDD在工作,那么这一节课有必要在上一节课的基础上去谈一

Linux内核同步机制

http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制——信号量.锁. 一.信号量 首先还是看看内核中是怎么实现的,内核中用struct semaphore数据结构表示信号量(<linux/semphone.h>中): [cpp] view plaincopyprint? struct semaph

【Spark 深入学习 04】再说Spark底层运行机制

本节内容 · spark底层执行机制 · 细说RDD构建过程 · Job Stage的划分算法 · Task最佳计算位置算法 一.spark底层执行机制 对于Spark底层的运行原理,找到了一副很好的图,先贴上 客户端提交应用后,spark是如何执行的要有一个整体的概念,做到心中有数,先整体把握,才能更好的分模块开垦细节,废话不多说,先来看该图如何更好的理解. 1)提交前的联系 Worker向Master或则ResourceManager汇报自己有哪些资源(内存.CPU.磁盘空间.网络等),Ma