块存于内存的时候有个统一的数据结构
此外,若块进行了反序列化,则用ArrayBuffer来存放,否则用 ByteBuffer
以putValues()为例
override def putValues(//putValues将数据块进行反序列化存储
blockId: BlockId,
values: ArrayBuffer[Any],//注意这里用的是Array[Buffer],因此若为序列化存储,则要转换为ByteBuffer
level: StorageLevel,
returnValues: Boolean): PutResult = {
if (level.deserialized) {//如果是反序列化
val sizeEstimate = SizeEstimator.estimate(values.asInstanceOf[AnyRef])//估算值的大小
val putAttempt = tryToPut(blockId, values, sizeEstimate, deserialized = true)//存放数据块
PutResult(sizeEstimate, Left(values.iterator), putAttempt.droppedBlocks)
} else {
val bytes = blockManager.dataSerialize(blockId, values.iterator)//序列化存储,因此要先将数据块序列化
val putAttempt = tryToPut(blockId, bytes, bytes.limit, deserialized = false)//存放数据块
PutResult(bytes.limit(), Right(bytes.duplicate()), putAttempt.droppedBlocks)
}
}
其余的如putBytes()等方法也类似理解
BlockManager存取从节点的数据块分别用到了get()和put()方法有个比较重要的方法doPut()来存放数据块,具体的明天继续更新
get()的整个过程可以概述如下:
首先从本地取数据块(判断是否可以先从内存中获取数据块,可以,就从内存中取,不可以的就从tachyon取,再不行就从磁盘中取,从磁盘中取完之后,再把该数据块放到内存中,便于下次快速取出)->本地取不出,从其他从节点取(首先检查该数据块存在于哪些从节点中,然后和这些从节点(更具体来说是executor)建立连接,即ConnectionManager的事情,最后就是取数据了,涉及到了期待已久的BlockManagerSlave的事情了,它大致的过程就是如果想从A从节点(更具体来说是A从节点的某executor)取数据,先建立一个responseMessage,它包括ConnectionManager,和为每一个数据块建立的一个块消息,当然可能从多个从节点(更具体来说是executor)获取数据,那消息就会组成一个消息队列,该消息(队列)会放在BufferMessage中,若和从节点A(更具体来说是A从节点的某executor)连接成功,则responseMessage就不为空,从BufferMessage中取得该数据块的块消息(队列),继而取得数据)
其代码可以理解如下:
def get(blockId: BlockId): Option[Iterator[Any]] = {
val local = getLocal(blockId)//从本地的块管理器获取数据块
if (local.isDefined) {
logInfo("Found block %s locally".format(blockId))
return local
}
val remote = getRemote(blockId)//本地获取不到就从其他从节点获取
if (remote.isDefined) {
logInfo("Found block %s remotely".format(blockId))
return remote
}
None
}
put()存放数据,它主要是通过doPut()方法实现了存放数据,其主要过程概述如下:
首先检查该数据是否存在,若存在,则不需要添加,否则->若数据的存储形式为内存存储,则将数据块以序列化或者反序列化的形式存放于内存->若数据的存储形式为tachyon存储,则存放于tachyon->若数据的存储形式为磁盘存储,则存于磁盘->若存取不成功,则取消该块的存放操作,否则->获得存放该块之后所有数据块的状态
BlockManager还有其他一些方法,如获取所有数据库的状态信息,或者获取多个块等等,不过个人认为它最大的贡献就是生成了BlockManagerMaster,而BlockManagerMaster最大的贡献就是生成了BlockManagerMasterActor
未完待续。。。。