BlockManager
Storagef模块主要分为两层:
1):负责向BlockManagerMaster上报blaock信息,master与slave之间的信息传递通 过m-s的模式传递
2):数据层 负责存储和读取信息,主要在disk、memory、tachyon上
通常RDD的数据存放在分区中,而cache的数据一般都是block中。所以BlockManager管理着所有的Block。
BlockManeger的构造成员:
初始化方法,有两个类容:1、注册BlockManagerMaster,2、启动BlockManagerWorker
Register BlockManger
注册BlockManager就是发送一个单向消息给Master Actor。而这个消息参数则是一个RegisterBlockManager对象,实例化这个对象需要设置几个属性:id, maxMemSize, slaveActor
这里需要查看tell方法。源码如下:
Akka是一个基于scala编写的分布式消息驱动框架。消息发送完后,BlockManagerMasterActor会接收处理消息。BlockManagerMasterActor是Master节点上的Actor来跟踪所有的Slave的Block的状态。接收注册的代码如下:
这里主要查看register方法:
以上代码描述了Storage在通讯层处理代码。
Stroage
Spark在存储上主要提供了三种方案:
MemoryStore
基于内存的存储有两种一种是基于反序列化java对象数组和列化的ByteBuffers。在MemoyStore中维护了一个LinkedHashMap对象,它是以blockID和MemoryEntry的K/V存储。
private valentries = new LinkedHashMap[BlockId, MemoryEntry](32, 0.75f, true)
存储方法主要包括两种putBytes、putArray。在具体存储的时候需要根据StorageLevel的序列化属性deserialized,对数据做不同的操作。当内存不够的时候,默认是写磁盘的。具体看下这两个方法:
首先看下putIterator方法:
这里不再一一介绍方法,下面看下读取主要方法:getBytes、getValues
读取Block主要传递blockId就行了。
DiskStore
将block存储到磁盘上。和MemoryStroe一样写入和读取都有两种方法putBytes、putArray。源码如下:
TachyonStroe
Tachyon是一个基于内存的分布式存储框架。这里的存储到Tachyon和MemoryStroe一样都有两种方法。
这里主要看putIntoTachyonStore方法
RDD API
在Shuffle过程中,为保持数据容错或者结构数据再次利用。RDD提供了cache、persist来存储数据,在源码中可以看出其实cache就是调用了persist。
StorageLevel
StotageLevel标志着Spark Storage的存储级别。它的存储介质主要包括Disk、Memory、OffHeap。另外还有deserialized标志数据序列化操作和replication副本数。在源码中默认为1个。下面从源码中阅读StorageLevel。
CheckPoint
一般在程序运行比较长或者计算量大的情况下,需要进行CheckPoint。这样可以避免在运行中出现异常导致代价过大的问题。CheckPoint会把数据写在本地磁盘上。在进行checkpoint前的RDD数据需要进行cache。因为checkpoint的时候会移除它的所有父节点信息,那麽在第二次加载的时候就不需要重新从磁盘加载数据。