【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》
相关文章推荐
- 大数据学习篇:hadoop深入浅出系列之HDFS(二)——HDFS体系结构
- 菜鸟的Hadoop学习之路系列<二>:Hadoop集群构成和HDFS
- Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门
- Hadoop HDFS源码学习笔记(五)
- 1.zookeeper原理解析-数据存储之Zookeeper内存结构(zookeeper系列文章)
- Zookeeper系列(十五)Zookeeper原理解析之数据存储之Zookeeper内存结构
- hadoop源码解析之hdfs内部结构分析
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- JDK源码学习之HashMap (一) : 底层存储结构分析
- Hadoop学习日志之HDFS的主从结构
- Hadoop HDFS源码学习笔记(二)
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- Hadoop HDFS概念学习系列之Apache Hadoop hdfs源码分析(二十四)
- 【Hadoop入门学习系列之二】HDFS架构和编程
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- oracle学习入门系列之五内存结构、数据库结构、进程
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- Hadoop2.6.0学习笔记(九)文件的存储结构
- 5. oracle学习入门系列之五 内存结构、数据库结构、进程