当前位置: 移动技术网 > 科技>人工智能>云计算 > 一图学习HDFS源码结构系列——内存存储Lazypersist

一图学习HDFS源码结构系列——内存存储Lazypersist

2018年03月12日  | 移动技术网科技  | 我要评论

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

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

Lazy persist

从三个方面理解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

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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网