Spark中的BlockManager

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

你可能感兴趣的:(Spark中的BlockManager)