目录
四,用户程序从最开始的提交到最终的计算执行,需要经历以下几个阶段:
[六,Spark On Yarn的本质](#六,Spark On Yarn的本质)
一,Spark是什么
Spark是一款分布式内存计算的统一分析引擎,是一个基于线程的分布式纯计算工具,为了数据共享和提高运行效率。
Spark在处理数据时,可以将中间的处理结果存到内存中,并且提供了丰富的算子API
Spark的核心就是Spark Core,可以进行海量离线数据的批处理计算
二,Spark的运行模式
三,Spark运行的角色有四类:
资源管理层面
管理者:Master角色:管理整个集群的资源,相当于YARN中的ResouceManger
工作中:Worker角色:管理单个服务器的资源,相当于YARN中的NodeManger
某任务管理者:Driver角色,管理单个Spark任务在运行时的工作,相当于YARN中的ApplicationMaster
某任务执行者:Executor角色:单个任务运行时的时候的工作者,相当于YARN容器运行的TASK,具体工作的进程
每一个Spark进程运行时,会绑定到Driver所在机器的4040端口,如果4040被占用,会顺延到4041,4042等
Standalone架构,是Spark自带的一种集群模式,
不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。
StandAlone 是完整的Spark运行环境,其中:
Master角色以Master进程存在, Worker角色以Worker进程存在
Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
Master的默认端口为8080,同样如果被占用,会顺延到8081,8082,8083等
18080: 默认是历史服务器的端口, 由于每个程序运行完成后,4040端口就被注销了. 在以后想回看某个程序的运行状态就可以通过历史服务器查看,历史服务器长期稳定运行,可供随时查看被记录的程序的运行过程.
集群模式下程序是在集群上运行的,不要直接读取本地文件,应该读取hdfs上的
因为程序运行在集群上,具体在哪个节点上我们运行并不知道,其他节点可能并没有那个数据文件
从图中可以看到Spark Application运行到集群上时,由两部分组成:Driver Program和Executors。
第一、Driver Program
1.相当于AppMaster,整个应用管理者,负责应用中所有Job的调度执行;
2.运行JVM Process,运行程序的MAIN函数,必须创建SparkContext上下文对象;
3.一个SparkApplication仅有一个;
第二、Executors
1.相当于一个线程池,运行JVM Process,其中有很多线程,每个线程运行一个Task任务,一个Task任务运行需要1 Core CPU,所有可以认为Executor中线程数就等于CPU Core核数;
一个Spark Application可以有多个,可以设置个数和资源信息;
四,用户程序从最开始的提交到最终的计算执行,需要经历以下几个阶段:
1 )用户程序创建 SparkContext 时,新创建的 SparkContext 实例会连接到 ClusterManager 。 Cluster Manager 会根据用户提交时设置的CPU 和内存等信息为本次提交分配计算资源,启动 Executor 。
2 ) Driver 会将用户程序划分为不同的执行阶段 Stage ,每个执行阶段 Stage 由一组完全相同 Task 组成,这些 Task 分别作用于待处理数据的不同分区。在阶段划分完成和Task 创建后, Driver 会向 Executor 发送 Task ;
3 ) Executor 在接收到 Task 后,会下载 Task 的运行时依赖,在准备好 Task 的执行环境后,会开始执行 Task ,并且将 Task 的运行状态汇报给Driver ;
4 ) Driver 会根据收到的 Task 的运行状态来处理不同的状态更新。 Task 分为两种:一种是 Shuffle Map Task ,它实现数据的重新洗牌,洗牌的结果保存到Executor 所在节点的文件系统中;另外一种是 Result Task ,它负责生成结果数据;
5 ) Driver 会不断地调用 Task ,将 Task 发送到 Executor 执行,在所有的 Task 都正确执行或者超过执行次数的限制仍然没有执行成功时停止;
一个Spark Application 中,包含多个 Job , 每个 Job 有多个 Stage 组成 ,每个 Job 执行按照 DAG 图进行的。
其中每个 Stage 中包含多个 Task 任务,每个 Task 以线程 Thread 方式执行,需要 1Core CPU 。
Spark Application 程序运行时三个核心概念: Job 、 Stage 、
Task ,说明如下:
Job :由多个 Task 的并行计算部分,一般 Spark 中的 action 操作(如 save 、 collect ,后面进一步说明),会生成一个Job 。
Stage : Job 的组成单位,一个 Job 会切分成多个 Stage,Stage 彼此之间相互依赖顺序执行,而每个 Stage 是多 个Task 的集合,类似 map 和 reduce stage 。
Task :被分配到各个 Executor 的单位工作内容,它是 Spark 中的最小执行单位,一般来说有多少个 Paritition (物理层面的概念,即分支可以理解为将数据划分成不同 部分并行处理),就会有多少个 Task ,每个 Task 只会处 理单一分支上的数据。
bin/spark-submit --master spark://server:7077 Standalone 提交 Spark 应用的命令
五,Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题。
如何解决这个单点故障的问题, Spark 提供了两种方案:
- 基于文件系统的单点恢复 (Single-Node Recovery with Local File System)-- 只能用于开发或测试环境。
- 基于 zookeeper 的 Standby Masters(Standby Masters with ZooKeeper)-- 可以用于生产环境。
ZooKeeper 提供了一个 Leader Election 机制,利用这个机制可以保证虽然集群存在多个 Master ,但是只有一个是 Active的,其他的都是Standby 。当 Active 的 Master 出现故障时,另外的一个 Standby Master 会被选举出来。由于集群的信息
,包括 Worker , Driver 和 Application 的信息都已经持久化到文件系统,因此在切换的过程中只会影响新 Job 的提交,对于正在进行的Job 没有任何的影响。加入 ZooKeeper 的集群整体架构如下图所示。
对于Spark On YARN, 无需部署Spark集群, 只要找一台服务器, 充当Spark的客户端, 即可提交任务到YARN集群中运行.
六,Spark On Yarn的本质
Master 角色由 YARN 的 ResourceManager 担任 .
Worker 角色由 YARN 的 NodeManager 担任 .
Driver 角色运行在 YARN 容器 内或提交任务的 客户端进程 中
真正干活的 Executor 运行在 YARN 提供的容器 内
Spark On Yarn 需要啥 ?
- 需要 Yarn 集群 : 已经安装了
- 需要 Spark 客户端工具 , 比如 spark-submit, 可以将 Spark 程序提交到 YARN 中
- 需要被提交的代码程序 : ,如 spark/examples/src/main/python/pi.py 此示例程序 , 或我们后续自己开发的 Spark 任务
Spark On YARN 是有两种运行模式的 , 一种是 Cluster 模式一种是 Client 模式 .
这两种模式的区别就是 Driver 运行的位置 .
Cluster 模式即 :Driver 运行在 YARN 容器内部 , 和 ApplicationMaster 在同一个容器内
Client 模式即 :Driver 运行在客户端进程中 , 比如 Driver 运行在 spark-submit 程序的进程中
Cluster 模式
Client 模式
Client模式和Cluster模式最最本质的区别是:Driver程序运行在哪里。
Client 模式:学习测试时使用,生产不推荐 ( 要用也可以 , 性能略低 , 稳定性略低 )
1.Driver 运行在 Client 上 , 和集群的通信成本高
2.Driver 输出结果会在客户端显示
Cluster 模式:生产环境中使用该模式
1.Driver 程序在 YARN 集群中,和集群的通信成本低
2.Driver 输出结果不能在客户端显示
3. 该模式下 Driver 运行 ApplicattionMaster 这个节点上 , 由 Yarn 管理,如果出现问题, yarn 会重启ApplicattionMaster(Driver)
具体流程步骤如下:
1 )、 Driver 在任务提交的本地机器上运行, Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster
;
2 )、随后 ResourceManager 分配 Container ,在合适的 NodeManager 上启动 ApplicationMaster ,此时的
ApplicationMaster 的功能相当于一个 ExecutorLaucher ,只负责向 ResourceManager 申请 Executor 内存;
3 )、 ResourceManager 接到 ApplicationMaster 的资源申请后会分配 Container ,然后 ApplicationMaster 在资源分
配指定的 NodeManager 上启动 Executor 进程;
4 )、 Executor 进程启动后会向 Driver 反向注册, Executor 全部注册完成后 Driver 开始执行 main 函数;
5 )、之后执行到 Action 算子时,触发一个 Job ,并根据宽依赖开始划分 Stage ,每个 Stage 生成对应的 TaskSet ,之后
将 Task 分发到各个 Executor 上执行。
在 YARN Cluster 模式下, Driver 运行在 NodeManager Contanier 中,此时 Driver 与 AppMaster 合为一体,示意图如下:
具体流程步骤如下:
1 )、 Driver 在任务提交的本地机器上运行, Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster;
2 )、随后 ResourceManager 分配 Container ,在合适的 NodeManager 上启动 ApplicationMaster ,此时的 ApplicationMaster的功能相当于一个 ExecutorLaucher ,只负责向 ResourceManager 申请 Executor 内存;
3 )、 ResourceManager 接到 ApplicationMaster 的资源申请后会分配 Container ,然后 ApplicationMaster 在资源分配指定的NodeManager 上启动 Executor 进程;
4 )、 Executor 进程启动后会向 Driver 反向注册, Executor 全部注册完成后 Driver 开始执行 main 函数;
5 )、之后执行到 Action 算子时,触发一个 Job ,并根据宽依赖开始划分 Stage ,每个 Stage 生成对应的 TaskSet ,之后将Task 分发到各个 Executor 上执行。