Spark的几个基本概念:Driver和Job,Stage

Driver Program, Job和Stage是Spark中的几个基本概念。Spark官方文档中对于这几个概念的解释比较简单,对于初学者很难正确理解他们的涵义。

官方解释如下(http://spark.apache.org/docs/latest/cluster-overview.html):
Driver Program: The process running the main() function of the application and creating the SparkContext.
Job: A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.
Stage: Each job gets divided into smaller sets of tasks called stages that depend on each other (similar to the map and reduce stages in MapReduce); you’ll see this term used in the driver’s logs.

看起来很抽象对不对?反正我看完后对于这几个概念还是一头雾水。于是Yahoo了一下,在stackoverflow上看到一篇帖子问了类似的问题。下面有好心人举了一个简单易懂的例子,解释了这几个概念的区别。

链接如下:
http://stackoverflow.com/questions/28973112/what-is-spark-job

我简单整理了一下,方便大家参考。

例子:

术语总是难以理解的,因为它取决于所处的上下文。在很多情况下,你可能习惯于“将Job提交给一个cluster”,但是对于spark而言却是提交了一个driver程序。

也就是说,对于Job,spark有它自己的定义,如下:
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.

在这个例子中,假设你需要做如下一些事情:
1. 将一个包含人名和地址的文件加载到RDD1中
2. 将一个包含人名和电话的文件加载到RDD2中
3. 通过name来Join RDD1和RDD2,生成RDD3
4. 在RDD3上做Map,给每个人生成一个HTML展示卡作为RDD4
5. 将RDD4保存到文件
6. 在RDD1上做Map,从每个地址中提取邮编,结果生成RDD5
7. 在RDD5上做聚合,计算出每个邮编地区中生活的人数,结果生成RDD6
8. Collect RDD6,并且将这些统计结果输出到stdout

为了方便说明,我将这个例子整理成如下的一张示意图:
这里写图片描述

其中红色虚线表示输入和输出,蓝色实线是对RDD的操作,圆圈中的数字对应了以上的8个步骤。接下来解释driver program, job和stage这几个概念:

  1. Driver program是全部的代码,运行所有的8个步骤。
  2. 第五步中的save和第八步中的collect都是Spark Job。Spark中每个action对应着一个Job,transformation不是Job。
  3. 其他的步骤(1、2、3、4、6、7)被Spark组织成stages,每个job则是一些stage序列的结果。对于一些简单的场景,一个job可以只有一个stage。但是对于数据重分区的需求(比如第三步中的join),或者任何破坏数据局域性的事件,通常会导致更多的stage。可以将stage看作是能够产生中间结果的计算。这种计算可以被持久化,比如可以把RDD1持久化来避免重复计算。
  4. 以上全部三个概念解释了某个算法被拆分的逻辑。相比之下,task是一个特定的数据片段,在给定的executor上,它可以跨越某个特定的stage。

到了这里,很多概念就清楚了。驱动程序就是执行了一个Spark Application的main函数和创建Spark Context的进程,它包含了这个application的全部代码。Spark Application中的每个action会被Spark作为Job进行调度。每个Job是一个计算序列的最终结果,而这个序列中能够产生中间结果的计算就是一个stage。

再回过头来看一下Spark Programming Guide,对于Transformations和Actions是有着明确区分的。通常Action对应了Job,而Transformation对应了Stage:

Action列表:

  • reduce
  • collect
  • count
  • first
  • take
  • takeSample
  • takeOrdered
  • saveAsTextFile
  • saveAsSequenceFile
  • saveAsObjectFile
  • countByKey
  • foreach

Transformation列表:

  • map
  • filter
  • flatMap
  • mapPartitions
  • mapPartitionsWithIndex
  • sample
  • union
  • intersection
  • distinct
  • groupByKey
  • reduceByKey
  • aggregateByKey
  • sortByKey
  • join
  • cogroup
  • cartesian
  • pipe
  • coalesce
  • repartition
  • repartitionAndSortWithinPartitions

至于task,官方文档中是这么说的:Task is a unit of work that will be sent to one executor。再结合官方对Stage的解释,可以这样理解:
一个Job被拆分成若干个Stage,每个Stage执行一些计算,产生一些中间结果。它们的目的是最终生成这个Job的计算结果。而每个Stage是一个task set,包含若干个task。Task是Spark中最小的工作单元,在一个executor上完成一个特定的事情。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读