从Hadoop 2.6开始支持异构存储,主要涉及两个概念:存储类型和存储策略。
存储类型
存储类型表示数据节点支持的多种物理存储介质的类型,有如下几类:
* RAM_DISK(transient)
* SSD
* DISK(default)
* ARCHIVE
列表中的前三个都比较好理解,分别对应内存、SSD和机械磁盘,其中内存一般指的是虚拟磁盘(tmpfs,ramfs)。对于ARCHIVE,官方文档的说法是“which has high storage density (petabyte of storage) but little compute power, is added for supporting archival storage”,我个人的理解是ARCHIVE并不特指某种存储介质,只要是满足高密度存储的都可以,比如位于低性能大存储服务器上的磁盘(见过一种方案,DISK用小容量SAS盘,ARCHIVE用大容量SATA盘)。
按照RAM_DISK->SSD->DISK->ARCHIVE的顺序,存取速度由快到慢,单bit存储成本由高到低。
通过datanode角色的配置项dfs.datanode.data.dir可以配置存储介质的位置和类型,比如:
<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>
</property>
其中多个dir用逗号分隔,每个路径由类型标签(如[DISK])和物理路径组成,HDFS通过该配置感知底层存储的位置和类型。
存储策略
某个文件的存储策略用来决定它的数据块将会被存放在什么类型的存储介质上。通过为文件指定存储策略,可以回答以下问题:
* 当HDFS创建或者复制一个文件,它的数据块及其副本都将保存在什么类型的介质上?
* 如果没有找到指定类型的介质或者指定类型的介质空间不够了,怎么处理?
Hadoop 2.8.0版本支持6种存储策略:
按照All_SSD->One_SSD->Hot->Warm->Cold的顺序,面向的数据“越来越冷”,可以根据数据的冷热程度选择合理的策略。Lazy_Persist比较特殊,如果一个文件的存储策略被指定为Lazy_Persist,在写入时会先写入内存,再异步地写入磁盘,官方文档中提到“Applications can choose to use Lazy Persist Writes to trade off some durability guarantees in favor of reduced latency.”,即主要用来降低小数据量的写入延迟,代价是在某些情况下会有数据丢失。在上表中,前两列分别是策略编号和策略名;第三列表示在有n个副本的情况下,各个副本都会被存放在什么类型的存储上;第四列表示在创建文件(写入第一个副本)时第三列指定的存储无法满足要求时备选的存储类型;第五列表示在生成副本时第三列指定的存储无法满足要求时备选的存储类型。以One_SSD策略为例,正常情况一个副本放在有SSD标签的存储上,其他副本放在DISK标签的存储上,在正常情况无法得到满足的情况下,副本可能会被“强制”放在SSD或者DISK上。
与存储策略相关的配置项为:dfs.storage.policy.enabled,默认为true,即默认支持存储策略。
与存储策略相关的命令和操作:
- 列出当前版本支持的存储策略:
hdfs storagepolicies -listPolicies
- 为执行路径设置指定策略:
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
- 取消策略:
hdfs storagepolicies -unsetStoragePolicy -path <path>
- 获取指定路径的策略:
hdfs storagepolicies -getStoragePolicy -path <path>
HDFS Mover
在修改了文件的存储策略后,目前的HDFS(Hadoop 2.8.0)不支持自动调整文件的数据块副本到正确类型的存储上,需要使用一个专门的工具Mover。用法如下:
hdfs mover [-p <files/dirs> | -f <local file name>]
-p 指定要迁移的文件/目录(以空格分隔)
-f 指定一个本地文件路径,该文件包含需要迁移的文件或者目录列表
登录 | 立即注册