1、HDFS的数据存储的意义
先有了数据的存储,才有后续的写入和管理等操作。HDFS的数据存储包括两块:一块是HDFS内存存储,另一块是HDFS异构存储。HDFS内存存储是一种十分特殊的存储方式,将会对集群数据的读写带来不小的性能提升,而HDFS异构存储则能帮助我们更加合理地把数据存到应该存的地方。
1-1、HDFS的内存存储
HDFS的内存存储是HDFS所有数据存储方式中比较特殊的一种,与之后将会提到的HDFS缓存有一些相同之处:都用机器的内存作为存储数据的载体。
不同之处在于:HDFS缓存需要用户主动设置目标待缓存的文件、目录,其间需要使用HDFS缓存管理命令。而HDFS内存存储策略:LAZY_PERSIST则直接将内存作为数据存放的载体,可以这么理解,此时节点的内存也充当了一块“磁盘”。只要将文件设置为内存存储方式,最终会将其存储在节点的内存中。
综合地看,HDFS缓存更像是改进用户使用的一种功能,而HDFS内存存储则是从底层扩展了HDFS的数据存储方式。
LAZY_PERSIST内存存储策略
上面描述的原理在图中的表示是第4个步骤和第6个步骤。第4步写数据到内存中,第6步异步地将数据写到磁盘。
异步存储的大体步骤:
- 1)对目标文件目录设置StoragePolicy为LAZY_PERSIST的内存存储策略。
- 2)客户端进程向NameNode发起创建/写文件的请求。
- 3)客户端请求到具体的DataNode后DataNode会把这些数据块写入RAM内存中,同时启动异步线程服务将内存数据持久化写到磁盘上。内存的异步持久化存储是内存存储与其他介质存储不同的地方。这也是LAZY_PERSIST名称的源由,数据不是马上落盘,而是懒惰的、延时地进行处理。
1-2、HDFS异构存储
Hadoop在2.6.0版本中引入了一个新特性:异构存储。异构存储关键在于“异构”两个字。异构存储可以根据各个存储介质读写特性的不同发挥各自的优势。一个很适用的场景就是上节提到的冷热数据的存储。针对冷数据,采用容量大的、读写性能不高的存储介质存储,比如最普通的磁盘。而对于热数据而言,可以采用SSD的方式进行存储,这样就能保证高效的读性能,在速率上甚至能做到十倍或百倍于普通磁盘的读写速度。换句话说,HDFS异构存储特性的出现使得我们不需要搭建2套独立的集群来存放冷热2类数据,在一套集群内就能完成。所以这个功能还是有非常大的实用价值的。
异构存储类型以下是在HDFS中声明的StorageType:
- ·RAM_DISK
- ·SSD
- ·DISK
- ·ARCHIVE
HDFS中定义了这4种异构存储类型,SSD、DISK一看就知道是什么意思,这里看一下其余的两个。RAM_DISK其实就是内存,而ARCHIVE并没有特指哪种存储介质,主要指的是高密度存储介质,用于解决数据扩容的问题。
存储速度情况如下图
异构存储的过程
异构存储的块存储策略
2、HDFS存储策略的使用
hdfs storagepolicies -help
[listPolicies] //列出目前现有的存储策略
[setStoragePolicy -path <path> -policy <policy>] //对目标文件/目录设置存储策略
以下为此命令的必填参数:
<path> 需要设置存储策略的文件/目录路径
<policy> 对目标设置的存储策略
[getStoragePolicy -path <path>] //获取给定路径的存储策略
以下为此命令的必填参数:
<path> 需要获取存储策略的输入路径
在以上三大操作命令中,setStoragePolicy为设置命令,listPolicies和getStoragePolicy都是获取命令。最简单的使用方法是事先划分好冷热数据的存储目录,设置好对应的存储策略,后续使用相应的程序在对应分类目录下写数据,自动继承父目录的存储策略。在较新版的Hadoop发布版本中增加了数据迁移工具。此工具的重要用途在于它会扫描HDFS上的文件,判断文件是否满足其内部设置的存储策略;如果不满足,就会重新迁移数据到目标存储类型节点上。
使用方式如下:
$ hdfs mover help
Usage:hdfs mover [p <files/dirs> | f <localfile>] // hdfsmover数据迁移命令
p <files/dirs> //需要被迁移的HDFS文件/目录的路径
f <localfile> //需要被迁移的HDFS文件/目录对应的本地文件系统路径
其中一个参数针对HDFS的文件目录,另一个参数针对本地的文件。
HDFS异构存储功能的出现绝对是解决冷热数据存储问题的一把利器,希望通过本文内容的阐述能给大家带来全新的认识。
参考资料:《深度剖析Hadoop HDFS》