• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

面试进阶篇二Spark核心原理

武飞扬头像
白露塞纳
帮助1

三、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
    然后 DriverCluster 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 个核心步骤,也就是:

  1. DAGScheduler根据用户代码构建计算流图
  2. TaskScheduler根据计算流图拆解出分布式任务
  3. 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
系列文章
更多 icon
同类精品
更多 icon
继续加载