2019独角兽企业重金招聘Python工程师标准>>>
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操作,做集群间的数据同步。