HDFS异构存储机制研究
一、HDFS中存储介质分类(StoragType类中有相关定义)
- RAM_DISK(内存)
- SSD(固态硬盘)
- DISK(普通硬盘,在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK)
- ARCHIVE(没有特指哪种存储介质,主要的指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题)
二、HDFS异构存储的存储策略
(1)存储策略种类
- Lazy_persist:一个副本保存在内存RAM_DISK中,其余副本保存在磁盘中
- ALL_SSD:所有副本都保存在SSD中
- One_SSD:一个副本保存在SSD中,其余副本保存在磁盘中
- Hot:所有副本保存在磁盘中,这也是默认的存储策略
- Warm:一个副本保存在磁盘上,其余副本保存在归档存储上
- Cold:所有副本都保存在归档存储上
(2)存储策略相关shell命令
- hdfs dfsadmin -setStoragePolicy
创建文件或目录时,其存储策略未指定,可以使用该命令指定存储策略。 - hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
为指定路径(数据存储目录)设置指定的存储策略 - hdfs storagepolicies -getStoragePolicy -path xxx
获取指定路径(数据存储目录或文件)的存储策略 - hdfs storagepolicies -unsetStoragePolicy -path xxx
取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT
三、HDFS异构存储的原理
- DataNode通过心跳汇报自身数据存储目录的StorageType给NameNode(数据存储目录的解析/心跳汇报过程)
- 随后NameNode进行汇总并更新集群内各个节点的存储类型情况
- 待存储文件根据自身设定的存储策略信息向NameNode请求拥有此类型存储介质的DataNode作为候选节点
四、HDFS异构存储流程
HDFS异构存储过程调用的流程图
1、数据存储目录解析流程
- FsDatasetImpl类的构造方法FsDatasetImpl(DataNode, DataStorage,Configuration)实现数据目录解析的功能,该方法调用DataNode类的getStorageLocation方法实现此功能
- DataNode类的getStorageLocation方法中调用StorageLocation类的parse方法
- StorageLocation类的parse方法采用正则匹配的方式将数据存储目录对应的字符串解析成StorageLocation对象
- FsDatasetImpl类的addVolume方法将数据存储目录标识符和数据存储目录对应的DataNodeStorage实例加入storageMap
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl下FsDatasetImpl类的构造方法——实现数据目录解析的功能
FsDatasetImpl(DataNode datanode, DataStorage storage, Configuration conf
) throws IOException {
......
String[] dataDirs = conf.getTrimmedStrings(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY);
Collection<StorageLocation> dataLocations = DataNode.getStorageLocations(conf);
List<VolumeFailureInfo> volumeFailureInfos = getInitialVolumeFailureInfos(
dataLocations, storage);
......
storageMap = new ConcurrentHashMap<String, DatanodeStorage>();
volumeMap = new ReplicaMap(this);
ramD