HDFS冷热存储
《HDFS冷热存储》,Hadoop3.x支持HDFS目录级别配置异构存储,不同路径制定不同的存储策略。
一、Hadoop3.x支持的存储类型有以下几种
存储类型 | 说明 |
---|---|
RAM_DISK | 内存镜像文件系统 |
SSD | 固态硬盘 |
DISK | 普通磁盘(Hadoop默认存储类型) |
ARCHIVE | 没有特指哪种存储介质,主要指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增问题,一般用于归档 |
二、Hadoop3.x支持的存储策略有以下几种
策略ID | 策略名称 | 副本分布 | 解释说明 |
---|---|---|---|
15 | Lazy_Persist | RAM_DISK: 1, DISK: n-1 | 一个副本保存在内存中,其余副本保存在磁盘上 |
12 | ALL_SSD | SSD: n | 所有副本保存在固态硬盘上 |
10 | One_SSD | SSD: 1, DISK: n – 1 | 一个副本保存在固态硬盘,其余副本保存在磁盘上 |
7 | Hot(default) | DISK: n | 所有副本保存在磁盘上 |
5 | Warm | DISK: 1, ARCHIVE: n – 1 | 一个副本保存在磁盘,其余副本保存在归档存储上 |
2 | Cold | ARCHIVE: n | 所有副本都保存在归档存储上 |
三、存储策略常用shell操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 查看当前有哪些存储策略可以用 hdfs storagepolicies -listPolicies # 为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx # 获取指定路径(数据存储目录或文件)的存储策略 hdfs storagepolicies -getStoragePolicy -path xxx # 取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT hdfs storagepolicies -unsetStoragePolicy -path xxx # 查看文件块的分布。该命令可看到指定路径下的每个一个文件块存储在哪台机器上,以及每个块的存储介质是什么 hdfs fsck xxx -files -blocks -locations # 查看集群节点 hadoop dfsadmin -report |
四、存储类型配置
需要在hdfs-site.xml文件中声明哪些目录是DISK、哪些目录是SSD,哪些目录是内存。另外在生产环境中每台DataNode的存储介质可能不尽相同,所以每台节点的hdfs-site.xml文件配置的内容可能不一样。
1 2 3 4 5 6 7 8 9 10 11 |
<!-- 开启hdfs的存储策略 --> <property> <name>dfs.storage.policy.enabled</name> <value>true</value> </property> <!-- 配置每种存储介质的路径,并在开头用[]进行声明存储介质名称 --> <property> <name>dfs.datanode.data.dir</name> <value>[SSD]file:///opt/module/hadoop-3.1.3/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/ram_disk,DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk,[ARCHIVE]file:///opt/module/hadoop-3.1.3/hdfsdata/archive</value> </property> <!-- 修改完需要重启集群才生效 --> |
五、存储策略示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 准备一个文件并上传到hdfs测试路径,这里假设测试路径为/storagetest hadoop fs -put /tmp/notice.txt /storagetest # 在未设置存储策略的情况下,默认使用HOT存储策略,可通过如下命令查看该路径下的存储策略是什么 hdfs storagepolicies -getStoragePolicy -path /storagetest # 查看上传的文件块分布 hdfs fsck /hdfsdata-files -blocks -locations # Result:所有的块都在磁盘上 ------------------------------------------------- # 修改/storagetest目录下的存储策略为warm hdfs storagepolicies -setStoragePolicy -path /storagetest -policy WARM # 使用mover命令触发数据块按照刚才配置的策略移动 hdfs mover /storagetest # Result:再次查看文件块分布可以看到文件块只有一个在磁盘上,另一个再archive上 ------------------------------------------------- # 其他存储策略直接改变policy参数的值,mover触发数据块移动即可 hdfs storagepolicies -setStoragePolicy -path /storagetest -policy COLD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist |
六、注意事项
如果存储策略为LAZY_PERSIST时,文件块副本都存储在DISK上,而不是有一个在内存中,原因有如下两点:
- 当客户端所在的DataNode节点没有RAM_DISK时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。
- 当客户端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”参数值未设置或者设置过小(小于“dfs.block.size”参数值)时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。
总体上HDFS冷热异构存储的价值在于,根据数据热度采用不同策略从而提升集群整体资源使用效率。对于频繁访问的数据,将其全部或部分保存在更高访问性能的存储介质(内存或SSD)上,提升其读写性能;对于几乎不会访问的数据,保存在归档存储介质上,降低其存储成本。