BlockManager是Spark的分布式存储系统
主从结构:BlockManagerMaster/BlockManager(Slave)
BlockManagerMaster
- 在Driver端启动
- 负责接受Executor上的BlockManager的注册
- 管理BlockManager的元数据信息
BlockManager
-
在每个Executor中启动
-
负责管理所在节点上的数据
主要由四部分构成
- MemoryStore:负责对内存上的数据进行存储和读写
- DiskStore:负责对磁盘上的数据进行存储和读写
- BlockTransferService:负责建立网络连接
- BlockManagerWorker:负责对其他的BlockManager的数据进行读写
-
当Executor 的BlockManager 执行了增删改操作,那就必须将 block 的 blockStatus 上报给Driver端的BlockManagerMaster
-
BlockManagerMaster 内部的BlockManagerMasterEndPoint 内维护了元数据信息的映射,其内部通过Map、Set等数据结构实现,易于维护增加、更新、删除元数据
-
BlockManager主要维护以下三类数据:
- Cache缓存的数据
- 广播变量和累加器
- Shuffle产生的数
shuffle文件获取过程
-
MapOutputTrack也属于BlockManager中的一个服务,用于管理MapTask的输出
-
当MapTask在Executor中执行完成之后会生成Shuffle文件,由MapOutputTrack管理,并向Driver端汇报文件地址
-
MapTask为什么需要向Driver端汇报地址?
基于RDD第五大特性:- Spark为每个Task尽可能的提供最佳计算位置 ,移动计算,不移动数据
- 尽可能让MapTask和ReduceTask在一个Executor中执行,避免大批量的Shuffle文件通过网络在不同的Executor之间进行传输,提升任务运行效率
- 即让每个Task的数据本地化级别最优
数据本地化级别
Spark任务主要有5个数据本地化级别:
- PROCESS_LOCAL进程本地化
- NODE_LOCAL节点本地化
- NO_PREF无最佳位置
- RACK_LOCAL机架本地化
- ANY跨机架调用
资源申请和任务调度
资源申请:
On Yarn又可以分为两种运行模式:
-
Client客户端模式(常用于上线前的测试)
-
过程:
-
在 YARN Client 模式下,spark-submit提交 Spark Job之后,就会提交的本地机器上启动Driver端
-
Driver 启动后会与 ResourceManager (RM)建立通讯并发起启动 ApplicationMaster(AM) 请求
RM接收到这个 Job 时,会在集群中选一个合适的 NodeManager (NM)并分配一个 Container(具有计算资源的一个容器),然后启动 ApplicationMaster(初始化SparkContext) -
AM的功能相当于一个 ExecutorLaucher (Executor启动器),负责向 RM申请 Container 资源 ,RM收到请求后便会与 NM通信,启动 Container
-
AM对RM指定 NM分配的 Container 发出启动 Executor 进程请求
-
Executor进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行执行 Job 任务
-
Driver 中的 SparkContext 分配 Task 给 Executor 执行,Executor 运行 Task 并向 Driver 汇报运行的状态、进度、以及最终的计算结果;让 Driver 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
-
应用程序运行完成后,AM向 RM申请注销并关闭自己。
-
-
Cluster集群模式(任务真正上线时运行的模式)
-
过程:
- 在 YARN Cluster 模式下,Spark 任务提交之后会与 RM建立通讯,并发出申请启动 AM请求
- RM接收到这个 Job 时,会在集群中选一个合适的 NodeManager 并分配一个 Container,然后启动 AM,此时的 AM不仅负责ExecutorLauncher,还兼顾 Driver的作用
- AM启动后向 RM申请资源启动Executor,RM接到 AM的资源申请后会在合适(有资源的情况下)的 NodeManager 中分配 Container
- AM对RM指定 NodeManager 分配的 Container 发出启动 Executor 进程请求
- Executor 进程启动后会向 AM(Driver)反向注册,Executor 全部注册完成后,开始执行执行 Job 任务
- AM中的 SparkContext 分配 Task 给 Executor 执行,Executor 运行 Task 并向AM(Driver)汇报运行状态、进度、以及最终结果;让 AM(Driver)随时掌握各任务的运行状态,从而可在任务失败时重新启动任务
- 应用程序运行完成后,ApplicationMaster 向 ResourceManager 申请注销并关闭自己;
Client模式 VS Cluster模式
Client模式
- Driver端在任务提交所在节点本地创建
- 主要用于Job的调试,上线前的测试
- 便于在本地查看日志
- 当多用户同时提交多个任务时,Driver 会与 Executor 进行大量的通信,会占用大量IO,导致网卡流量激增而被SA警告
Cluster模式
- AM兼顾Driver端的作用,在某个NM中创建
- 适用于任务真正上线
- 由于AM(Driver)端是在任意某个NM中创建,故不会造成单节点流量激增,也不会导致网卡风暴
- 无法直接查看日志,需要通过命令或者在WEB界面查看
任务调度
- Application:基于Spark的应用程序,包含了Driver端和Executor端
- Driver程序:运行main函数并且新建SparkContext的程序
- ClusterManager:集群资源管理者,例如Yarn中的 ResourceManager
- WorkerNode:工作节点,启动Executor的地方,例如Yarn中的NodeManager
- Executor:在WorkerNode上为某应用启动的一个进程,该进程负责运行任务,并且负责维护存在内存或者磁盘上的数据,每个应用都有各自自独立的Executor
- Task:线程对象,被发送到某个Executor上的执行单元 *
Application=>job=>Stage=>Task(被Driver送到Executor中执行)