spark2原理分析-BlockManager总体架构设计

概述

本文介绍spark的存储体系,通过本文的学习可以对spark的BlockManager体系有一个总体的把握。

BlockManger的总体架构

BlockManager运行在spark的每个节点上(包括driver和executors),它提供了一个保存和获取本地或远端数据块到内存、磁盘、或off-heap中的统一接口。

在这里插入图片描述

从该架构图可见,在spark的每个任务执行器中都有一个blockmanager类实例,该实例会向driver端的BlockManagerMaster对象注册自己的信息。

BlockManagerMaster运行在driver端,负责对数据块的信息进行更新,对各个executor的blockmanager信息进行管理。

BlockManager对象的创建

对象的初始化参数

构造函数的参数:

(1) blockTransferService: new NettyBlockTransferService: 通过netty在某个时间内来获取一批数据块

(2) shuffleManager: new SortShuffleManager():driver通过该类来注册shuffle的类,executor通过它来请求读取或写入数据

(3) memoryManager: MemoryManager: 内存管理模块

(4) mapOutputTracker: MapOutputTracker:用来跟踪每个stage的map的输出位置

在创建BlockManager对象时,会创建以下对象:

创建DiskBlockManager对象

val diskBlockManager = {
    // Only perform cleanup if an external service is not serving our shuffle files.
    val deleteFilesOnStop =
      !externalShuffleServiceEnabled || executorId == SparkContext.DRIVER_IDENTIFIER
    new DiskBlockManager(conf, deleteFilesOnStop)
  }

如上面的代码实现,在创建BlockMnager对象时会创建一个DiskBlockManager对象。该对象用来维护逻辑数据块和磁盘上的物理数据块位置的映射关系。这样通过逻辑块就可以找到实际的物理数据块。
一个数据块对应磁盘上的一个文件,文件按BlockId命名。

创建DiskStore对象

  private[spark] val diskStore = new DiskStore(conf, diskBlockManager, securityManager)

DiskStore对象用来保存数据块到磁盘上。

创建RemoteBlockDownloadFileManager对象

  private[storage] val remoteBlockTempFileManager =
    new BlockManager.RemoteBlockDownloadFileManager(this)

该实例用来在获取远端文件时,创建临时文件,这样来减少对内存的使用。

创建BlockInfoManager对象

 // Visible for testing
  private[storage] val blockInfoManager = new BlockInfoManager

该类的主要功能:

(1) 管理数据块的元数据

(2) 维护读取数据块的读写锁

创建MemoryStore对象

private[spark] val memoryStore =
    new MemoryStore(conf, blockInfoManager, serializerManager, memoryManager, this)

该类的主要功能:

(1) 把数据块保存在内存中

(2) 内存中可能是反序列化后的java对象的数组,或则是序列化后的Byte值。

创建rpc 的 blockmanger slaveEndpoint对象

 private val slaveEndpoint = rpcEnv.setupEndpoint(
    "BlockManagerEndpoint" + BlockManager.ID_GENERATOR.next,
    new BlockManagerSlaveEndpoint(rpcEnv, this, mapOutputTracker))

这是一个RpcEndpoint,该对象用来和BlockManagerMaster进行消息和命令的传输。

创建shuffleClient

  private[spark] val shuffleClient = if (externalShuffleServiceEnabled) {
    val transConf = SparkTransportConf.fromSparkConf(conf, "shuffle", numUsableCores)
    new ExternalShuffleClient(transConf, securityManager,
      securityManager.isAuthenticationEnabled(), conf.get(config.SHUFFLE_REGISTRATION_TIMEOUT))
  } else {
    blockTransferService
  }

该客户端用来读取其他executor中的shuffle的文件。它可以是一个外部服务,也可以是一个直接连接到其他executor的标准BlockTransferService。

总结

本文讲述了spark2的blockmanger的总体框架。blockmanger是spark2中存储系统的重要组成部分。

通过blockmanger可以有效的对数据块进行管理,为shuffle过程中的数据传输,提供了数据块管理的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值