Spark Job-Stage-Task实例理解
Spark Job-Stage-Task实例理解
基于一个word count的简单例子理解Job、Stage、Task的关系,以及各自产生的方式和对并行、分区等的联系;
相关概念
- Job:Job是由Action触发的,因此一个Job包含一个Action和N个Transform操作;
- Stage:Stage是由于shuffle操作而进行划分的Task集合,Stage的划分是根据其宽窄依赖关系;
- Task:最小执行单元,因为每个Task只是负责一个分区的数据
处理,因此一般有多少个分区就有多少个Task,这一类的Task其实是在不同的分区上执行一样的动作;
例子代码
'''
DAG: Job vs Stage vs Task
'''
# 初始化spark环境
from pyspark import SparkContext,SparkConf
conf = SparkConf()
conf.setMaster('local').setAppName('Job vs Stage vs Task')
sc = SparkContext(conf=conf)
alpha_rdd1 = sc.parallelize(['a c','a b','b c','b d','c d'],10)
word_count1 = alpha_rdd1.flatMap(lambda a:a.split(' ')).map(lambda a:(a,1)).reduceByKey(lambda x,y:x+y)
alpha_rdd2 = sc.parallelize(['a c','a b','b c','b d','c d'],10)
word_count2 = alpha_rdd2.flatMap(lambda a:a.split(' ')).map(lambda a:(a,1)).reduceByKey(lambda x,y:x+y)
word_count1.join(word_count2).collect()
print('END')
input() # input是方便脚本运行不会终止导致web ui不能正常浏览
可以看到,主要的数据处理逻辑分为三部分,分别是两个word count,以及最后对两个结果的join,事实上这也对应了3个stage,下面是代码与stage的对应图,注意图中的并行关系:

从图中可以看出,原代码只有一个action(collect),因此只有一个Job,这个Job被换分为3个Stage,划分原因是有shuffle出现(reductByKey),而明显看出的是Stage 0和Stage 1互相没有依赖关系,因此可以并行,而Stage 2则是依赖于0和1的,因此会最后一个执行;
Spark Web UI
下面通过Web UI来进一步查看Job、Stage、Task的关系;

从上图看到,只有一个已完成的Job,该Job包含3个Stage,30个Task(注意之前的代码里parallelize设置的分区数为10,3*10=30);

上图表示该Job的运行时间线图,可以明显的看到Stage0和Stage1在时间上有大部分重叠,也就是并行进行,而Stage2是在Stage1结束后才开始,因为Stage0结束的更早,这里对于依赖关系的展示还是很明显的;
另外,对于stage0和stage1,虽然处理的数据量很小,但是依然可以看出二者的运行时间比较接近,也就是没有明显的数据偏斜的情况出现,当然,这里因为只是测试数据,而真实场景下很容易出现个别stage执行时间远远超过其他的stage,导致整体的时间被拖长;

上图是该Job对应的DAG可视化图,它是直接的对Stage以及Stage间的依赖关系进行展示,也验证了我们之前的分析,这里每个Stage还可以继续点进去;

上图中可以更清晰的看到,每个Stage中都包含10个Task,其实就是对应10个partition,对于Stage0和Stage1,他们都是在shuffle前的Stage,因此他们都有Shuffle Write的动作,大小都是514,而Stage2则是join这两部分数据,因此有Shuffle Read动作,大小而前二者之和,也就是1028;
Spark Job-Stage-Task实例理解的更多相关文章
- Spark分区数、task数目、core数目、worker节点数目、executor数目梳理
Spark分区数.task数目.core数目.worker节点数目.executor数目梳理 spark隐式创建由操作组成的逻辑上的有向无环图.驱动器执行时,它会把这个逻辑图转换为物理执行计划,然后将 ...
- 【原】Spark中Stage的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job如何划分为Stage http://www.cnblogs.com/yourarebest/p/5342424.html 1 ...
- 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程
本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...
- 【Spark】Stage生成和Stage源代码浅析
引入 上一篇文章<DAGScheduler源代码浅析>中,介绍了handleJobSubmitted函数,它作为生成finalStage的重要函数存在.这一篇文章中,我将就DAGSched ...
- spark 笔记 9: Task/TaskContext
DAGScheduler最终创建了task set,并提交给了taskScheduler.那先得看看task是怎么定义和执行的. Task是execution执行的一个单元. Task: execut ...
- 【C# Task】理解Task中的ConfigureAwait配置同步上下文
原文:https://devblogs.microsoft.com/dotnet/configureawait-faq/ 作者:Stephen 翻译:xiaoxiaotank 静下心来,你一定会有收获 ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- 通过实例理解 RabbitMQ 的基本概念
先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...
- [学习笔记]一个实例理解Lingo的灵敏性分析
一个实例理解Lingo的灵敏性分析 线性规划问题的三个重要概念: 最优解就是反应取得最优值的决策变量所对应的向量. 最优基就是最优单纯形表的基本变量所对应的系数矩阵如果其行列式是非 ...
随机推荐
- window下git多账户管理
前言 一般情况下,我们都是一台电脑配置一个Git账号,使用如下命令: git config --global user.name "your name" git config -- ...
- wsgi的environ变量
The environ dictionary is required to contain these CGI environment variables, as defined by the Com ...
- 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发
智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...
- python练习 英文字符的鲁棒输入+数字的鲁棒输入
鲁棒 = Robust 健壮 英文字符的鲁棒输入 描述 获得用户的任何可能输入,将其中的英文字符进行打印输出,程序不出现错误. ...
- k8s设置pod运行完自动删除
本环境apiserver.controller还要scheduler都是以pod的形式运行的,修改/etc/kubernetes/manifests下面对应的三个.yaml静态文件,加入 - --fe ...
- TypeError 之 Cannot convert undefined or null to object
分享一个今天遇到的一个bug , 希望对你也有用. 1.Object.keys()中传错了参数 2.由于undefined和null无法转成对象,所以如果它们做为Object.assign()的参数( ...
- C++模板函数只能全特化不能偏特化
C++模板函数只能全特化不能偏特化
- Spring JPA 定义查询方法
Spring JPA 定义查询方法 翻译:Defining Query Methods 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 可用选项基于 ...
- 解决ASP.NET上传文件大小限制------(转载人家的博客很好用,略作修改)
解决ASP.NET上传文件大小限制 (2012-06-26 15:18:01) 转载▼ 标签: it 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRun ...
- idea报错cannot resolve symbol servlet
解决方法:在project structure中导入包.该包在tomcat安装目录的lib文件夹.导入之后点击Apply.