文章目录
RDD产生的条件(3种)
- 从集合中创建
RDD
parallelize
函数创建makeRDD
函数创建
- 从外部存储创建
RDD
textFile()
获取本地文件系统
- 从其他
RDD
转换得到新的RDD
transformation
转换算子action
行动算子
Spark的弹性体现
- 存储的弹性:内存和磁盘的自动切换
- 容错的弹性:数据丢失可以自动恢复
- 计算的弹性:计算出错重试机制
- 分片的弹性:可根据需要重新分片
持久化和checkpoint的区别
- 持久化只是将数据保存在
BlockManager
中,而RDD
的血缘关系不变的,但是checkpoint
的数据通常是存储在如HDFS
等容错、高可用的文件系统,数据丢失可能性小 - 持久化的数据丢失可能性较大,磁盘内存都有可能数据丢失,但是
checkpoint
的数据通常存储在如HDFS
等容错、高可用的文件系统,数据丢失可能性较小 - 默认情况下,如果某个
RDD
没有持久化,但是设置了eheckpoint
,会存在问题,本来这个job都要都要执行结束了,但是由于RDD
没有持久化,ehcekpoint
job想要将RDD
的数据写入到外部文件系统的话,需要全部重新计算一次,再将计算出来的RDD
数据checkpoint
到外部文件系统
Spark集群管理器
为了能让Spark可以高效的在一个计算节点和数千个计算节点之间伸缩运行,所以有了Spark集群管理器
Hadoop Yarn
(国内使用最广泛)Apache Mesos
(国内使用较少,国外使用多)Standalone
(Spark
自带的资源管理器,需要在每个集群中的每台节点上配置spark
)
Spark核心概念介绍
Master:
Spark
特有资源调度系统的Leader
,掌握着整个集群的资源信息,类似于Yarn
架构中的ResourceManager
主要功能:
- 监听
Worker
,看Worker
是否正常工作 - 接收
worker
的注册并管理所有的Worker
,接收Client
提交的Application
,调度等待的Application
并向Worker
提交
Worker:
Spark
特有资源调度系统的Slave
有多个,每个Slave
掌管着所在节点的资源信息,类似于Yarn
框架中的NodeManager
主要功能:
- 通过
RegisterWorker
注册到Master - 定时发送心跳给
Master
- 根据
Master
发送的Application
配置进程环境,并启动ExecutorBackend
执行Task
所需的临时进程
Spark中client
和cluster
提交的区别
Standalone-Client
执行流程:
client
模式提交任务后,会在客户端启动Driver
进程Driver
会向Master
申请启动Application
启动资源- 资源申请成功,
Driver
端将task
分发到worker
端执行,启动executor
进程(任务分发) Worker
端(executor
进程),将task
任务的计算结果返回Driver
端
缺点:
- 在当前的节点启动
driver
进程,如果每次都是client
提交任务,那么所有的application
应用程序会在一个节点上启动dirver
进程,会造成客户端出现网卡流量暴增的情况
优点:
client
只适用于测试环境,Driver
会在客户端启动(提交任务节点),可以在Driver
端看到task
任务执行情况
Standalone-Cluster
执行流程:
cluster
模式提交应用程序后,会向Master
请求启动Driver
Master
接收请求,随机在集群一台节点上启动Driver
进程Driver
启动后为当前的应用程序申请资源Driver
端发送task
到worker
节点上执行worker
上的executor
进程将执行情况和执行结果返回给Driver
端
优点:
- 解决了
client
端提交任务时会出现的网卡流量暴增的情况
缺点
- 任务提交后不能看到日志,只能通过
yarn ui页面
查看日志
Yarn-Client
执行流程:
- 客户端提交一个
Application
,在客户端启动一个Driver
进程 - 应用程序启动后会向RS(
ResourceManager
)(相当于standalone
模式下的master
进程)发送请求,启动AM
(Application Master
) RS
收到请求后,随机选择一台NM
(NodeManager
)启动AM
,这里NM
相当于Standalone
中的worker
进程AM
启动后,会向RS
请求一批container
资源,用于启动Executor
RS
会找到一批NM
(包含container
)返回给AM
,用于启动Executor
AM
会向NM
发送命令启动Executor
Executor
启动后,会反向注册给Driver
,Driver
发送task
到Executor
,执行情况和结果返回给Driver
端
优点和缺点与**Standalone-client
**一致
Yarn-cluster
执行流程:
- 客户机提交
Application
应用程序,发送请求到RS(ResourceManager)
,请求启动AM(ApplicationMaster)
RS
收到请求后随机在一台NM
(NodeManager
)上启动AM
(相当于Driver
端)RS
返回一批NM
节点给AM
AM
连接到NM
,发送请求到NM
启动Executor
Excutor
反向注册到AM
所在节点的Driver
,Driver
发送task
到Excutor
优点和缺点与**Standalone-cluster
**一致
Spark资源调度和任务调度的流程
资源调度:
DAGScheduler
主要的作用就是将DAG
根据RDD
之间的宽窄依赖关系划分为一个个的Stage
,然后将这些stage
以TaskSet
的形式提交给TaskScheduler
(TaskScheduler
是任务调度的底层调度器,这里TaskSet
其实就是一个集合,里面封装的就是一个个task
任务,也就是stage
中并行的task
任务)
任务调度:
TaskSchedule
会遍历TaskSet
集合,拿到每个task
后将task
发送到Executor
中去执行(其实就是发送到Executor
中的线程池ThreadPool
去执行)TaskScheduler
不仅会重试失败的task任务,同时还会重试任务进行(缓慢,落后)的task
任务,对于运行缓慢的task
任务,TaskScheduler
会重新开启一个新的task
执行这个缓慢人物的相同处理逻辑,哪个任务先执行完,就以哪个为准,这个就是TaskScheduler
的推测执行- 但是当遇到数据倾斜的情况,
TaskScheduer
的推测执行又会开启一个新的Task
任务,可能会处于死循环的状态,任务可能一致处于处理不完的状态
1、task在Executor线程池中的运行情况会向TaskScheduler反馈,当task执行失败时,则由TaskScheduler负责重试,将task重新发送给Executor去执行,默认重试3次,如果重试3次依然失败,那么这个stage就失败了
2、如果stage失败了就由DAGScheduler进行重试,重新发送TaskSet给DagScheduler任务调度器,如果stage重试4次,那么就证明这个job任务就失败了。Application应用程序失败
粗粒度资源申请和细粒度资源申请
粗粒度资源申请(代表Spark)
在Application
执行之前,将所有的资源申请完毕,当资源申请成功后,才会进行任务的调度,当所有的task
执行完毕后,才会释放这部分资源
优点: 在Application
执行之前,所有的资源都申请完毕,每一个task
直接使用资源就可以了,不需要task
在执行前自己去申请资源,task
启动就快了,task
执行快了,stage
执行就快了,job
就快了,application
就快了
缺点:直到最后一个task执行完成才会释放资源,集群的资源无法充分利用
细粒度资源申请(代表MR)
application
执行之前不需要先去申请资源,而是直接执行,让job
中的每一个task
在执行之前自己去申请资源,task
执行完成就释放资源
优点:集群的资源可以充分利用
缺点:效率过低,task
启动慢了,task
执行就慢了,stage
执行就慢了,job
就慢了,application
就慢了