面试进阶篇二Spark核心原理
三、Spark核心原理:分布式计算引擎。
我还会用一个又一个有趣的故事,以轻松诙谐、深入浅出的方式为你讲解 Spark 核心原理,包括 RDD 编程模型、Spark 进程模型、
调度系统、存储系统、Shuffle 管理、内存管理等等,从而让你像读小说一样去弄懂 Spark。
3.1 RDD 编程模型
1、RDD是什么?
RDD 表示已被分区、不可变的,并能够被并行操作的数据集合,是抽象意义的数据集合,分区内部并不会存储具体的数据。下图很好地展示了 RDD 的分区逻辑结构:
3.1 Spark 进程模型
模块 | 简介 | 作用 |
---|---|---|
Driver | 每个应用任务控制节点 | 解析用户代码、构建计算流图,然后将计算流图转化为分布式任务,并把任务分发给集群中的执行进程交付运行 |
SparkContext | 应用入口,和整个集群交互 | 和Cluster Manager通信,进行资源申请、任务分配和监控,如创建RDD。(*2) |
Cluster Manager | 集群资源管理器 | 申请和管理Worker Node上运行所需资源 。 |
Worker Node | 工作节点 | 一个Application可以有多个运行作业任务的工作节点。 |
Executor | Worker Node的执行进程 | 运行Task,负责将数据存到内存/磁盘。 |
模块 | 简介 | 作用 |
---|---|---|
Job | 多个Task组成的并行计算阶段,Action算子触发 | |
Stage | 每个Job被划分多个Task作为一个TaskSet(小的计算任务组) | |
Task | 任务 | Executor进程中工作单元,多个Task组成一个Stage。 |
1 App = n Job
1 Job = n Stage = n TaskSet
1 Stage = n Task
1 App = n1 job = n1*n2 Stage = n1*n2*n3 Task
1、Spark(集群) 启动流程
1、启动Master进程,启动完会解析slaves配置文件,根据host启动相应节点及里面Worker。
2、Worker启动后,把注册信息发送给Master。
3、Master收到注册信息保存到内存和磁盘,并把自己的URL(masterURL)响应给Worker。
4、Worker收到Master的URL信息后,调用定时器,定时向Master发送心跳信息。
2、Spark 的执行/运行/处理流程(*15)
-
Step1:启动Driver,构造DAG。
首先,Spark 应用程序启动在自己的 JVM 进程里,即Driver
进程,启动后调用 SparkContext 初始化执行配置和输入数据。SparkContext
启动DAGScheduler
构造执行的 DAG 图,切分成最小的执行单位也就是计算任务。 -
Step2:Driver请求资源,通知Worker。
然后Driver
向Cluster Manager
请求计算资源,用于 DAG 的分布式计算。Cluster Manager 收到请求以后,将 Driver 的主机地址等信息通知给集群的所有计算节点Worker
。 -
Step3:Worker收到,向Driver通报可用资源。
Worker
收到信息以后,根据 Driver 的主机地址,跟 Driver 通信并注册,然后根据自己的空闲资源向 Driver 通报自己可以领用的任务数。Driver 根据 DAG 图开始向注册的 Worker 分配任务。 -
Step4:Worker收到任务,启动Executor 执行任务。
Worker 收到任务后,启动 Executor 进程开始执行任务。Executor 先检查自己是否有 Driver 的执行代码,如果没有,从 Driver 下载执行代码,通过 Java 反射加载后开始执行。
追问1:Driver 作用?
Driver 最核心的作用在于,解析用户代码、构建计算流图,然后将计算流图转化为分布式任务,并把任务分发给集群中的执行进程交付运行。换句话说,Driver 的角色是拆解任务、派活儿,而真正干活儿的“苦力”,是执行进程。在 Spark 的分布式环境中,这样的执行进程可以有一个或是多个,它们也有专门的术语,叫作“Executor”。
追问2:DAGScheduler、TaskScheduler 和 SchedulerBackend
作用?
DAGScheduler、TaskScheduler 和 SchedulerBackend
三对象是Driver 的给力帮手,通力合作,依次完成分布式任务调度的 3 个核心步骤,也就是:
DAGScheduler
、 根据用户代码构建计算流图;TaskScheduler
:根据计算流图拆解出分布式任务;SchedulerBackend
:将分布式任务分发到 Executors 中去。
从全局视角来看,DAGScheduler 是任务调度的发起者,DAGScheduler 以 TaskSet 为粒度,向 TaskScheduler 提交任务调度请求。TaskScheduler 在初始化的过程中,会创建任务调度队列,任务调度队列用于缓存 DAGScheduler 提交的 TaskSets。TaskScheduler 结合 SchedulerBackend 提供的 WorkerOffer,按照预先设置的调度策略依次对队列中的任务进行调度。
简而言之,DAGScheduler 手里有“活儿”,SchedulerBackend 手里有“人力”,TaskScheduler 的核心职能,就是把合适的“活儿”派发到合适的“人”的手里。由此可见,TaskScheduler 承担的是承上启下、上通下达的关键角色,这也正是我们将“塔斯克”视为斯巴克建筑公司元老之一的重要原因。
追问3:DAGscheduler干了什么活?(*2)
- 1、根据用户代码构建 DAG;
- 2、以
Shuffle
为边界切割Stages
; - 3、基于
Stages
创建TaskSets
,并将TaskSets
提交给TaskScheduler
请求调度。
3、宽依赖和窄依赖(*6)概念
答:Transformation操作会形成RDD依赖关系,其中一个父RDD节点最多只会被子RDD一个分区使用称为窄依赖,会被多个子RDD使用称为宽依赖。
窄依赖:n 父RDD == 1 子RDD (n >= 1)
- 1 对 1;
- 多对一,如union
宽依赖:1 父RDD == n 子RDD (n > 1)
- 父RDD的每个分区都有可能被多个子RDD分区使用,子RDD分区通常对应父RDD所有分区
追问1:哪些算子会导致宽依赖,哪些会导致窄依赖?(*3)
- 窄依赖:map、filter、union
- 宽依赖:groupbykey、sortByKey [会产生Shuffle过程]
- 看情况:If(分区器 == HashPartitioner), then (join、reduceByKey、join)为窄依赖。
说明:
- 默认两种划分器:HashPartitioner和RangePartitioner,当分区器HashPartitioner时就是窄依赖。
答:同一个key进去,通过HashPartitioner得到的分区id是一样的,计算前后同一个key得到的分区都一样,
父RDD的分区就只被子RDD的一个分区依赖,就不需要移动数据。所以是窄依赖。
追问2:为什么要区分宽依赖和窄依赖?
- 窄依赖可以支持在同一个节点上链式执行多条命令,例如在执行了 map 后,紧接着执行 filter。相反,宽依赖需要所有的父分区都是可用的,可能还需要调用类似 MapReduce 之类的操作进行跨节点传递。
- 从失败恢复的角度考虑,窄依赖的失败恢复更有效,因为它只需要重新计算丢失的父分区即可,而宽依赖牵涉到 RDD 各级的多个父分区。
3、Spark中如何划分Stage?(*2)
从执行的最后一个RDD往前推,遇到宽依赖就切割stage。
追问1:划分Stage依据是什么?(*2)
(DAGscheduler)一句话来概括从 DAG 到 Stages 的拆分过程就是:以 Actions 算子为起点,从后向前回溯 DAG,以 Shuffle 操作为边界 (宽窄依赖)去划分 Stages。
追问2:如何连起来?
……
追问3:特别大的数据,怎么发送到excutor中?
……
3.2 调度系统
1、Spark怎么进行调度的?(*10)
- 调度系统工作流程(主要 5 个步骤):
结合这 5 个步骤,我们深入分析了 Spark 调度系统的工作原理,我们可以从核心职责和核心原则这两方面来归纳:
Spark 调度系统的核心职责是,先将用户构建的 DAG 转化为分布式任务,结合分布式集群资源的可用性,基于调度规则依序把分布式任务分发到执行器 Executors;
Spark 调度系统的核心原则是,尽可能地让数据呆在原地、保持不动,同时尽可能地把承载计算任务的代码分发到离数据最近的地方(Executors 或计算节点),从而最大限度地降低分布式系统中的网络开销。
TaskScheduler 是按照任务的本地倾向性,来遴选出 TaskSet 中适合调度的 Tasks。
追问1:资源调度和任务调度的关系?
资源调度和任务调度是分开的。
资源调度主要看哪些节点可以启动executors,是否能满足executors所需的cpu数量要求,这个时候,不会考虑任务、数据本地性这些因素。
资源调度完成之后,在任务调度阶段,spark负责计算每个任务的本地性,效果就是task明确知道自己应该调度到哪个节点,甚至是哪个executors。最后scheduler Backend会把task代码,分发到目标节点的目标executors,完成任务调度,实现数据不动代码动。
所以,二者是独立的,不能混为一谈哈~
3.3 存储系统
……
3.4 Shuffle 管理
1、Shuffle 是什么?(*2)
Shuffle 的本意是扑克牌中的“洗牌”,在大数据领域的引申义,表示的是集群范围内跨进程、跨节点的数据交换。
2、Spark shuffle演化?
1、【Spark】Shuffle详解。
2、【Spark】数据倾斜
3.5 内存管理
可暂时看【Spark】内存模型
……
参考
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkiaaj
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13