Spark总体架构和运行流程

Spark 总体架构

Spark 运行架构如图 1 所示,包括集群资源管理器(Cluster Manager)、多个运行作业任务的工作结点(Worker Node)、每个应用的任务控制结点(Driver)和每个工作结点上负责具体任务的执行进程(Executor)。
在这里插入图片描述
Driver 是运行 Spark Applicaion 的 main() 函数,它会创建 SparkContext。SparkContext 负责和 Cluster Manager 通信,进行资源申请、任务分配和监控等。

Cluster Manager 负责申请和管理在 Worker Node 上运行应用所需的资源,目前包括 Spark 原生的 Cluster Manager、Mesos Cluster Manager 和 Hadoop YARN Cluster Manager。

Executor 是 Application 运行在 Worker Node 上的一个进程,负责运行 Task(任务),并且负责将数据存在内存或者磁盘上,每个 Application 都有各自独立的一批 Executor。每个 Executor 则包含了一定数量的资源来运行分配给它的任务。

每个 Worker Node 上的 Executor 服务于不同的 Application,它们之间是不可以共享数据的。与 MapReduce 计算框架相比,Spark 采用的 Executor 具有两大优势。

  • Executor 利用多线程来执行具体任务,相比 MapReduce 的进程模型,使用的资源和启动开销要小很多。
  • Executor 中有一个 BlockManager 存储模块,会将内存和磁盘共同作为存储设备,当需要多轮迭代计算的时候,可以将中间结果存储到这个存储模块里,供下次需要时直接使用,而不需要从磁盘中读取,从而有效减少 I/O 开销,在交互式查询场景下,可以预先将数据缓存到 BlockManager 存储模块上,从而提高读写 I/O 性能。

Spark 运行流程

Spark 运行基本流程如下。
在这里插入图片描述

  1. 构建 Spark Application 的运行环境(启动 SparkContext),SparkContext 向 Cluster Manager 注册,并申请运行 Executor 资源。

  2. Cluster Manager 为 Executor 分配资源并启动 Executor 进程,Executor 运行情况将随着“心跳”发送到 Cluster Manager 上。

  3. main函数执行到action算子,SparkContext 构建 DAG 图,将 DAG 图分解成多个 Stage,并把每个 Stage 的 TaskSet(任务集)发送给 Task Scheduler (任务调度器)。Executor 向 SparkContext 申请 Task, Task Scheduler 将 Task 发放给 Executor,同时,SparkContext 将应用程序代码发放给 Executor。

  4. Task 在 Executor 上运行,把执行结果反馈给 Task Scheduler,然后再反馈给 DAG Scheduler。运行完毕后写入数据,SparkContext 向 ClusterManager 注销并释放所有资源。

DAG Scheduler 决定运行 Task 的理想位置,并把这些信息传递给下层的 Task Scheduler。

DAG Scheduler 把一个 Spark 作业转换成 Stage 的 DAG,根据 RDD 和 Stage 之间的关系找出开销最小的调度方法,然后把 Stage 以 TaskSet 的形式提交给 Task Scheduler。此外,DAG Scheduler 还处理由于 Shuffle 数据丢失导致的失败,这有可能需要重新提交运行之前的 Stage。

Task Scheduler 维护所有 TaskSet,当 Executor 向 Driver 发送“心跳”时,Task Scheduler 会根据其资源剩余情况分配相应的 Task。另外,Task Scheduler 还维护着所有 Task 的运行状态,重试失败的 Task。

Spark On Yarn

Spark 应用程序提交到 Yarn 环境中执行的时候,一般会有两种部署执行的方式:Client和 Cluster。两种模式主要区别在于:Driver 程序的运行节点位置

Yarn Client 模式

Client 模式将用于监控和调度的 Driver 模块在客户端执行,而不是在 Yarn 中,所以一般用于测试。

  1. Driver 在任务提交的本地机器上运行。
  2. Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster。
  3. ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,负责向 ResourceManager 申请 Executor 内存。
  4. ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container,将一批NodeManager信息返回给ApplicationMaster,然后ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 进程。
  5. Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行main 函数。
  6. 之后执行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 生成对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。

Yarn-client模式适用于测试,因为Driver运行在本地,Driver会与yarn集群中的Executor进行大量的通信,会造成客户机网卡流量的大量增加。

Yarn Cluster 模式

Cluster 模式将用于监控和调度的 Driver 模块启动在 Yarn 集群资源中执行。一般应用于实际生产环境。

  1. 在 YARN Cluster 模式下,任务提交后会和 ResourceManager 通讯申请启动
    ApplicationMaster。
  2. 随后 ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,此时的 ApplicationMaster 就是 Driver
  3. Driver 启动后向 ResourceManager 申请 Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配 container,将一批NodeManager信息返回给ApplicationMaster,然后ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 进程。
  4. Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行main函数。
  5. 之后执行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 生成对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。

Yarn-Cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台NodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过yarn查看日志。

来源:http://c.biancheng.net/view/3651.html

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark的执行流程包括以下几个步骤: 1. 创建SparkSession:SparkSession是Spark应用程序的入口点,用于与Spark进行交互。在创建SparkSession时,需要指定应用程序的名称和配置信息。 2. 创建RDD或DataFrame:Spark支持两种数据抽象类型:弹性分布式数据集(RDD)和数据框架DataFrame)。RDD是Spark中最基本的数据结构,而DataFrame则是基于RDD的高级数据结构。你可以从外部数据源(如文件系统、数据库等)中读取数据,或者通过转换操作从已有的RDD或DataFrame中创建新的数据集。 3. 转换操作:Spark提供了一系列的转换操作,如map、filter、reduce等。转换操作并不立即执行,而是会生成一个新的RDD或DataFrame。这些转换操作可以链式调用,形成一个转换操作的有向无环图(DAG)。 4. 行动操作:当需要获取计算结果时,就需要触发行动操作。行动操作会触发Spark引擎根据转换操作的DAG来执行计算,并将结果返回给驱动程序。 5. 优化执行计划:在执行转换操作之前,Spark会对转换操作的DAG进行优化,以提高执行效率。优化过程包括选择最佳的执行计划、重排转换操作的顺序、合并相邻的转换操作等。 6. 任务划分与调度:Spark将执行计划划分为一系列的任务,并将这些任务分发到集群中的多个执行器上并行执行。任务划分的策略可以根据数据分区进行优化,以实现数据本地性和负载均衡。 7. 执行任务:每个执行器会接收到一些任务,并根据指定的转换操作进行计算。计算过程中,Spark会利用内存和磁盘进行数据交换和缓存,以提高计算效率。 8. 结果返回:当所有任务执行完成后,计算结果会被返回给驱动程序,可以进行进一步的处理或输出。 需要注意的是,Spark的执行流程是延迟计算的,只有在触发行动操作时才会真正执行计算。这种延迟计算的特性使得Spark可以对计算进行优化,并支持容错和增量计算等特性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值