【Spark】Spark 存储原理--通信层架构分析

本文详细介绍了Spark的BlockManager、BlockManagerMaster及其通信端点,分析了Spark存储管理的主从结构,包括数据块的元信息更新、远程数据块获取和删除操作,以及通信过程。
摘要由CSDN通过智能技术生成

本篇结构:

  • 概念介绍
  • 初始化过程
  • 相互通信

Spark 存储管理模块采用的是主从结构(Master/Slave)来实现通信层,主节点和从节点之间传输控制信息、状态信息,通信的底层还是依赖 Spark Rpc 框架。

Master 主要负责整个应用程序在运行期间 block 元数据的管理和维护,Slave 主要负责将本地数据块的状态的汇报给 Master,而且接收 Master 传过来的执行指令,比如获取数据块状态,删除 RDD 数据块等。

一、概念介绍

在阅读 Spark 存储原理相关源码前,先了解下 Spark 存储相关的类。

Block 是 Spark 数据处理的时候最小单位,是物理层面的储存单位,和逻辑层面 RDD 的分区是一一对应的。

BlockManager、BlockManagerMaster 及 BlockManagerMasterEndpoint 这几个类从名字上看很相似,理解较模糊,下面简单介绍。

1.1、BlockManager

顾名思义,BlockManager 被 Spark 用来管理 BlockManager 所在节点内存和磁盘中的数据块。

Driver 和 Executor 节点都会创建 BlockManager 。Driver 上的 BlockManager 不具备实际存储的能力,它记录了各个 Executor 的 BlockManager 的状态。Executor 上的 BlockManager 负责数据的读写请求,删除等操作,并向 Driver 节点注册,汇报其所管理的数据块元数据信息。

1.2、BlockManagerMaster

和 BlockManager 一样,BlockManagerMaster 也在 SparkEnv 中创建。

BlockManager 负责管理其所在节点的 Block 数据块,而 BlockManagerMaster 主要负责整个应用程序在运行期间 block 元数据的管理和维护,以及向从节点发送指令执行命令。

1.3、BlockManagerMasterEndpoint、BlockManagerSlaveEndpoint

BlockManagerMaster 并不具备通信的能力,真正通信的是 BlockManagerMasterEndpoint,BlockManagerSlaveEndpoint,它们负责通过远程消息通信的方式去管理所有节点的 BlockManager。

BlockManagerMasterEndpoint 是 Driver 的通信端点,BlockManagerSlaveEndpoint 是 Executor 的通信端点,Driver 通过 BlockManagerMaster 管理所有的 Block 数据块,向 Executor 发送操作 Block 数据块的请求是通过 BlockManagerMasterEndpoint 和 BlockManagerSlaveEndpoint 的通信实现,BlockManagerMasterEndpoint 或者 BlockManagerSlaveEndpoint 收到请求后调用 BlockManager 去实际操控 Block 数据。

二、初始化过程

通过 Spark-submit 启动一个应用程序后,如果是 client 模式,应用程序就运行在提交程序端,如果是 cluster 模式,应用程序由 Master 分配到 Worker 中运行,应用程序运行的进程称为 driver 端。

应用程序启动时,都会构建 SparkContext,SparkContext 中会创建 Driver 端的通信底层框架 SparkEnv,在该 SparkEnv 初始化时又会实例化 BlockManager 和BlockManagerMaster,BlockManagerMaster 实例化过程中内部创建消息通信的终端点 BlockManagerMasterEndPoint 。

在 SparkEnv 初始化时还会创建 BlockTransferService 负责网络数据传输服务。

应用程序启动后会和 Master 通信,由 Master 根据应用程序的参数与 Worker 通信启动相应数量的 Executor,Executor 启动中也会创建 SparkEnv,同样会初始化 Block 数据块管理相关的类,只是根据 Driver 和 Executor 的不同,这些类的细节有部分不同,使用上也有不同。

SparkEnv:

// 远程数据传输服务,使用 Netty 实现
val blockTransferService =
  new NettyBlockTransferService(conf, securityManager, bindAddress, advertiseAddress,
    blockManagerPort, numUsableCores)

// 创建 BlockMangerMaster,如果是 Dirver端,在 BlockMangerMaster,内部则创建终端点 BlockManagerMasterEndpoint // 如果是 Executor,则持有 BlockManagerMasterEndpoint 的引用
val blockManagerMaster = new BlockManagerMaster(registerOrLookupEndpoint(
  BlockManagerMaster.DRIVER_ENDPOINT_NAME,
  new BlockManagerMasterEndpoint(rpcEnv, isLocal, conf, listenerBus)),
  conf, isDriver)

// NB: blockManager is not valid until initialize() is called later.
// 创建 BlockManager,运行在每个节点(Driver 和 Executor)上,该节点提供接口,用于管理本地节点 Block 数据块。
val blockManager = new BlockManager(executorId, rpcEnv, blockManagerMaster,
  serializerManager, conf, memoryManager, mapOutputTracker, shuffleManager,
  blockTransferService, securityManager, numUsableCores)
  1. 先具体看 BlockManagerMaster 的创建,该过程中会调用 registerOrLookupEndpoint 方法。

S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值