文章目录
简介
BlockManager中block的实际存储是由MemoryStore和DiskStore来实现的,根据Block要求的存储级别StorageLevel来决定是存储在内存还是磁盘,以及是序列化存储还是非序列化存储。MemoryStore和DiskStore是在BlockManager中初始化的。
// BlockManager.scala
// Actual storage of where blocks are kept
private[spark] val memoryStore =
new MemoryStore(conf, blockInfoManager, serializerManager, memoryManager, this)
private[spark] val diskStore = new DiskStore(conf, diskBlockManager, securityManager)
memoryManager.setMemoryStore(memoryStore)
内存存储MemoryStore
MemoryStore负责将没有序列化的Java对象数组或者序列化的ByteBuffer存储到内存中。如果block的存储同时支持内存和磁盘存储,则优先存储到MemoryStore中,内存不够时再存储到DiskStore。
内存主要由堆内内存和堆外内存构成,其中堆外内存只能存储序列化后的值。MemoryStore中主要的成员是entries(即LinkedHashMap[BlockId, MemoryEntry]),用来保存块存储的映射。所有块的添加、获取和删除等操作,都是基于该映射结构实现的,因此对其所有的操作都需要加同步语义。
// Note: all changes to memory al