一、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操做,作集羣間的數據同步。