概述
本文介绍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过程中的数据传输,提供了数据块管理的基础。