我们在安装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种存储类型:
- DISK:表示普通磁盘(机械磁盘)
- SSD:表示固态硬盘
- RAM_DISK:表示内存硬盘,参考虚拟内存盘,说白了就是
内存
- 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: BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]} BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]} BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} BlockStoragePolicy{ONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]} BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]} BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
我们分别来解释上面HDFS支持的六种存储策略:
COLD
BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}
这个存储策略的名称是COLD
,策略ID是2
,存储类型是ARCHIVE
。这种存储策略是用于存储冷数据,也就是很少会使用的归档数据可以设置为这个存储策略。
creationFallbacks:这个是指当创建数据块的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型
replicationFallbacks:这个是当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型
对于COLD的存储策略,所有的数据都存储在ARCHIVE
存储类型对应的存储位置上,数据块创建或者复制的时候都没有备选的存储类型
WARM
BlockStoragePolicy{WARM: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
BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
这个存储策略的名称是HOT
,策略ID是7
,存储类型是DISK
。**热(其实就是经常会使用)**的数据可以设置这个存储策略。设置为这个存储策略的时候,如果数据块的备份数是n
的话,那么,不管是新建的数据块还是复制的数据块的数据都存储在DISK
类型中对应的存储位置上
在这种存储策略下:
当创建数据块的时候,没有备选存储类型
当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是ARCHIVE
ONE_SSD
BlockStoragePolicy{ONE_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
BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
这个存储策略的名称是ALL_SSD
,策略ID是12
,存储类型是SSD
。设置为这个存储策略的时候,如果数据块的备份数是n
的话,那么,不管是新建的还是复制的n
个数据块都存储在SSD
类型对应的位置上
在这种存储策略下:
当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK
当数据块复制的时候,如果当前存储策略指定的存储类型的空间不足的时候的备选存储类型是DISK
LAZY_PERSIST
BlockStoragePolicy{LAZY_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支持六种数据存储策略,分别是:
- COLD
- WARM
- HOT
- ONE_SSD
- ALL_SSD
- 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个备份) | creationFallbacks | replicationFallbacks |
---|---|---|---|---|
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.enabled
为true
,当然,这个配置默认的值是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: BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
可以看出,路径/user/hadoop-twq/cmd
确实被设置为HOT
的存储策略