文章目录
(157)异构存储概述
概述
异构存储,也叫做冷热数据分离。其中,经常使用的数据被叫做是热数据,不经常使用的数据被叫做冷数据。
把冷热数据,分别存储在不同的存储介质里,从而达到对每个介质的利用率最高,从而实现整体最佳性能,或者说性价比更高(比如说高性能硬盘放经常使用的数据)。
简单的说,就是这么一个问题:经常使用的数据、不经常使用的数据,是分别放在固态硬盘里更好,还是放在机械硬盘里更好,亦或者是放在内存里更好?
一般来讲,集群里会有这么几种存储类型:
- RAM_DISK:内存镜像文件系统;
- SSD:SSD固态硬盘;
- DISK:普通磁盘。在HDFS中,如果没有主动声明,那么数据目录存储类型默认都是DISK;
- ARCHIVE:没有特指哪种存储介质,主要是指计算能力弱而存储密度比较高的存储介质,用来解决数据量的容量扩增问题,一般用于归档;
关于存储策略:
注意, 默认存储策略是HOT策略 ,即所有副本都保存在磁盘里。
访问速度最快的是Lazy_persist策略,一个副本保存在内存中,其它副本保存在磁盘中。
异构存储的shell操作
(1)查看当前有哪些存储策略可以用
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -listPolicies
(2)为指定路径(数据存储目录)设置指定的存储策略
hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
(3)获取指定路径(数据存储目录或文件)的存储策略
hdfs storagepolicies -getStoragePolicy -path xxx
(4)取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT
hdfs storagepolicies -unsetStoragePolicy -path xxx
(5)查看某个路径下的文件块的分布
bin/hdfs fsck <path> -files -blocks -locations
(6)查看集群节点
hadoop dfsadmin -report
可以看到,跟纠删码一样,异构存储针对的对象,也是某一个路径。
(158)异构存储案例实操
这块在教程里比较长,都是实验各种存储策略的代码,所以只挑选个人感兴趣的地方做简单记录,就不批量复制了,仅做了解即可。
关于集群如何识别自己的存储介质的类型?
是无法自动辨别的,需要在节点的hdfs-site.xml中手动指定,一个路径如果你指定了是SSD的话,那集群就认为它就是SSD。
举例,我要给一个节点,配置上SSD目录和RAM_DISK目录,就可以打开该节点上的hdfs-site.xml,添加或修改如下信息:
xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<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</value>
</property>
上面代码里,第一个property是设置副本数量为2,第二个property是设置异构存储策略为打开状态,最后一个property则是将两个路径分别指定成SSD目录和RAM_DISK目录。
教程里一共列举了5个节点,分别修改它们的hdfs-site.xml,做不同的存储类型分配,如下:
节点 | 存储类型分配 |
---|---|
hadoop102 | RAM_DISK,SSD |
hadoop103 | SSD,DISK |
hadoop104 | DISK,RAM_DISK |
hadoop105 | ARCHIVE |
hadoop106 | ARCHIVE |
我们在HDFS上创建一个新目录,然后上传一个新文件到目录里:
hadoop fs -mkdir /hdfsdata
hadoop fs -put /opt/module/hadoop-3.1.3/NOTICE.txt /hdfsdata
新建的目录默认是HOT存储策略,即所有副本都存储在DISK上,我们可以验证一下,即使用下面命令,查看上传的文件块分布:
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
[DatanodeInfoWithStorage[192.168.10.104:9866,DS-0b133854-7f9e-48df-939b-5ca6482c5afb,DISK], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]]
其实执行命令之后,打印出来的信息有很多,我们只展示了一小部分,从输出上可以看到,一个副本存储在了104的DISK目录下,另一个副本存储在了103的DISK目录下。
接下来,我们尝试将这个目录的存储策略修改为WARM策略,即一个副本在DISK上,其他副本在ARCHIVE上。
(1)首先,修改这个目录的存储策略修改为WARM策略
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
(2)再次查看文件块分布,我们可以看到文件块依然放在原处。
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
(3)我们需要让他HDFS按照存储策略自行移动文件块
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs mover /hdfsdata
(4)再次查看文件块分布,
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
[DatanodeInfoWithStorage[192.168.10.105:9866,DS-d46d08e1-80c6-4fca-b0a2-4a3dd7ec7459,ARCHIVE], DatanodeInfoWithStorage[192.168.10.103:9866,DS-ca1bd3b9-d9a5-4101-9f92-3da5f1baa28b,DISK]]
可以看到,执行了hdfs mover /hdfsdata
之后,在103的DISK目录里的那个副本没有变化,另一个副本移动到了105上的ARCHIVE目录里。
接下来,教程里按照上面的流程,依次测试了其他几种策略,基本流程和命令都是一样的,所以这里就不展示了。
唯一需要注意的,是LAZY_PERSIST策略,理论上执行了策略之后,会达到一个副本在RAM_DISK,即内存中,另一个副本在DISK中的效果。但实际中并不是。有两个原因:
一是在Hadoop的配置文件里,有一个dfs.datanode.max.locked.memory
,它控制了你往内存里存储副本数据的大小,这个参数默认是0,即不能往内存里存数据。
二是如果你用的是linux虚拟机的话,虚拟机也会限制你往内存中放数据的大小。
基于这两个原因,实际中的LAZY_PERSIST策略并不会生效。从而导致所有副本都被放进了DISK目录里。
如果实在想往内存里放副本,可以尝试将dfs.datanode.max.locked.memory
修改为文件块大小(默认128M)的倍数,但是生产中是不推荐的。毕竟放在内存里容易宕机丢失,后果还是蛮严重的。