Spark 内核

1、Spark 核心组件

1.1.1 Cluster Manager(Master,ResourceManager)

Spark 的集群管理器, 主要负责对整个集群资源的分配与管理.

Cluster Manager 在 Yarn 部署模式下为 ResourceManager; 在 Mesos 部署模式下为 Mesos Master; 在 Standalone 部署模式下为 Master.

Cluster Manager 分配的资源属于一级分配, 它将各个 Worker 上的内存, CPU 等资源分配给 Application, 但并不负责对 Executor 的资源的分配.

1.1.2 Worker(Worker,NodeManager)

Spark 的工作节点.

在 Yarn 部署模式下实际由 NodeManager 替代.

主要负责以下工作

  • 将自己的内存, CPU 等资源通过注册机制告知 Cluster Manager
  • 创建 Executor进程
  • 将资源和任务进一步分配给 Executor
  • 同步资源信息, Executor 状态信息给 ClusterManager 等.

1.1.3 Driver

Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。

Driver 在 Spark 作业执行时主要负责:

  1. 将用户程序转化为作业(Job);
  2. 在 Executor 之间调度任务(Task);
  3. 跟踪 Executor 的执行情况;
  4. 通过 UI 展示查询运行情况;

1.1.4 Executor

Spark Executor 节点是负责在 Spark 作业中运行具体任务,任务彼此之间相互独立。

Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。

如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。

Executor 有两个核心功能:

  1. 负责运行组成 Spark 应用的任务,并将结果返回给驱动器(Driver);
  2. 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 的数据是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

1.1.5 Application

用户使用 Spark 提供的 API 编写的应用程序.

  • Application 通过 Spark API 将进行 RDD 的转换和 DAG 的构建, 并通过 Driver 将 Application 注册到 Cluster Manager.
  • Cluster Manager 将会根据 Application 的资源需求, 通过一级分配将 Executor, 内存, CPU 等资源分配给 Application.
  • Driver 通过二级分配将 Executor 等资源分配给每一个任务, 最后Application 通过 Driver 告诉 Executor 运行任务

1.2 Spark 通用运行流程概述

 上图为 Spark 通用运行流程,不论 Spark 以何种模式进行部署,都是以如下核心步骤进行工作的:

  1. 任务提交后,都会先启动Driver程序
  2. 随后Driver向集群管理器注册应用程序(Application)
  3. 之后集群管理器根据此任务的配置文件分配Excutor并启动该应用程序
  4. 当Driver所需的资源全部满足后,Driver开始执行main函数,spark转换为懒执行,当执行到Action算子时开始反向推算,根据宽依赖进行Stage的划分,随后每一个Stage对应一个TaskSet,TaskSet中有多个Task
  5. 根据本地化原则,Task会被分发到指定的Executor去执行,在任务执行的过程中,Executor也会不断与Driver进行通信,报告任务运行情况

 2、Spark 通讯架构

Spark 内置RPC框架

在 Spark 中, 很多地方都涉及到网络通讯, 比如 Spark 各个组件间的消息互通, 用户文件与 Jar 包的上传, 节点间的 Shuffle 过程, Block 数据的复制与备份等.

  1. 在 Spark0.x.x 与 Spark1.x.x 版本中, 组件间的消息通信主要借助于 Akka.
  2. 在 Spark1.3 中引入了 Netty 通信框架. Akka要求message发送端和接收端有相同的版本, 所以为了避免 Akka 造成的版本问题,并给用户的应用更大灵活性,决定使用更通用的 RPC 实现,也就是现在的 Netty 来替代 Akka。
  3. Spark1.6 中 Akka 和 Netty 可以配置使用。Netty 完全实现了 Akka 在Spark 中的功能。
  4. 从Spark2.0.0, Akka 被移除.

Netty 通信架构

Netty 借鉴了 Akka 的 Actor 模型

Spark通讯框架中各个组件(Client/Master/Worker)可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。 

具体各个组件之间的关系图如下:

Endpoint(Client/Master/Worker)有 1 个 InBox 和 N 个 OutBox(N>=1,N取决于当前 Endpoint 与多少其他的 Endpoint 进行通信,一个与其通讯的其他Endpoint 对应一个 OutBox),Endpoint 接收到的消息被写入 InBox,发送出去的消息写入 OutBox 并被发送到其他 Endpoint 的 InBox 中。

Spark Netty 通信架构解析

3、Spark 部署模式

Spark支持3种集群管理器(Cluster Manager),分别为:

  1. Standalone:独立模式,Spark 原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统,使用 Standalone 可以很方便地搭建一个集群;
  2. Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如 MR、Storm等。根据 Driver 在集群中的位置不同,分为 yarn client 和 yarn cluster;
  3. Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 Yarn。

实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习的简单集群部署模式。由于在实际生产环境下使用的绝大多数的集群管理器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。

3.1 Yarn 模式运行机制

3.1.1 YARN Cluster 模式

  1.  执行脚本提交任务,实际是启动一个 SparkSubmit 的 JVM 进程
  2. SparkSubmit 类中的 main 方法反射调用 client 的 main 方法
  3. client 创建 Yarn 客户端,然后向 Yarn 发送执行指令:bin/java ApplicationMaster
  4. Yarn 框架收到指令后会在指定的 NM 中启动ApplicationMaster
  5. ApplicationMaster 启动子线程 Driver 线程,执行用户的作业
  6. AM 向 RM 注册,申请资源
  7. 获取资源后 AM 向 NM 发送指令:bin/java CoarseGrainedExecutorBackend
  8. 启动 ExecutorBackend,并向 Driver 注册
  9. 注册成功后,ExecutorBackend 会创建一个 Executor 对象
  10. Driver 会给 Executor 分配任务,并监控任务的执行

注意:

  • SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBacken是独立的进程;
  • Client和Driver是独立的线程;
  • Executor是一个对象。

3.1.2 Yarn Client 模式 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值