spark特点
spark 计算框架在处理数据时,所有的数据都存储在内存中。减少了磁盘的读写操作,提高了框架计算效率。同时spark还兼容HDFS、Hive,可以很好地与Hadoop系统兼容,弥补了mr高延迟的性能缺点。spark是一个更加高效、快速的大数据计算平台系统。市面上基本的大型离线分析系统都采用spark处理引擎。
基本概念
Application: spark运行的应用。application 中包含一个驱动器进程和集群中的多个执行进程。
Driver Program:运行main方法创建sparkcontext的进程
cluster Manager:用于集群上申请资源的外部服务(集群管理器、Mesos、Yarn)
work node:集群上运行应用程序代码的任意一个节点
Executor:在集群工作节点上为某个应用启动的工作进程,该进程负责运行计算任务,并为一个用程序存储数据。
Task:在Executor 进行中执行任务的工作单元,多个task 组成一个stage。
job:一个并行计算作业,由一组任务组成,并由spark行动算子触发启动。
stage:每个job划分为更小的task集合,每组任务被称为stage。
集群运行架构
spark应用在集群上作为独立的进程组来运行。
1. Driver 通过main创建一个spakrcontext,然后向cluster manager注册并申请资源
2. cluster manager 根据资源调度算法分配并监控资源使用情况,分配资源给work节点,work节点为应用启动多个executor,同时节点汇报心跳情况给cluster manager,便于集群管理器对executor 进行状态监控,如果监控到executor 失败,则立刻重新创建。
3. sparkcontext 构建的DAG图,将分解为stage。并把stage 发送到task scheduler,executor 向spakrcontext 申请task。
4. task scheduler 将task 发送给executor 运行,同时sparkcontext 将应用程序代码发送到executor。
5. task 在executor上 运行,运行完毕后Driver 向cluster manager 注销申请资源,即释放资源。
任务提交的四个阶段
1. 构建DAG图
用户提交的job将首先被转换为rdd(当遇到行动算子),并通过RDD之间的依赖关系构建DAG,然后将DAG提交到调度系统。
2. DAG调度
DAGSucheduler 将DAG 切分stage,将stage 中的生成task 发送到task sechuler
3. taskSecheduler 调度task (根据资源情况将task 调度到executor中)
4. Executor接受到task,根据task 交给线程池执行处理。
spark 部署模式
local 模式
适合测试,不展开讨论
Standalone 模式
自身带节点的集群模式,集群单机模式。
spark集群架构为主从模式,即一台master 节点与多台slave节点。
查看Mater 资源监控Web UI界面在***:8080上,可以监控每个节点的使用情况。
Yarn 模式
Yarn 模式称为spark on yarn 模式,即把spark当作一个客户端,将作业提交给yarn 服务。
在生产环境上很多时候都需要hadoop使用同一个集群,因此采用yarn 来管理资源调度,可以提高资源利用率。
Mesos 模式
Mesos模式被称为Spark on Mesos模式。Mesos是一款资源调度管理系统,为Spark提供服务,由于Spark与Mesos存在密切的关系,因此在设计Spark框架时充分考虑到对Mesos的集成。
K8s 模式
Kubernetes(K8S)是Google开源的容器集群管理系统,提供应用部署、维护、扩展等功能,能够方便地管理大规模跨主机的容器应用。
Docker是轻量级虚拟化容器技术,具有轻便性、隔离性、一致性等特点,可以极大简化开发者的部署运维流程,降低服务器成本。
Spark Standalone 集群详细
1. 主节点master 进程:管理整个集群资源,并托管运行各个任务的Driver
2. 从节点slave:Worker 角色,管理每个机器的资源,分配对应的资源给executor中的task。每个从节点分配资源信息给worker管理,资源信息包含 内存和CPU core核数。
3. 历史服务器HistoryServer(可选):spark Application 运行完成后,保存事件日志数据至HDFS,启动HistoryServer 可查看应用运行相关信息。
1. 在提交任务时,其中的--master 参数是spark://master:7077 表示连接到standalone 集群中,如果不加此选项,表示local模式运行。
例如
spark-submit --master spark://master:7077 /opt/src/main/java/pi.class 5
2. 通过web查看集群运行信息
监控端口默认为8080
3. Standalone HA
是基于ZK 做状态维护的,当存在多个master,一个作为活跃其他为备份,当活跃的宕机,备份master 进行接管。达到高可用。
spark 存在着单点故障问题,其中spark提供了两种方案
1.基于文件系统的单点恢复
2.基于zk 的standby master,这种情况用于生产环境中
![](https://i-blog.csdnimg.cn/blog_migrate/683ad681fd136713eeaacfc930592a57.png)
Spark on Yarn
Yarn 本身是一个资源调度框架,负责对运行内部的计算框架进行资源调度管理。
本质:
Mater 角色由 Yarn中的ResourceManager担任;Worker 由 NodeManager 担任;Driver 角色运行在Yarn 容器内提交任务的客户端进程中,真正执行任务的executor运行在Yarn 提供的容器内。
有两种运行模式,即Cluster、Client。
对比类型 | Cluster | Client |
Driver运行位置 | Yarn内,和ApplicationMaster在同一个容器内 | 客户端进程内,比如Driver运行在spark-submit程序进程中 |
通讯效率 | 高 | 较低 |
日志查看 | 日志输出在容器内 | 日志输出在客户端的输出流 |
生产环境 | 推荐 | 不推荐 |
稳定性 | 稳定 | 基于客户端稳定程度 |
一、 Cluster
流程
1. Client 向RM 提交请求,上传jar 包到HDFS
2.RM 在集群中选择一个NameManager,在其上启动AppMaster,在AppMaster中实例化SparkContext(Driver)
3.AppMaster 向RM 注册应用程序并申请资源,RM 监控AppMaster 的状态直到AppMater 结束。
4.AppMater申请到资源后,与NameManager 通信在Container 中启动Executor进程
5.Executor向Driver 反向注册,申请任务
6. Driver 对应用进行解析,最后将Task发送到Executor上
7.Executor 中执行task,并将执行结果或状态汇报Driver
8.执行完毕,AppMaster 通知RM 注销应用,回收资源
二、Client
流程
1.启动应用程序实例化SparkContext,向RM申请启动AppMaster
2.RM 在集群中选择一个NodeManager,在其上启动AppMaster
3.AppMaster向RM 注册应用程序并提交申请资源,RM同时监控AppMaster的状态直至结束
4.AppMaster申请到资源后,与NodeManager 通信在Container 中启动Executor进程
5.Executor 向driver(Client下)反向注册,申请任务
6.Driver 对应用进行解析,最后将Task 发送到Executor中
7.Executor 中执行task,并将执行结果或状态汇报到Drvier
8.执行完毕,AppMaster 通知RM 注销资源。
作业提交细节
Job 遇到动作算子则会触发一个job;
stage是job的子集,以rdd 宽依赖shuffle为界,遇到shuffle做一次划分
task 是stage 的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个task
1)rdd 通过转换操作,形成rdd 血缘关系图,即DAG。依赖关系的分析和判断由DAGSchedule负责。
2)根据DAG 的分析结果将一个作业分成多个stage(宽依赖)
3)DAGSchedule 在确定完stage后,会向taskSchedule 提交任务集,而 taskSchedule 负责将这些任务一一分发到集群的计算节点(Executor)
4)调度过程中,SchedulerBackend 负责提供可用资源,SchedulerBackend有多种实现,分别对接不同的资源管理系统。
详细的提交流程如下
Driver 初始化SparkContext 过程中,会分别初始化DAGScheduler、TaskScheduler、SchedulerBackend以及HearbeatReceivcer,并启动SchedulerBackend 以及 HearbeatReceivcer。SchedulerBackend 通过ApplicationMaster 申请资源,并不断从TaskScheduler中拿到合适的Task分发到Executor 执行。HearbeatReceivcer负责接受Executor的心跳信息,监控Executor的存活状态,并通知TaskSehedler。
stage分类
1.ResultStage 为DAG最下游的stage,由动作算子决定
2.ShuffleMapStage 为下游stage 准备数据