HDFS的存储策略

Posted tesla-turing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的存储策略相关的知识,希望对你有一定的参考价值。

我们在安装HDFS的时候,我们在hdfs-site.xml配置过DataNode的数据存储的文件目录,如下:

<property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop-twq/bigdata/dfs/data</value>
    <description>DataNode存放数据的地方</description>
</property>

  目录/home/hadoop-twq/bigdata/dfs/data就是DataNode存放数据的地方,这个目录对应的存储介质就是普通的磁盘(DISK)。除了普通磁盘,存储介质其实还有固态硬盘(SSD)等。那么,在了解HDFS存储策略之前,我们先了解下HDFS支持的存储类型

存储类型

HDFS支持如下4种存储类型:

  1. DISK:表示普通磁盘(机械磁盘)
  2. SSD:表示固态硬盘
  3. RAM_DISK:表示内存硬盘,参考虚拟内存盘,说白了就是内存
  4. ARCHIVE:这个并不是特指某种存储介质,而是为了满足高密度存储而定义的一种存储类型,一般对于归档的、访问不怎么频繁的数据可以以 ARCHIVE 的形式存储。

以上四种的存储类型的存取的速度大小为:RAM_DISK->SSD->DISK->ARCHIVE。但是单bit存储成本由高到低

那么我们在配置DataNode的存储路径的时候,我们可以分别为上面四种存储类型配置存储位置,如下图:

 

<property>
    <name>dfs.datanode.data.dir</name>
    <value>[RAM_DISK]file:///ram_disk,[SSD]file:///ssd1/dn,[DISK]file:///disk1/dn,[ARCHIVE]file:///archive1/dn</value>
    <description>DataNode存放数据的地方</description>
</property>

 上面配置的DataNode的多个存储位置由逗号隔开,每一个存储位置由存储类型和存储物理路径组成。HDFS通过该配置感知底层存储的位置和类型

 

存储策略

 

上面介绍了HDFS的数据可以存储的存储类型,那么数据真实是存储在哪一中类型的存储介质中呢?这个就是HDFS存储策略需要解决的问题了。接下来,我们详细看下HDFS支持的存储策略

我们先在master机器上执行如下的命令,来查看HDFS支持的存储策略:

 

 

hdfs storagepolicies -listPolicies

  

返回结果如下:

 

Block Storage Policies:
	BlockStoragePolicyCOLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]
	BlockStoragePolicyWARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]
	BlockStoragePolicyHOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]
	BlockStoragePolicyONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]
	BlockStoragePolicyALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]
	BlockStoragePolicyLAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]

 

我们分别来解释上面HDFS支持的六种存储策略:

COLD

 

BlockStoragePolicyCOLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]

  

这个存储策略的名称是COLD,策略ID是2,存储类型是ARCHIVE。这种存储策略是用于存储冷数据,也就是很少会使用的归档数据可以设置为这个存储策略。

creationFallbacks:这个是指当创建数据块的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型

replicationFallbacks:这个是当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型

对于COLD的存储策略,所有的数据都存储在ARCHIVE存储类型对应的存储位置上,数据块创建或者复制的时候都没有备选的存储类型

 

WARM

 

BlockStoragePolicyWARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]

  

这个存储策略的名称是WARM,策略ID是5,存储类型是DISK, ARCHIVE半冷半热的数据可以设置这个存储策略。设置为这个存储策略的时候,如果数据块的备份数是n的话,那么,创建的第一个数据块的数据存储在DISK类型的存储目录中,其他复制的(n - 1)个数据块的数据存储在ARCHIVE类型的存储目录中。

在这种存储策略下:

当创建数据块的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK, ARCHIVE

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK, ARCHIVE

HOT

BlockStoragePolicyHOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]

  

这个存储策略的名称是HOT,策略ID是7,存储类型是DISK。**热(其实就是经常会使用)**的数据可以设置这个存储策略。设置为这个存储策略的时候,如果数据块的备份数是n的话,那么,不管是新建的数据块还是复制的数据块的数据都存储在DISK类型中对应的存储位置上

在这种存储策略下:

当创建数据块的时候,没有备选存储类型

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是ARCHIVE

 

ONE_SSD

BlockStoragePolicyONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]

  

 

这个存储策略的名称是ONE_SSD,策略ID是10,存储类型是SSD, DISK这个策略是HDFS的默认的数据存储策略

设置为这个存储策略的时候,如果数据块的备份数是n的话,那么,1个新建的数据块存储在SSD类型的对应的位置上,其他的(n - 1)个复制的数据块存储在DISK类型的对应的位置上。

在这种存储策略下:

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是SSD, DISK

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是SSD, DISK

ALL_SSD

BlockStoragePolicyALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]

  

这个存储策略的名称是ALL_SSD,策略ID是12,存储类型是SSD。设置为这个存储策略的时候,如果数据块的备份数是n的话,那么,不管是新建的还是复制的n个数据块都存储在SSD类型对应的位置上

在这种存储策略下:

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK

 

LAZY_PERSIST

BlockStoragePolicyLAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]

  

这个存储策略的名称是LAZY_PERSIST,策略ID是15,存储类型是RAM_DISK, DISK。设置为这个存储策略的时候,如果数据块的备份数是n的话,那么,1个新建的数据块存储在RAM_DISK类型的对应的位置上,其他的(n - 1)个复制的数据块存储在DISK类型的对应的位置上。

在这种存储策略下:

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK

当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK

总结

从上我们可以看出,HDFS支持六种数据存储策略,分别是:

  1. COLD
  2. WARM
  3. HOT
  4. ONE_SSD
  5. ALL_SSD
  6. LAZY_PERSIST

按照ALL_SSD -> ONE_SSD -> HOT -> WARM -> COLD的顺序,面向的数据是越来越

LAZY_PERSIST比较特殊,如果一个文件的存储策略被指定为LAZY_PERSIST,在写入时会先写入内存,再异步地写入磁盘,即主要用来降低小数据量的写入延迟,代价是在某些情况下会有数据丢失。

官方对LAZY_PERSIST的解释如下:

Applications can choose to use Lazy Persist Writes to trade off some durability guarantees in favor of reduced latency

最后,我们用一张图表来总结上面六种存储策略:

策略ID策略名称数据块放置情况(n个备份)creationFallbacksreplicationFallbacks
2 COLD ARCHIVE: n    
5 WARM DISK: 1, ARCHIVE: n-1 ARCHIVE, DISK ARCHIVE, DISK
7 HOT(默认策略) DISK: n   ARCHIVE
10 ONE_SSD SSD: 1, DISK: n-1 SSD, DISK SSD, DISK
12 ALL_SSD SSD: n DISK DISK
15 LAZY_PERSIST RAM_DISK: 1, DISK: n-1 DISK DISK

我们要开启HDFS的存储策略的功能的话,我们需要配置参数dfs.storage.policy.enabledtrue,当然,这个配置默认的值是true,即HDFS的默认是支持存储策略的。

存储策略的设置

 

我们可以先通过下面的命令来查看一个HDFS路径是否设置了存储策略:

hdfs storagepolicies -getStoragePolicy -path /user/hadoop-twq/cmd

  执行上面的命令的输出是:

The storage policy of /user/hadoop-twq/cmd is unspecified

  

说明这个路径没有设置存储路径,那么这个路劲就是用默认的存储策略,即HOT存储策略

我们可以通过下面的命令来为某个路径设置存储策略:

hdfs storagepolicies -setStoragePolicy -path /user/hadoop-twq/cmd -policy HOT

  执行上面的命令的输出是:

Set storage policy HOT on /user/hadoop-twq/cmd

  

说明文件路径/user/hadoop-twq/cmd的存储策略已经设置为HOT。我们可以再次使用下面的命令来查看这个路径的存储策略:

 

hdfs storagepolicies -getStoragePolicy -path /user/hadoop-twq/cmd

  这个时候的返回是:

The storage policy of /user/hadoop-twq/cmd:
BlockStoragePolicyHOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]

  可以看出,路径/user/hadoop-twq/cmd确实被设置为HOT的存储策略

以上是关于HDFS的存储策略的主要内容,如果未能解决你的问题,请参考以下文章

[hadoop3.x]HDFS存储类型和存储策略概述

[hadoop3.x]HDFS存储类型和存储策略概述

[hadoop3.x]HDFS存储类型和存储策略概述

Hadoop3 - HDFS 文件存储策略

Hadoop3 - HDFS 文件存储策略

Hadoop3 - HDFS 文件存储策略