您的位置:首页 > 运维架构

【Hadoop】一图学习HDFS源码结构系列——内存存储Lazy persist

2018-03-11 23:02 357 查看

【Hadoop】一图学习HDFS源码结构系列——内存存储Lazy persist

最近在学习HDFS的源码,源码规模本身比较大,学了也容易忘记,于是对于每一个小部分的功能都用Visio整理了一结构图,方便以后有用时使用



从三个方面理解Lazy persist功能

异步持久化算法

我们知道,内存空间一定是有限的,而且掉电会丢失,不可能把所有的数据都存放到内存里面,所以HDFS会不断地把存放在内存里的数据进行持久化,保存到永久磁盘里。那么这里就涉及数据块的选择算法了,HDFS的做法是在内存存储新数据的同时,持久化距离当前时刻最远(存储时间最早)的数据。

设置内存存储

设置内存存储有3中方法

1. 在命令行中设置:命令行 hdfs storagepolicies -setStoragePolicy -path -policy LAZY_PERSIST

2. create文件方法,带上参数CreateFlag.LAZY_PERSIST,其调用过程,可看DFSClint#Create with CreateFlag

3. 调用FileSystem的setStoragePolicy方法,如: fs.setStoragePolicy(path, “LAZY_PERSIST”);

LAZY_PERSIST内存存储的代码实现

最后一部分也是想说的最复杂的一部分

这部分的功能实现主要涉及一个结构体:FsDatasetImpl,它是一个管理DataNode所有磁盘读写的管家

而这个结构体下面包括了如下三个实体对象:

* RamDiskReplicaLruTracker, 副本块跟踪类,此类中维护了所有已持久化、未持久化的副本以及总副本数据信息

* LazyWriter,此线程会不断地从数据块列表中取出数据块,将数据块加入到异步持久化线程池

* RamDiskAsyncLazyPersistService,异步持久化线程服务,针对每一个磁盘块设置一个对应的线程池

三者的关系请看图的右上角部分

下面逐个进行解析

RamDiskReplicaLruTracker

该结构体维护了三个对象

* replicaMapsblockpool,Id对副本信息的映射图

* replicaMaps,blockpool Id对副本信息的映射图

* replicasPersisted,已持久化写入磁盘的映射图

LazyWriter

此线程会不断地从数据块列表中取出数据块,将数据块加入到异步持久化线程池,就是一个run方法,不断地从RamDiskReplicaLruTracker中取出待持久化的块,提交写入磁盘的命令

RamDiskAsyncLazyPersistService

异步持久化线程服务,针对每一个磁盘块设置一个对应的线程池,这是真正从内存写到磁盘的过程。

参考:《深度剖析Hadoop HDFS》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: