Spark中的BlockManager

本文详细解析了Spark中BlockInfoManager和BlockManager的功能与实现,包括Block的元数据管理、读写申请、任务注册,以及BlockResult和BlockData的结构。介绍了BlockManagerMaster和BlockManagerSlave在集群数据同步中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、BlockInfoManager

管理Block的元数据,BlockId是Block的标号,由块的类别,mapId,reduceId等属性唯一标识。

BlockInfo维护BlockId、读task、写task、块大小等块的基本信息,以及它和任务的关系。

BlockInfoManager管理块的读申请、写申请、注册任务等,管理任务操作块时候的同步/互斥/等待(wait)等机制。BlockInfoManager最主要的三个方法:

registerTask:注册任务

lockForReading:锁互斥获取读块。

lockForWriting:锁互斥获取写块。

读块和写块只是区分用途的说法,其实是一个块。

2、BlockManager

首先是BlockResult,它表示一个Block中的数据和长度,数据用Iterator[Any]表示,是一个迭代器。

然后是BlockData ,表示如何将Block转换成可序列化的数据,转换的方式多种,有转成Netty对象可以网络传输的,有转出InputStream的,有转出字节组的:

private[spark] trait BlockData {

  def toInputStream(): InputStream

  /**
   * Returns a Netty-friendly wrapper for the block's data.
   *
   * Please see `ManagedBuffer.convertToNetty()` for more details.
   */
  def toNetty(): Object

  def toChunkedByteBuffer(allocator: Int => ByteBuffer): ChunkedByteBuffer

  def toByteBuffer(): ByteBuffer

  def size: Long

  def dispose(): Unit

}

BlockManager:包含diskBlockManager、memoryStore等多种存储介质的方式综合管理block,对外提供统一的Block读写接口。

BlockManager提供了多种接口读写Block,但概括起来都是可以说出如何将Iterator[Any]写入存储介质,介质根据StorageLevel的值决定是写入MemoryStore还是写入DiskStore。此类方法定义类似于下面:

 private def doPutIterator[T](
      blockId: BlockId,
      iterator: () => Iterator[T],
      level: StorageLevel,
      classTag: ClassTag[T],
      tellMaster: Boolean = true,
      keepReadLock: Boolean = false)

tellMaster是说要不要告诉BlockManagerMaster。

3、BlockManagerMaster和BlockManagerSlave

看名字就知道这两个类是干什么用的了。

Master负责管理整个集群的Block操作,做集群间的数据同步。

 

 

转载于:https://my.oschina.net/u/778683/blog/2997221

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值