『 Spark 』6. 深入研究 spark 运行原理之 job, stage, task

『 Spark 』6. 深入研究 spark 运行原理之 job, stage, task - 简书
http://www.jianshu.com/p/8f30761b0e71

写在前面
本系列是综合了自己在学习spark过程中的理解记录 + 对参考文章中的一些理解 + 个人实践spark过程中的一些心得而来。写这样一个系列仅仅是为了梳理个人学习spark的笔记记录,所以一切以能够理解为主,没有必要的细节就不会记录了,而且文中有时候会出现英文原版文档,只要不影响理解,都不翻译了。若想深入了解,最好阅读参考文章和官方文档。
其次,本系列是基于目前最新的 spark 1.6.0 系列开始的,spark 目前的更新速度很快,记录一下版本好还是必要的。最后,如果各位觉得内容有误,欢迎留言备注,所有留言 24 小时内必定回复,非常感谢。Tips: 如果插图看起来不明显,可以:1. 放大网页;2. 新标签中打开图片,查看原图哦。

  1. spark 运行原理
    这一节是本文的核心,我们可以先抛出一个问题,如果看完这一节,或者这一章之后,你能理解你的整个 spark 应用的执行流程,那就可以关掉这个网页了[对了,关掉网页之前记得分享一下哦,哈哈]
    ***Problem: How does user program get translated into units of physical execution ?

我们用一个例子来说明,结合例子和运行截图来理解。
1.1 例子,美国 1880 - 2014 年新生婴儿数据统计
目标
:用美国 1880 - 2014 年新生婴儿的数据来做做简单的统计
数据源
https://catalog.data.gov
数据格式
:每年的新生婴儿数据在一个文件里面
每个文件的每一条数据格式:姓名,性别,新生人数

baby-data-format.jpg

代码和结果展示

packagesimport pandas as pd### spark UDF (User Defined Functions)def map_extract(element): file_path, content = element year = file_path[-8:-4] return [(year, i) for i in content.split("\r\n") if i]### spark logicres = sc.wholeTextFiles('hdfs://10.21.208.21:8020/user/mercury/names', minPartitions=40) \ .map(map_extract) \ .flatMap(lambda x: x) \ .map(lambda x: (x[0], int(x[1].split(',')[2]))) \ .reduceByKey(operator.add) \ .collect()### result displayingdata = pd.DataFrame.from_records(res, columns=['year', 'birth'])\ .sort(columns=['year'], ascending=True)ax = data.plot(x=['year'], y=['birth'], figsize=(20, 6), title='US Baby Birth Data from 1897 to 2014', linewidth=3)ax.set_axis_bgcolor('white')ax.grid(color='gray', alpha=0.2, axis='y')

baby-name-1.jpg

1.2 运行流程概览
还记得我们在 『 Spark 』3. spark 编程模式 讲到的构建一个 spark application 的过程吗:
加载数据集
处理数据
结果展示

上面的 22 行代码,就已经把构建一个 spark app 的三大步骤完成了,amazing, right? 今天我们主要讲 spark 的运行逻辑,所以我们就以核心的 11 - 16 ,这六行代码来作为今天的主线,了解了解 spark 的原理。


baby-name-2.jpg

可以看到,整个逻辑实际上就用了 sparkContext 的一个函数,rdd 的 3 个 transformation 和 1 个 action。


baby-name-job.jpg

现在让我们从 WEB UI 上来看看,当我们运行这段代码的时候,后台都发生了什么。可以看到,执行这段代码的时候,spark 通过分析,优化代码,知道这段代码需要一个 job 来完成,所以 web ui 上只有一个 job。值得深究的是,这个 job 由两个 stage 完成,这两个 state 一共有 66 个 task。
所以,这里我们就再次理解下 spark 里,job,stage,task 的概念:
job : A job is triggered by an action, like count() or saveAsTextFile(). Click on a job to see information about the stages of tasks inside it. 理解了吗,所谓一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job。
stage : stage 是一个 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。至于 job 根据什么标准来切分 stage,可以回顾第二篇博文:『 Spark 』2. spark 基本概念解析
task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。从 web ui 截图上我们可以看到,这个 job 一共有 2 个 stage,66 个 task,平均下来每个 stage 有 33 个 task,相当于每个 stage 的数据都有 33 个 partition [注意:这里是平均下来的哦,并不都是每个 stage 有 33 个 task,有时候也会有一个 stage 多,另外一个 stage 少的情况,就看你有没有在不同的 stage 进行 repartition 类似的操作了。]

baby-name-ui-1.jpg

1.3 运行流程之 : job
根据上面的截图和再次重温,我们知道这个 spark 应用里只有一个 job,那就是因为我们执行了一个collect
操作,即把处理后的数据全部返回到我们的 driver 上,进行后续的画图,返回的数据如下图:


baby-name-3.jpg

1.4 运行流程之 : stage
我们这个 spark 应用,生成了一个 job,这个 job 由 2 个 stage 组成,并且每个 stage 都有 33 个task,说明每个 stage 的数据都在 33 个 partition 上,这下我们就来看看,这两个 stage 的情况。
首先,我们先看看为什么这里会有两个 stage,根据 『 Spark 』2. spark 基本概念解析 中对 stage 的描述,目前有两个划分 stage 的标准:
当触发 rdd 的 action 时 : 在我们的应用中就是最后的collect
操作,关于这个操作的说明,可以看官方文档: rdd.collect
当触发 rdd 的 shuffle 操作时 : 在我们的应用中就是reduceByKey
这个操作,官方文档: rdd.reduceByKey

baby-name-4.jpg

再次回顾上面那张图:


baby-name-job.jpg

这下应该就明了了,关于两个 stage 的情况:


baby-name-5.jpg

第一个 stage,即截图中 stage id 为 0 的 stage,其执行了sc.wholeTextFiles().map().flatMap().map().reduceByKey()
这几个步骤,因为这是一个Shuffle
操作,所以后面会有Shuffle Read
和Shuffle Write
。具体来说,就是在 stage 0 这个 stage 中,发生了一个 Shuffle 操作,这个操作读入 22.5 MB 的数据,生成 41.7 KB 的数据,并把生成的数据写在了硬盘上。

第二个 stage,即截图中 stage id 为 1 到 stage,其执行了collect()
这个操作,因为这是一个action
操作,并且它上一步是一个 Shuffle 操作,且没有后续操作,所以这里collect()
这个操作被独立成一个 stage 了。这里它把上一个 Shuffle 写下的数据读取进来,然后一起返回到 driver 端,所以这里可以看到他的Shuffle Read
这里刚好读取了上一个 stage 写下的数据。

1.5 运行流程之 : task
其实到这里应该都理解得差不多了,至于为什么每个 stage 会有 33 个 task [即我们的数据文件存放到 33 个partition 上,可是明明sc.wholeTextFiles('hdfs://10.21.208.21:8020/user/mercury/names', minPartitions=40)
这里指定了最小要 40 个partition 到啊],这个问题我们留到以后说,在后面我们会有一篇讲怎么调试,优化 spark app 的博文,到时候我们会继续回到这里,解答这里的问题。

baby-name-7.jpg

baby-name-8.jpg

baby-name-9.jpg

baby-name-10.jpg

baby-name-11.jpg

baby-name-12.jpg

  1. Next
    既然我们都慢慢开始深入理解 spark 的执行原理了,那下次我们就来说说 spark 的一些配置吧,然后再说说 spark 应用的优化。
    参考文章
    Tuning and Debugging in Apache Spark
    learning spark
    Spark配置
    Spark 配置指南

本系列文章链接
『 Spark 』1. spark 简介
『 Spark 』2. spark 基本概念解析
『 Spark 』3. spark 编程模式
『 Spark 』4. spark 之 RDD
『 Spark 』5. 这些年,你不能错过的 spark 学习资源
『 Spark 』6. 深入研究 spark 运行原理之 job, stage, task
『 Spark 』7. 使用 Spark DataFrame 进行大数据分析
『 Spark 』8. 实战案例 | Spark 在金融领域的应用 | 日内走势预测
『 Spark 』9. 搭建 IPython + Notebook + Spark 开发环境
『 Spark 』10. spark 应用程序性能优化|12 个优化方法

文/litaotao(简书作者)原文链接:http://www.jianshu.com/p/8f30761b0e71著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

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

推荐阅读更多精彩内容