Spark中的BlockManager

一、BlockInfoManager網絡

管理Block的元數據,BlockId是Block的標號,由塊的類別,mapId,reduceId等屬性惟一標識。app

BlockInfo維護BlockId、讀task、寫task、塊大小等塊的基本信息,以及它和任務的關係。spa

BlockInfoManager管理塊的讀申請、寫申請、註冊任務等,管理任務操做塊時候的同步/互斥/等待(wait)等機制。BlockInfoManager最主要的三個方法:對象

registerTask:註冊任務接口

lockForReading:鎖互斥獲取讀塊。同步

lockForWriting:鎖互斥獲取寫塊。it

讀塊和寫塊只是區分用途的說法,實際上是一個塊。spark

二、BlockManagerast

首先是BlockResult,它表示一個Block中的數據和長度,數據用Iterator[Any]表示,是一個迭代器。class

而後是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。

三、BlockManagerMaster和BlockManagerSlave

看名字就知道這兩個類是幹什麼用的了。

Master負責管理整個集羣的Block操做,作集羣間的數據同步。

相關文章
相關標籤/搜索