1、HDFS的数据存储的意义

先有了数据的存储,才有后续的写入和管理等操作。HDFS的数据存储包括两块:一块是HDFS内存存储,另一块是HDFS异构存储。HDFS内存存储是一种十分特殊的存储方式,将会对集群数据的读写带来不小的性能提升,而HDFS异构存储则能帮助我们更加合理地把数据存到应该存的地方。

1-1、HDFS的内存存储

HDFS的内存存储是HDFS所有数据存储方式中比较特殊的一种,与之后将会提到的HDFS缓存有一些相同之处:都用机器的内存作为存储数据的载体。

不同之处在于:HDFS缓存需要用户主动设置目标待缓存的文件、目录,其间需要使用HDFS缓存管理命令。而HDFS内存存储策略:LAZY_PERSIST则直接将内存作为数据存放的载体,可以这么理解,此时节点的内存也充当了一块“磁盘”。只要将文件设置为内存存储方式,最终会将其存储在节点的内存中。

综合地看,HDFS缓存更像是改进用户使用的一种功能,而HDFS内存存储则是从底层扩展了HDFS的数据存储方式。

LAZY_PERSIST内存存储策略

hadoop hdfs 预留空间 hdfs如何存储数据_hadoop

上面描述的原理在图中的表示是第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并没有特指哪种存储介质,主要指的是高密度存储介质,用于解决数据扩容的问题。

存储速度情况如下图

hadoop hdfs 预留空间 hdfs如何存储数据_异构_02

异构存储的过程

hadoop hdfs 预留空间 hdfs如何存储数据_异构_03

异构存储的块存储策略

hadoop hdfs 预留空间 hdfs如何存储数据_hadoop_04

2、HDFS存储策略的使用

hdfs storagepolicies -help

hadoop hdfs 预留空间 hdfs如何存储数据_hadoop_05

[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》