写点什么

13.2 大数据计算引擎 Spark(下)

用户头像
张荣召
关注
发布于: 2020 年 12 月 21 日

13.2 大数据计算引擎 Spark(下)

1.Spark 的计算阶段

MapReduce 应用一次一运行一个 map 和一个 reduce。

Spark 根据应用的复杂程度,分割成更多的计算阶段(stage),

这些计算阶段组成一个有向无环图 DAG,

Spark 任务调度器可以根据 DAG 的依赖关系执行计算阶段。


这个 DAG 对应的 Spark 程序伪代码如下:

rddB=rddA.groupBy(key);

rddD=rddc.map(func);

rddF=rddD.union(rddE);

rddG=rddB.join(rddF);


整个应用被切分成 3 个阶段,阶段 3 需要依赖阶段 1 和阶段 2,阶段 1 和阶段 2 互不依赖。

Spark 在执行调度的时候,先执行阶段 1 和阶段 2,完成以后,再执行阶段 3.

如果有更多的阶段,Spark 的策略也是一样的。


只要根据程序初始化好 DAG,就建立了依赖关系,然后根据依赖关系顺序执行各个计算阶段,

Spark 大数据应用的计算就完成啦。


Spark 作业调度执行的核心是 DAG,有了 DAG,每个应用就被切分成哪些阶段,每个阶段的依赖关系也就清楚啦。

之后再根据每个阶段要处理的数据量生成相应的任务集合(TaskSet),

每个任务都分配一个任务进程去处理,Spark 就实现了大数据分布式计算。


负责 Spark 应用 DAG 生成的管理的组件是 DAGScheduler,DAGScheduler 根据程序代码生成 DAG,

然后将程序分发到分布式计算集群,按计算阶段的先后关系调度执行。


那么 Spark 划分阶段的依据是什么呢?显然并不是 RDD 上的每个转换函数都会生成一个计算阶段,

比如上面的例子有四个转换函数,但是只有三个阶段。


当 RDD 之间的转换连接线呈现多对多的交叉连线的时候,就会产生新的阶段。一个 RDD 代表一个数据集,

图中每个 RDD 里面都包含多个小块,每个小块代表 RDD 的一个分片。


Spark 也需要通过 shuffle 将数据重新组合,相同 Key 的数据放在一起,进行聚合,关联等操作,

因而每次 shuffle 都产生新的计算阶段。这也是为什么计算阶段会有依赖关系,它需要的数据是来源于

前面一个或多个计算阶段产生的数据,必须等待前面的阶段执行完毕才能进行 shuffle,并得到数据。


计算阶段划分的依据是 shuffle,不是转换函数的类型,有的函数有时候有 shuffle,有时候没有。

例子中的 RDD B 和 RDD F 进行 join,得到 RDD G,这里的 RDD F 需要进行 shuffle,RDD B 就不需要啦。

2.Spark 的作业管理

Spark 的 RDD 函数有两种,一种是转换函数,调用以后得到的还是一个 RDD,RDD 的计算逻辑主要通过转换函数完成。


另一种是 action 函数,调用以后不再返回 RDD。比如 count()函数,返回 RDD 中数据的元素个数;saveAsText(path),将 RDD 数据存储到 path 路径下。

Spark 的 DAGScheduler 在遇到 Shuffle 的时候,会生成一个计算阶段,在遇到 action 函数的时候,会生成一个作业(job)


RDD 里面的每个数据分片,Spark 都会创建一个计算任务去处理,所以一个结算阶段会包含很多个计算任务(task)。

3.Spark 的执行过程

Spark 支持 standalone,Yarn,Mesos,Kubernetes 等多种部署方案,集中部署原理也都一样,

只是不同组件角色命名不同,但是核心功能和运行流程都差不多。

解析:Spark 原生支持的部署方式。

1.应用启动:Driver 进程启动应用。

2.SparkContext:完成 RDD 编程,并生成 DAG 有向无环图。DAGScheduler 调度有向无环图。根据作业的计算阶段,分配任务给分布式集群完成。

2.1:SparkContext 的作业驱动程序启动有向无环图 DAG,根据 DAG 的依赖关系,最先的有哪些作业是可以完成的,哪些 RDD 可以并行计算的,启动第一批待处理的任务。

2.2:根据第一批任务的分片量,计算多少个计算任务计算进程。

2.3:通信 Spark 集群中唯一角色 Cluster Manager:集群管理者。 Cluster Manager 管理整个集群中的资源。资源服务器上启动 Worker 进程。

2.4:SparkContext 把计算任务提交给集群管理者 Cluster Manager,需要多少个计算任务,或者多少个计算进程。

2.5:Cluster Manager 通信 Worker 进程,收集空闲资源信息(CPU 核心,内存),空闲资源所在地址比如:IP+端口。

        然后汇报空闲资源信息给 Driver,说明 Worder 自己可以领取几个任务,比如:可以领取三个任务。

2.6:Driver 分发任务:Driver 把数据信息+Stage 的计算任务,分发给 worker。worker 启动 Executor,执行这三个任务。

        假设 Driver 有 100 个数据分片,就要启动 100 个计算任务,分配 100 个计算任务给 Worker. worder 启动计算进程 Executor 领取任务,完成处理计算。

2.7:第一阶段任务完成后,汇报给 driver。

2.8:启动下一个计算阶段。


4.Spark 生态体系


用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
13.2大数据计算引擎Spark(下)