Spark执行的组成部分:作业、任务和步骤

《Spark快速大数据分析》 

8.2 Spark执行的组成部分:作业、任务和步骤

 
程序定义了一个RDD对象的有向无环图DAG
 
每个RDD维护了其指向一个或多个父节点的引用,
以及表示其与父节点之间关系的信息。
RDD可以追踪到其所有的祖先节点。
 
Spark提供了toDebugString方法来查看RDD的谱系。
 
 
在调用行动操作之前,RDD都只是存储着可以让我们计算出
具体数据的描述信息。要触发实际计算,需要对RDD调用
一个行动操作,比如使用collect将数据收集到驱动器程序中。
 
Spark调度器会创建出用于计算行动操作的RDD物理执行计划。
我们再调用collect方法,于是RDD的每个分区都会被物化出来
并发送到驱动器程序中。
 
Spark调度器从最终调用行动操作的RDD出发,
向上回溯所有必须计算的RDD。
 
调度器会访问RDD的父节点,父节点的父节点,
以此类推,递归向上生成计算所有必要的祖先RDD的物理计划。
 
调度器为有向图中的每个RDD输出计算步骤,
步骤中包括RDD上需要应用于每个分区的任务。
然后以相反的顺序执行这些步骤,计算出最终所求的RDD。
 
当调度器进行流水线执行pipelining,或把多个RDD合并到一个步骤中。
当RDD不需要混洗数据就可以从父节点计算出来时,调度器就会自动进行
流水线执行。
toDebugString中输出的谱系使用不同的缩进等级来展示
RDD是否会在物理步骤中进行流水线执行。
在物理执行时,执行计划输出的缩进等级与其父节点相同的RDD
会与其父节点在同一个步骤中进行流水线执行。
比如 textFile -> map -> filter。
 
除了流水线执行的优化,当一个RDD已经缓存在集群内存或磁盘上时,
Spark的内部调度器也会自动截断RDD谱系图。
在这种情况下,Spark会“短路”求值,直接基于缓存下来的RDD进行计算。
还有一种截短RDD谱系图的情况发生在当RDD已经在之前的数据混洗中
作为副产品物化出来时,哪怕该RDD并没有被显式调用persist方法。
这种内部优化是基于Spark数据混洗操作的输出均被写入磁盘的特性。
同时也充分利用了RDD图的某些部分会被计算多次的事实。
 
多次调用collect只会产生一个步骤来完成这个行动操作。
 
特定的行动操作所生成的步骤的集合被称为一个作业。
我们通过类似count之类的方法触发行动操作,创建出一个或多个步骤组成作业。
 
一旦步骤图确定下来,任务就会被创建出来并发给内部的调度器。
该调度器在不同的部署模式下会有所不同。物理计划中的步骤会依赖于其他步骤,
有先后次序,这些步骤会以特定的顺序执行。
 
一个物理步骤会启动很多任务,每个任务都是在不同的数据分区上做同样的事情。
任务内部的流程是一样的。
1.从数据存储(如果该RDD是一个输入RDD)或已有RDD(如果该步骤是基于已经缓存的数据)
或数据混洗的输出中获取输入数据;
2.执行必要的操作来计算出这些操作所代表的RDD。例如,对输入数据执行map, filter函数,
或者进行分组或归约操作;
3.把输出写到一个数据混洗文件中,写入外部存储,或者发回驱动器程序。
 
Spark的大部分日志信息和工具都是以步骤,任务或数据混洗为单位的。
 
Spark执行时有下面所列的这些流程:
1 用户代码定义RDD的有向无环图DAG
    RDD上的操作会创建出新的RDD,并引用它们的父节点,这样就创建出了一个图。
2 行动操作把有向无环图强制转译为执行计划
    当你调用RDD的一个行动操作时,这个RDD就必须被计算出来,这也要求计算出该RDD
    的父节点。Spark调度器提交一个作业来计算所有必要的RDD。这个作业会包含一个
    或多个步骤,每个步骤其实就是一波并行执行的计算任务。一个步骤对应DAG中一个或多个RDD,
    一个步骤对应多个RDD是因为发生了流水线执行。
3 任务于集群中调度执行
    步骤是按照顺序处理的,任务则独立的启动来计算出RDD一部分。一旦作业的最后一个步骤结束,
    一个行动操作也就执行完了。
 

posted on 2015-11-18 00:33  develooop  阅读(1562)  评论(0编辑  收藏  举报

导航

AmazingCounters.com