写点什么

大数据培训 -Spark 深入理解 RDD 和关键角色

作者:@零度
  • 2022 年 3 月 31 日
  • 本文字数:2071 字

    阅读完需:约 7 分钟

 Spark Core

关于 RDD 你需要知道的

你肯定在网上看到过一大堆的废话了。比如下面这两段:

RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。

通俗点来讲,可以将 RDD 理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个 RDD 可以分成多个分区,每个分区就是一个数据集片段。一个 RDD 的不同分区可以保存到集群中的不同结点上,从而可以在集群中的不同结点上进行并行计算。



刚从地里挖出来的土豆食材、清洗过后的干净土豆、生薯片、烤熟的薯片,流水线上这些食材的不同形态,就像是 Spark 中 RDD 对于不同数据集合的抽象。

RDD 具有 4 大属性,分别是 partitions、partitioner、dependencies 和 compute 属性。正因为有了这 4 大属性的存在,让 RDD 具有分布式和容错性这两大最突出的特性。

  • partitions: 图中每一颗土豆就是 RDD 中的数据分片,3 颗土豆一起对应的就是 RDD 的 partitions 属性。

  • partitioner: 根据尺寸的不同,即食薯片会被划分到不同的数据分片中。像这种数据分片划分规则,对应的就是 RDD 中的 partitioner 属性。

  • dependencies: 每种食材形态都依赖于前一种食材,这就像是 RDD 中 dependencies 属性记录的依赖关系

  • compute: 不同环节的加工方法,对应的刚好就是 RDD 的 compute 属性。

现在你理解 RDD 了吗?正确理解 RDD 会对你学习 Spark 有很深刻的影响。

Spark 中的关键角色

DAGScheduler

DAGScheduler 是一家公司的总架构师。

DAGScheduler 把 DAG 拆分成很多的 Tasks,每组的 Tasks 都是一个 Sage,解析时是以 Shuffle 为边界反向解析构建 Stage,每当遇到 Shuffle,就会产生新的 Stage,然后以一个个 TaskSet(每个 Stage 封装一个 TaskSet)的形式提交给底层调度器 TaskScheduler_大数据培训



它的三个主要职责:

  • 根据用户代码构建 DAG;

  • 以 Shuffle 为边界切割 Stages;

  • 基于 Stages 创建 TaskSets,并将 TaskSets 提交给 TaskScheduler 请求调度。

DAGScheduler 划分 Stage 的原理

Spark 在分布式环境下将数据分区,然后将作业转化为 DAG, 并分阶段进行 DAG 的调度和任务的分布式并行处理。DAG 将调度提交给 DAGScheduler, DAGScheduler 调度时会根据是否需要经过 Shuffle 过程将 Job 划分为多个 Stage。


在上图中,RDD a 到 ShuffledRDD 之间,以及 UnionRDD 到 CoGroupedRDD 之间的数据需要经过 Shuffle 过程,因此 RDDa 和 UnionRDD 分别是 Stage1 跟 Stage3 和 Stage2 跟 Stage3 的划分点。而 ShuffledRDD 到 CoGroupedRDD 之间,以及 RDDb 到 MappedRDD 到 UnionRDD 和 RDDc 到 UnionRDD 之间的数据不需要经过 Shuffle 过程。因此,ShuffledRDD 和 CoGroupedRDD 的依赖是窄依赖,两个 RDD 属于同一个 Stage3,其余 RDD 划分为 2 个 Stage。Stage1 和 Stage2 是相对独立的,可以并行运行。Stage3 则依赖于 Stage1 和 Stage2 的运行结果,所以 Stage3 最后执行。

由此可见,在 DAGScheduler 调度过程中,Stage 阶段换份是依据作业是否有 Shuffle 过程,也就是存在 ShuffleDependency 的宽依赖时,需要进行 Shuffle,此时才会将作业划分为多个 Stage。

SchedulerBackend

SchedulerBackend 是一家公司的人力资源总监。

对于集群中可用的计算资源,SchedulerBackend 用一个叫做 ExecutorDataMap 的数据结构,来记录每一个计算节点中 Executors 的资源状态。

这里的 ExecutorDataMap 是一种 HashMap,它的 Key 是标记 Executor 的字符串,Value 是一种叫做 ExecutorData 的数据结构。ExecutorData 用于封装 Executor 的资源状态,如 RPC 地址、主机地址、可用 CPU 核数和满配 CPU 核数等等,它相当于是对 Executor 做的"资源画像"。

SchedulerBackend 可以同时提供多个 WorkerOffer 用于分布式任务调度。WorkerOffer 这个名字起得很传神,Offer 的字面意思是公司给你提供的工作机会,到了 Spark 调度系统的上下文,它就变成了使用硬件资源的机会。

SchedulerBackend 与集群内所有 Executors 中的 ExecutorBackend 保持周期性通信,双方通过 LaunchedExecutor、RemoveExecutor、StatusUpdate 等消息来互通有无、变更可用计算资源。

TaskScheduler

TaskScheduler 是一家公司干活的总负责人。

TaskScheduler 的核心任务是提交 TaskSets 到集群运算并汇报结果。

他主要做三件事:

  1. 为 TaskSet 创建和维护一个 TaskSetManager,并追踪任务的本地性以及错误信息。

  2. 遇到 Straggle 任务时,会放到其他节点进行重试。

  3. 向 DAGScheduler 汇报执行情况,包括在 Shuffle 输出丢失的时候报告 fetch failed 错误等信息。

每个任务都是自带本地倾向性的,换句话说,每个任务都有自己擅长做的事情 www.atguigu.com。

ExecutorBackend

ExecutorBackend 是分公司的人力资源主管。

ExecutorBackend 拿到 Task 任务之后,随即把 Task 派发给分公司的工人。这些工人,就是 Executors 线程池中一个又一个的 CPU 线程,每个线程负责处理一个 Task。

每当 Task 处理完毕,这些线程便会通过 ExecutorBackend,向 Driver 端的 SchedulerBackend 发送 StatusUpdate 事件,告知 Task 执行状态。接下来,TaskScheduler 与 SchedulerBackend 通过接力的方式,最终把状态汇报给 DAGScheduler。

直到整个 Spark 程序中的所有 Task 执行完毕。一次完整的 Spark 任务就执行结束了。

用户头像

@零度

关注

关注尚硅谷,轻松学IT 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
大数据培训-Spark深入理解RDD和关键角色_spark_@零度_InfoQ写作平台