Spark、job、stage、task之间的关系

什么是Spark?

Spark是处理大数据常用的计算引擎。Spark是一个用来实现快速而通用的集群计算的平台。扩展了广泛使用的MapReduce计算模型,而且高效地支持更多的计算模式,包括交互式查询和流处理。和MapReduce相比,spark支持内存计算,一般比MapReduce更高效。

一般我们在提交spark任务的时候,都会去其UI界面查看任务运行状况。其中就有job、stage、task的一些执行进度展示。今天,就详细说明一下这些名词术语的含义。

Job

spark中的数据都是抽象为RDD的,它支持两种类型的算子操作:Transformation和Action。Transformation算子的代码不会真正被执行。只有当我们的程序里面遇到一个action算子的时候,代码才会真正的被执行。

Transformation算子主要包括:map、mapPartitions、flatMap、filter、union、groupByKey、repartition、cache等。

Action算子主要包括:reduce、collect、show、count、foreach、saveAsTextFile等。

当在程序中遇到一个action算子的时候,就会提交一个job,执行前面的一系列操作。因此平时要注意,如果声明了数据需要cache或者persist,但在action操作前释放掉的话,该数据实际上并没有被缓存。

通常一个任务会有多个job,job之间是按照串行的方式执行的。一个job执行完成后,才会起下一个job。有一段时间曾想让job并行执行,但没有找到解决方法。

Stage

一个job通常包含一个或多个stage。各个stage之间按照顺序执行。上面已经说过,一个job会有多个算子操作。这些算子都是将一个父RDD转换成子RDD。这个过程中,会有两种情况:父RDD中的数据是否进入不同的子RDD。如果一个父RDD的数据只进入到一个子RDD,比如map、union等操作,称之为narrow dependency(窄依赖)。否则,就会形成wide dependency( 宽依赖),一般也成为shuffle依赖,比如groupByKey等操作。

job中stage的划分就是根据shuffle依赖进行的。shuffle依赖是两个stage的分界点。shuffle操作一般都是任务中最耗时耗资源的部分。因为数据可能存放在HDFS不同的节点上,下一个stage的执行首先要去拉取上一个stage的数据(shuffle read操作),保存在自己的节点上,就会增加网络通信和IO。Shuffle操作其实是一个比较复杂的过程,这里暂且不表。

Task

一个spark application提交后,陆续被分解为job、stage,到这里其实还是一个比较粗的概念。Stage继续往下分解,就是Task。Task应该是spark最细的执行单元了。Task的数量其实就是stage的并行度。

RDD在计算的时候,每个分区都会起一个task,所以rdd的分区数目决定了总的的task数目。每个Task执行的结果就是生成了目标RDD的一个partiton。在Map阶段partition数目保持不变。在Reduce阶段,RDD的聚合会触发shuffle操作,聚合后的RDD的partition数目跟具体操作有关,例如repartition操作会聚合成指定分区数。coalesce算子同样可以改变partition的数目,不过只能减少不能增加。repartition和coalesce算子的区别在于前者会引发shuffle,后者则不会。

到这里,基本上介绍完了job、stage、task的一些特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值