欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-11-15 09:06:47
【Hadoop】一图学习HDFS源码结构系列——内存存储Lazypersist 最近在学习HDFS的源码,源码规模本身比较大,学了也容易忘记,于是对于每一个小部分的功...

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

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

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

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

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