文章目录
一、Spark中的基本概念
(1)Application:表示你的应用程序
(2)Driver:表示main()函数,创建SparkContext。由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭SparkContext
(3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上。
(4)Worker:集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点。
(5)Task:在Executor进程中执行任务的工作单元,多个Task组成一个Stage
(6)Job:包含多个Task组成的并行计算,是由Action行为触发的
(7)Stage:每个Job会被拆分很多组Task,作为一个TaskSet,其名称为Stage
(8)DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是RDD之间的依赖关系
(9)TaskScheduler:将TaskSet提交给Worker(集群)运行,每个Executor运行什么Task就是在此处分配的。

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

-
DAGScheduler
Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTask和ResultTask,Dependency分为ShuffleDependency和NarrowDependency面向stage的切分,切分依据为宽依赖
stage与stage之间是宽依赖,stage内部都是窄依赖
宽窄依赖的作用是:将job切割成多个stage.从祖先RDD开始找,如果是窄依赖继续往下找,以宽依赖为切割点,分为2个stage
Spark 程序执行时,SparkContext 会将每个 job 构建成一个 DAG图,然后根据 RDD 间的宽窄依赖划分出一个个 stage -> 从后往前回溯,遇到宽依赖就切割;

- TaskScheduler
维护task和executor对应关系,executor和物理资源对应关系,在排队的task和正在跑的task。内部维护一个任务队列,根据FIFO或Fair策略,调度任务。
- spark资源调度的方式
spark 使用粗粒度的资源调度
粗粒度的资源调度
在任务执行前申请到所需的所有资源,当所有 task 执行完毕后再释放资源
典型代表是standalone模式,mesos粗粒度模式,yarn
优点:task 直接使用已经申请好的资源,执行效率高
缺点:所有的 task 执行完毕才释放资源,可能导致集群资源浪费,例如只剩一个 task 迟迟不能结束,那么大量资源将被闲置
细粒度的资源调度
任务执行时,task 自己去申请资源,执行完毕后释放资源,如mesos细粒度模式
优点:使集群资源得以充分利用
缺点:task 需要自己申请资源,执行效率低
三、Spark集群三种运行模式
- Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上)
- Standalone、Spark on Yarn 集群搭建详细步骤
1. local模式
Local 模式是最简单的一种Spark运行方式,它采用单节点多线程(cpu)方式运行,local模式是一种OOTB(开箱即用)的方式,只需要在spark-env.sh导出JAVA_HOME,无需其他任何配置即可使用,
方式:./spark-shell - -master local[n] ,n代表线程数
2. Standalone
Standalone模式是Spark实现的资源调度框架,其主要的节点有Client节点、Master节点和Worker节点。其中Driver既可以运行在Master节点上中,也可以运行在本地Client端。当用spark-shell交互式工具提交Spark的Job时,Driver在Master节点上运行;当使用spark-submit工具提交Job或者在Eclips、IDEA等开发平台上使用”new SparkConf().setMaster(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的。
运行过程:
- 提交一个任务Application
- 初始化程序的入口SparkContext(初始化DAG Scheduler,Task Scheduler)
- Task Scheduler向master去进行注册并申请资源(CPU Core和Memory)
- Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend;顺便初始化好了一个线程池
- 当 Executor 成功启动后,会去向 TaskScheduler 反向注册,此时TaskScheduler 就得到所有成功启动的 Executor 的信息到这个时候其实我们的初始化过程基本完成了,我们开始执行transformation的代码,但是代码并不会真正的运行,直到我们遇到一个action操作。生产一个job任务,进行stage的划分
- SparkContext 对象解析代码构建DAG(有向无环图)交给 DAGScheduler,每一个 job 会构建一个DAG图,DAGScheduler 根据 DAG 中 RDD 的宽窄依赖将其切分成一个个 stage,每个 stage 中包含一组 task,每个 task 因为都是窄依赖,不会产生 shuffle,所以都是 pipeline(管道) 计算模式
- DAGScheduler 将一个 stage 封装到一个 taskSet 中,传给 TaskScheduler,TaskScheduler拿到后遍历 taskSet ,得到一个个 task,解读其要计算的数据,然后调用 HDFS 的 API 得到数据所在的位置
- 本着计算向数据靠拢的原则,TaskScheduler 将 task 分发到其所要计算的数据所在的节点的 Executor 进程中,task 最后会被封装到线程池里的一个线程中执行,task 执行的过程中 TaskScheduler 会对其进行监控
- 如果 task 执行失败,TaskScheduler 会进行重试,再次分发该 task ,最多重试3次;
如果 task 陷入挣扎并且 spark 开启了推测执行,TaskScheduler 会换一个节点分发陷入挣扎的 task,两个 task 谁先执行完就以谁的结果为准
陷入挣扎的判定标准:当75%的 task 已经执行完毕后,这时 TaskScheduler 每隔10ms会计算一次剩余 task 当前执行时间的中值 t,然后以 t 的1.5倍 为标准,未执行完的 task 当前执行时间如果大于 t*1.5 则该 task 被判定为陷入挣扎的 task
- 如果3次重试后 task 依然执行失败,该 task 所在的 stage 就会被判定为失败,TaskScheduler 会向 DAGScheduler 反馈,DAGScheduler 会重试失败的 stage,最多重试4次,如果4次重试后该 stage 依然失败,则该 job 被判定为失败,程序中止
DAGScheduler 重试 stage 时只会重试 stage 中失败的 task - 当所有 task 成功执行完毕后或 job 失败,driver 会通知 master, master 会通知 worker kill 掉 Executor,完成资源回收
运行过程图解

3. Spark on YARN
Spark on YARN模式根据Driver在集群中的位置分为两种模式:一种是YARN-Client模式,另一种是YARN-Cluster(或称为YARN-Standalone模式)。
Spark On Yarn的优势
- Spark支持资源动态共享,运行于Yarn的框架都共享一个集中配置好的资源池
- 可以很方便的利用Yarn的资源调度特性来做分类·,隔离以及优先级控制负载,拥有更灵活的调度策略
- Yarn可以自由地选择executor数量
- Yarn是唯一支持Spark安全的集群管理器,使用Yarn,Spark可以运行于Kerberized Hadoop之上,在它们进程之间进行安全认证
3.1 YARN-Client
在Yarn-client中,Application Master仅仅从Yarn中申请资源给Executor,之后client会跟container通信进行作业的调度
YARN-client的工作流程
- 客户端生成作业信息提交给ResourceManager(RM)
- RM在本地NodeManager启动container并将Application Master(AM)分配给该NodeManager(NM)
- NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
- Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
- Executor向本地启动的Application Master注册汇报并完成相应的任务
- 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。
YARN-client图解

3.2 YARN-Cluster
在Yarn-cluster模式下,driver运行在Appliaction Master上,Appliaction Master进程同时负责驱动Application和从Yarn中申请资源,该进程运行在Yarn container内,所以启动Application Master的client可以立即关闭而不必持续到Application的生命周期,
YARN-Cluster运行流程
- 客户端生成作业信息提交给ResourceManager(RM)
- RM在某一个NodeManager(由Yarn决定)启动container并将Application Master(AM)分配给该NodeManager(NM)
- NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
- Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
- Executor向NM上的Application Master注册汇报并完成相应的任务
YARN-Cluster运行流程图解

3.3 YARN-Client 与 YARN-Cluster 区别
1、YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业;
2、YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开。
4. Spark Standalone与Spark On Yarn模式下的比较

3429



被折叠的 条评论
为什么被折叠?



