阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Spark基本工作流程及YARN cluster模式原理

266次阅读
没有评论

共计 4355 个字符,预计需要花费 11 分钟才能阅读完成。

Spark 基本工作流程

相关术语解释

Spark 应用程序相关的几个术语:

  • Worker:集群中任何可以运行 Application 代码的节点,类似于 YARN 中的 NodeManager 节点。在 Spark on Yarn 模式中指的就是 NodeManager 节点;
  • Executor:Application 运行在 Worker 节点上的一个进程,该进程负责运行 Task,并且负责将数据存在内存或者磁盘上,每个 Application 都有各自独立的一批 Executor。
  • SparkContext:由用户程序启动,通过资源调度模块与 Executor 通信。
  • Driver:运行 Application 的 main()函数,并创建 SparkContext。其中创建 SparkContext 的目的是为了准备 Spark 应用程序的运行环境。在 Spark 中由 SparkContext 负责和 ClusterManager 通信,进行资源的申请、任务的分配和监控等;当 Executor 部分运行完毕后,Driver 负责将 SparkContext 关闭。通常用 SparkContext 代表 Drive;

基本运行流程

Spark 应用程序有多种运行模式。SparkContext 和 Executor 这两部分的核心代码实现在各种运行模式中都是公用的,在这两部分之上,根据运行部署模式(例如:Local[N]、Yarn cluster 等)的不同,有不同的调度模块以及对应的适配代码。

Spark 基本工作流程及 YARN cluster 模式原理

具体来说,以 SparkContext 为程序运行的总入口,在 SparkContext 的初始化过程中,Spark 会分别创建 DAGScheduler 作业和 TaskScheduler 任务调度两级调度模块。

其中作业调度模块是基于任务阶段的高层调度模块,它为每个 Spark 作业计算具有依赖关系的多个调度阶段(通常根据 shuffle 来划分),然后为每个阶段构建出一组具体的任务(通常会考虑数据的本地性等),然后以 TaskSets(任务组)的形式提交给任务调度模块来具体执行。而任务调度模块则负责具体启动任务、监控和汇报任务运行情况。

详细的运行流程为:

  1. 构建 Spark Application 的运行环境(启动 SparkContext),SparkContext 向资源管理器(可以是 Standalone、Mesos 或 YARN)注册并申请运行 Executor 资源;
  2. 资源管理器分配 Executor 资源并启动 StandaloneExecutorBackend,Executor 运行情况将随着心跳发送到资源管理器上;
  3. SparkContext 构建成 DAG 图,将 DAG 图分解成 Stage,并把 Taskset 发送给 Task Scheduler。Executor 向 SparkContext 申请 Task,Task Scheduler 将 Task 发放给 Executor 运行同时 SparkContext 将应用程序代码发放给 Executor。
  4. Task 在 Executor 上运行,运行完毕释放所有资源。

Spark 基本工作流程及 YARN cluster 模式原理

作业调度模块和具体的部署运行模式无关,在各种运行模式下逻辑相同。不同运行模式的区别主要体现在任务调度模块。不同的部署和运行模式,根据底层资源调度方式的不同,各自实现了自己特定的任务调度模块,用来将任务实际调度给对应的计算资源。接下来重点介绍下 YARN cluster 模式的实现原理和实现细节。

YARN cluster 运行模式的内部实现原理

Spark 有多种运行模式,在这里主要介绍下 YARN cluster 模式的内部实现原理。如下图是 YARN cluster 模式的原理框图,相对于其他模式,该模式比较特殊的是它需要由外部程序辅助启动 APP。用户的应用程序通过辅助的 YARN Client 类启动。YARN cluster 模式和 YARN client 模式的区别在于:YARN client 模式的 AM 是运行在提交任务的节点,而 YARN cluster 模式的 AM 是由 YARN 在集群中选取一个节点运行,不一定是在提交任务的节点运行。例如 spark-shell 如果需要使用 YARN 模式运行,只能为 yarn-client 模式,启动命令可以使用spark-shell --master yarn-client

Spark 基本工作流程及 YARN cluster 模式原理

Client 类通过 YARN Client API 提交请求,在 Hadoop 集群上启动一个 Spark ApplicationMaster,Spark ApplicationMaster 首先注册自己为一个 YARN ApplicationMaster,之后启动用户程序,SparkContext 在用户程序中初始化时,使用 CoarseGrainedSchedulerBackend 配合 YARNClusterScheduler,YARNClusterScheduler 只是对 TaskSchedulerImpl 的一个简单包装,增加了对 Executor 的等待逻辑等。

根据 Client 类传递的参数,Spark ApplicationMaster 通过 YARN ResourceManager/NodeManager 的接口在集群中启动若干个 Container,用于运行 CoarseGrainedExecutorBackend.CoarseGrainedExecutorBackend 在启动过程中会向 CoarseGrainedSchedulerBackend 注册。

CoarseGrainedSchedulerBackend 是一个基于 Akka Actor 实现的粗粒度的资源调度类,在整个 Spark 作业运行期间,CoarseGrainedSchedulerBackend 主要负责如下功能:

  • 监听并持有注册给它的 Executor 资源
  • 根据现有的 Executor 资源,进行 Executor 的注册、状态更新、相应 Scheduler 的请求等任务的调度

模式的实现细节

Spark 的各种运行模式虽然在启动方式、运行为之、调度手段上有所不同,但它们所要完成的任务基本是一致的,就是在合适的位置安全可靠的根据用户的配置和作业的需要管理和运行任务,在运行调度过程中需要考虑的问题主要为:

  • 环境变量的传递
  • JAR 包和各种依赖文件的分发
  • 任务的管理和序列化等
  • 用户参数配置
  • 用户及权限控制

环境变量的传递

Spark 的运行参数有很大一部分是通过环境变量来设置的,例如 Executor 的内存设置、Library 路径等。在 Cluster 模式下就涉及到环境变量在各个 Worker 节点的传递问题。不同的运行模式有不同的传递方式。需要指出的是,在 Local 模式下,不存在环境变量的传递问题。

在这里主要说明一下再 YARN 相关模式下的参数传递。在 YARN 相关模式中,这些环境变量首先要通过 YARN client 设置到 Spark AM 的运行环境中,之后 Spark AM 在启动 Executor 时再将环境变量设置到 Executor 中。

JAR 包和依赖文件的分发

Spark 程序的运行主要有两类依赖:

  • Spark 运行库及其依赖
  • 应用程序自身的额外依赖

在 Local 模式下,不存在 JAR 包分发的问题。在这里主要介绍下 YARN 模式下的文件分发。

在 YARN 相关模式中,运行库和程序运行所以来的其他文件首先通过 HDFS 客户端 API 上传到作业的.sparkStaing 目录下,然后将对应的文件和 URL 映射关系通知 YARN,YARN 的 Node Manager 在启动 Container 的时候会从指定 URL 处下载相关文件作为运行环境的一部分。

对于需要进一步分发到 Executor 运行环境的文件,Spark YARN 客户端将需要分发的文件的相关属性(例:URL、时间戳、尺寸等)打包成字符串,通过特定的环境变量(SPARK_YARN_CACHE_XXXX)传递给 Spark AM,Spark AM 在创建 Executor 的 Container 时还原特定环境变中的各个文件,并通过调用 setLocalResources 函数初始化 Container。

任务管理和序列化

Spark 任务的运行要解决的问题为:

  • 以正确的顺序运行任务,有效地管理和分派任务
  • 将任务及运行所需相关数据有效地发送到远端
  • 收集运行结果

Spark 任务通过 DAGScheduler 调用 TaskScheduler.submitTasks 进行派发,该接口将相关的一组任务一起提交并进行调度。

任务的运行结果在 Executor 端被序列化并发送回 SchedulerBackend,由于受到 Akka 帧尺寸的限制,如果运行结果数据过大,结果会存储到 BlockManager 中,这时候发送到 SchedulerBackend 的是对应数据的 BlockID,TaskScheduler 最终会调用 TaskResultGetter 在线程池中以异步的方式读取结果,TaskSetManager 再根据运行结果更新任务状态(比如失败重试等)并汇报给 DAGScheduler 等。

更多 Spark 相关教程见以下内容

CentOS 7.0 下安装并配置 Spark  http://www.linuxidc.com/Linux/2015-08/122284.htm

Spark1.0.0 部署指南 http://www.linuxidc.com/Linux/2014-07/104304.htm

Spark 官方文档 – 中文翻译  http://www.linuxidc.com/Linux/2016-04/130621.htm

CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm

Spark 简介及其在 Ubuntu 下的安装使用 http://www.linuxidc.com/Linux/2013-08/88606.htm

安装 Spark 集群(在 CentOS 上) http://www.linuxidc.com/Linux/2013-08/88599.htm

Hadoop vs Spark 性能对比 http://www.linuxidc.com/Linux/2013-08/88597.htm

Spark 安装与学习 http://www.linuxidc.com/Linux/2013-08/88596.htm

Spark 并行计算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm

Ubuntu 14.04 LTS 安装 Spark 1.6.0(伪分布式)http://www.linuxidc.com/Linux/2016-03/129068.htm

Spark 的详细介绍:请点这里
Spark 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135380.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4355字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中