Spark源码走读5——Storage

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的时候会移除它的所有父节点信息,那麽在第二次加载的时候就不需要重新从磁盘加载数据。


posted on 2015-02-01 11:57  Spark_莫然  阅读(313)  评论(0编辑  收藏  举报