一图学习HDFS源码结构系列——内存存储Lazypersist
【Hadoop】一图学习HDFS源码结构系列——内存存储Lazypersist
最近在学习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
异步持久化线程服务,针对每一个磁盘块设置一个对应的线程池,这是真正从内存写到磁盘的过程。
下一篇: 脱脂奶粉怎么做酸奶?方法简单又容易