Spark 2.x 应用提交流程

Spark的计算抽象

Spark组件间的交互流程之前,先看下它的计算抽象

1. Application

它是用户编写的spark程序,完成一个计算任务的处理.  Application = 1个Driver(驱动程序) + 一组Executor(执行程序,运行在spark节点上).

2. Job

在用户程序中,每次调用Action(行动),逻辑上会生成一个job,一个Job包含多个Stage.

3. Stage

需要shuffle的时候就会将每个Job划分为多个Stage,Stage划分的依据就是宽依赖,例如reduceByKey,groupByKey等会产生宽依赖.

Stage包括两类: ShuffleMapStage和ResultStage. 后面的Stage依赖于前面的Stage,也就是说只有前面依赖的Stage计算完毕后,后面的Stage才会运行。

ShuffleMapStage: 不是最终的Stage,后面还有其他的Stage,是以shuffle为输出,它的输入可以从外部获取,也可以是另一个ShuffleMapStage的输出. 在一个Job里面它可以由也可以没有. ShuffleMapStage的最后Task就是ShuffleMapTask

ResultStage: 是最终的Stage,它的输入可以是shuffleMapStage,也可以是外部的Stage. 在一个Job里面是至少有一个Stage(因为无论如何都要输出嘛),ResultStage的最后Task就是ResultTask

窄依赖: 指一个或多个父partition对一个子partition,只能被一个子partition使用. 窄依赖都是Map任务,不需要发生shuffle。因此,窄依赖的Task一般都会被合成在一起,构成一个Stage。

宽依赖: 指一个父partition对多个子partition,被多个子partition使用. 宽依赖需要子计算出父的partition里面的数据,然后进行shuffle, RDD的partition

4. TaskSet

基于Stage可以直接映射为TaskSet,一个TaskSet包含多个Task,一个TaskSet封装了一次需要运算的具有相同处理逻辑的Task.,默认为200个

5. Task

Task是物理节点上基本的运行单位,且Task可以并行计算.因此需要Executor启动多个线程来执行Task. Task包含两类: ShuffleMapTask和ResultTask,分别对应Stage中的ShuffleMapStage和ResultStage中的一个执行基本单元

总结

用户提交的Spakr程序,最终生成TaskSet, 而在调度时,通过TaskSetManager来管理一个TaskSet(TaskSet封装了一次相同逻辑的Task),只有一个TaskSet中所有的Task都运行完之后,才能调度下一个TaskSet中的Task区执行.


Spark核心组件的交互流程

在Standalone模式下,组件间的主要交互流程如下:

一个Application启动一个Driver

一个Driver负责跟踪管理该Application运行过程中所有的资源状态和任务状态

一个Driver管理一组Executor

一个Executor只执行属于一个Driver的Task

Spark应用程序提交流程

上图总结如下:

spark -submit后: 应用程序提交 => 启动Driver进程 => 注册Application => 启动Executor进程 => 启动Task执行 => Task运行完成

上图详细如下:

1. Driver进程是怎么启动的,启动了哪些东西

在DriverClient(JVM)里面, Spark submit提交之后, 创建ClientEndpoint(和Master进行通信用的)端点, ClientEndpoint这时会给Master发个消息, 叫RequestSubmitDriver(请求提交DriverJAR包)的消息, Master接收完之后, Master中的MasterEndpoint会给Worker发一个消息, 叫LaunchDriver(启动一个Driver), 假设已经启动成功了, 那MasterEndpoint就会像DriverClient发送一个叫SubmitDriverResponse的消息(告诉Driver已经启动成功了), ClientEndpoint就会给Master发送一个RequestDriverStatus的消息, 确认下是否成功了, 如果成功了, DriverClient就退出,Driver启动成功. 回到第一步Master中的MasterEndpoint会给Worker发一个消息, 叫LaunchDriver(启动一个Driver)这里, WorkerEndpoint接到LaunchDriver消息后, 他会创建一个DriverRunner封装的类, DriverRunner会根据本地的run DriverWrapper(封装的东西)去启动一个Driver进程, 这个Driver是在这个Worker上启动的, 这个时候Driver就运行成功了.

2. 注册Application是怎么做的,注册了什么东西

在Driver中, new了一个SparkConText(我们代码上是new了一个SparkConText), 接着SparkConText创建了一个SparkEnv(它汇集了Spark链接.关联等消息组合), SparkConText再次创建了TaskScheduler(他是具体运行任务用的). 接着SparkConText会根据我们传入的--Master, 去做StandaloneSchedulerBackend(具体运行程序,具体需要资源用的)的实例化, StandaloneSchedulerBackend接着创建了一个DriverEndpoint(它是用来通信用的,主要用于发布任务的, 和Executer消息通信),StandaloneSchedulerBackend接着创建了一个ClientEndpoint(它主要是和Master通信用的), 所以在Driver中有两个RPC端点,也有两个Inbox(DriverEndpoint和ClientEndpoint), 到此时位置,SparkContext已经new完了,ClientEndpoint会向Master发送一个RegisterApplication的消息, 告诉Master,Driver已经创建完了, Master中的MasterEndpoint接到RegisterApplication要运行Driver的请求之后,MasterEndpoint就向Driver中的RegisteredApplication, 告诉它已经注册好了, 这时就注册好了.

3.Executor是怎么启动的,启动了什么东西

注册完了之后, Master就要给这个应用程序分配资源了, MasterEndpoint会向挑选好的Worker中发送一个LaunchExecutor的消息, 同时向Driver发送一个ExecutorAdded的消息, 意思就是告诉Driver, Master正在给你申请Executor, 这是Executor还没建成. Woker接到LaunchExecutor的消息后, 就new了一个ExecutorRunner,ExecutorRunner就新建了一个Executor的实例(JVM), 同时, Worker中的DriverRunner就启动了Executor(也有关闭的权限), 启动完成之后, Worker中的WorkerEndpoint就向Master发送了一个ExecutorStateChanged的消息, MasterEndpoint接到这个消息之后, 就知道Executor创建且启动好了, MasterEndpoint就向Driver发送一个ExecutorUpdated的消息, 也就是告诉Driver,它要的Executor创建好了, 并且启动了, 你可以向下执行你的Task任务了, 至此为止,Executor就已经创建且启动了

4. Executor来了之后,是怎么转换成RDD,RDD是怎么转换成Task执行的

Executor启动之后,StandaloneSchedulerBackend就启动DriverEndpoint(因为在任务运行需要启动这个东西),DriverEndpoint有线程就会向ReviveOffers访问,看看有没资源,有没有资源让我的Task去运行,如果有,StandaloneSchedulerBackend就会告诉TaskScheduler,你能够把我的那些RDD创建Task运行了,DriverEndpoint就会告诉选中的Executor中的LaunchTask,去创建Task吧,CoarseGrainedExecutorBackend接收到LaunchTask的消息后,CoarseGrainedExecutorBackend就会真正的去Executor,真正的去执行这个任务.执行完了,Executor就会向告诉CoarseGrainedExecutorBackend,任务执行完了,接着CoarseGrainedExecutorBackend就会向Driver发消息,说StatusUpdate,告诉Driver当前的任务已经运行完了,同时就执行下面的Task.

5. Task执行完成之后,是怎么回调的

依旧从上面那个看看有没资源开始起循环, 最后, 所有的任务都运行完成, Driver结束, Driver结束了之后, 就告诉MasterEndpoint整个Application结束了, MasterEndpoint接收到Application结束后, 就告诉相应的Worker, 叫DriverRunner关掉Application所有的Executor, 至此整个运行结束!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容