前言
相比于传统的Mapreduce批处理框架,Spark的计算速度快了近10倍,一方面得益于Spark基于内存计算,减少的数据的Shuffle,另一方面还得益于Spark优秀的调度管理模块。下面是个人的一点小总结。1、运行模式
local 用于调试
standalone Spark自带的资源调度框架
yarn
mesos
2、宽窄依赖
宽依赖:父RDD只会被一个子RDD使用 一对多 多对一
窄依赖:父RDD被多个子RDD使用 一对多 (会产生磁盘落地Shuffle)
Stage就是按照宽窄依赖来划分的
3、Spark架构设计
- Master 主节点 资源管理 集群状态
- Cluster Manager 集群中获取资源的外部服务如yarn standalone
- Worker 从节点 管理节点的资源 创建Executor 将从节点主机资源分配给Executor
- Application:Spark程序
- Executor :Worker节点上为每个Application启动的进程,该进程负责运行任务并且将结果落地写入磁盘,每Application都有独立的Executor
- Driver:链接Worker的程序 每个Application都有独立的Driver
- Task:Executor上执行的最小工作单元 。每个 stage 里面 task 的数目由该 stage 最后一个 RDD 中的 partition 个数决定。
- Job:包含多个Task Application中有几个Action算子就有几个Job
- Stage:一个Job会拆分成多个Stage,每个Stage由多个Task并行执行
## 4、Spark相比MapReduce 1、Spark基于内存 Mr基于磁盘 2、Spark会为每个Rdd组织一个DAG有向无环图,效率高 3、Spark是粗粒度资源申请 MR是细粒度的 什么是粗粒度,细粒度?
粗粒度就是执行Application之前系统申请足够多的资源给Executor,可能会过剩 但是不需要Task单独申请 细粒度相反,需要每个Task单独申请资源
粗粒度优缺点:速度快 但是集群资源会造成浪费
细粒度优缺点:速度慢 但是可以有效利用集群资源
5、Spark任务提交过程
转载https://www.linuxidc.com/Linux/2018-02/150886.htm
1. Standalone模式
2、 yarn-client模式,Dirver运行在本地的客户端上。
1.client向ResouceManager申请启动ApplicationMaster,同时在SparkContext初始化中创建DAGScheduler和TaskScheduler
2.ResouceManager收到请求后,在一台NodeManager中启动第一个Container运行ApplicationMaster
3.Dirver中的SparkContext初始化完成后与ApplicationMaster建立通讯,ApplicationMaster向ResourceManager申请Application的资源
4.一旦ApplicationMaster申请到资源,便与之对应的NodeManager通讯,启动Executor,并把Executor信息反向注册给Dirver
5.Dirver分发task,并监控Executor的运行状态,负责重试失败的task
6.运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
3、yarn-cluster模式
第一个阶段是把Spark的Dirver作为一个ApplicationMaster在yarn中启动;
第二个阶段是ApplicationMaster向ResourceManager申请资源,并启动Executor来运行task,同时监控task整个运行流程并重试失败的task;
Yarn-client和Yarn-cluster的区别:
yarn-cluster模式下,Dirver运行在ApplicationMaster中,负责申请资源并监控task运行状态和重试失败的task,当用户提交了作业之后就可以关掉client,作业会继续在yarn中运行;
yarn-client模式下,Dirver运行在本地客户端,client不能离开。
6、RDD进化过程
网上看到一张图,感觉很形象O(∩_∩)O哈哈~
rdd是懒加载的
最后action算子触发所有的RDD操作,成为行走的人
总结
本文主要讲了:
Spark在集群上提交任务的执行流程以及一些名词的解释
Spark运行时架构
宽窄依赖 以及Spark与MR的区别
RDD的转换过程
Spark运行模式 local yarn standalone mesos
本文未提到的:
如何向集群提交一个Spark Application