HDFS:数据存储

Posted by danner on March 2, 2018
<深度剖析Hadoop HDFS=""> 读书摘要

HDFS 的数据存储包括两块:内存存储异构存储HDFS 内存储存是一种十分特殊的存储方式,将会对集群数据的读写带来不小的性能提升;而 HDFS 异构存储则能帮助我们更合理地把数据存到应该存的地方。

内存存储

内存存储是用机器的内存作为存储数据的载体,与之相同的是 HDFS 缓存;但不同之处在于缓存需要用户对待缓存的文件、目录设置管理命令(类似 Spark 内持久化数据),而 HDFS 内存存储是只需设置 LAZY_PERSIST 就可以直接将内存当作磁盘,操作上对用户透明

上图介绍了内存存储写文件流程,相比于其他不同之处在于第一步和第四-六步:

  • 对目标文件目录设置 StoragePolicyLAZY_PERSIST 的内存存储策略
  • 客户端进程向 NameNode 发起创建/写文件的请求
  • 客户端请求到具体的 DataNode 后,DataNode 会把这些数据块写入到 RAM 内存中,同时启动异步线程服务将内存数据持久化写到磁盘

由上可知,为了保证内存存储的可靠性,会将内存中的数据异步写到磁盘,这就是 LAZY_PERSIST 的由来。

内存存储流程分析分为三部分:策略设置、存储过程、内存存储使用

策略设置

设置文件的存储策略为 LAZY_PERSIST(默认是 StoragePolicy.DEFAULT 磁盘存储) ,有以下三种方式。

一:命令行方式

hdfs storagepolicies -setStoragePolicy -path -policy LAZY_ PERSIST

二:API 创建时设置策略

FSDataOutputStream fos = fileSystem.create(path,FsPermission.getFileDefault(),
    EnumSet.of(CreateFlag.CREATE , CreateFlag.LAZY_PERSIST),
    bufferLength,replicationFactor,blockSize,null);

以上两种最终都是调用 DFSClientcreate 方法。

三:2.8 版本之后

fs.setStoragePolicy(path,”LAZY_PERSIST”);

此版本没研究

存储过程

异构存储

参考资料