HDFS异构存储的解析与测试
https://cloud.tencent.com/developer/article/1005577
看到这篇帖子,就做了一些测试,希望有帮助。
第1章 概述
1.1 引言
HDFS作为一个分布式文件存储系统,用于存储文件,通过目录树来定位文件,由很多服务器联合起来实现其存储的功能,那么当服务器存储介质不同,就可以造成HDFS的读写性能的不同,存储性能也会造成差异,总结来说就是HDFS的异构存储。
1.2 异构存储的背景
Hadoop从2.4版本后开始支持异构存储,异构存储是为了解决爆炸式的存储容量增长以及计算能力增长所带来的数据存储需求。如果假定一份数据最开始被认定是一份热数据,在经历计算从而产生出新数据,那么这份原始的热数据很有可能转变为冷数据。随着数据不断增长差异化存储变得非常迫切,需要经常被计算或者读取的热数据为了保证性能需要存储在告诉存储设备上,当一些数据变为冷数据后不经常会用到的数据会变为归档数据,可以使用大容量性能要差一些的存储设备来存储来减少存储成本,HDFS可以按照一定的规则来存储这些数据。
1.3 异构存储的定义
归档存储是一种将不断增长的存储容量与计算容量分离开来的解决方案。密度更高、存储成本更低、计算能力更低的节点正在成为可用的,可以在集群中用作冷存储。根据策略,可以将热数据移到冷数据。增加节点到冷存储中可以增加不依赖于集群计算容量的存储容量。
异构存储和归档存储提供的框架对HDFS体系结构进行了概括,使其包含了SSD、内存等其他类型的存储介质。用户可以选择将数据存储在SSD或内存中以获得更好的性能。
1.4 发展
第一阶段的异构,将datanode的存储模型从一个可能对应多个物理存储介质的单个存储,转变为一个存储集合,每个存储对应一个物理存储介质。它还添加了存储类型、磁盘和SSD的概念,其中磁盘是默认的存储类型。
之后,为了支持归档存储,增加了一种新的存储类型ARCHIVE,它具有很高的存储密度(PB级存储),但计算能力很小,一般用于归档存储应用率很低的数据;还添加了另一种新的存储类型RAM_DISK,以支持在内存中写入单个复制文件。
第2章 存储类型和存储策略
2.1 关于存储类型
RAM_DISK:(内存镜像文件系统)
SSD:(SSD固态硬盘)
DISK:(普通磁盘,在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK)
ARCHIVE:(没有特指哪种存储介质,主要的指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题,一般用于归档)
2.2 关于存储策略
策略ID | 策略名称 | 块分布 | creationFallbacks | replicationFallbacks |
15 | LAZY_PERSIST | RAM_DISK:1,DISK:n-1 | DISK | DISK |
12 | ALL_SSD | SSD:n | DISK | DISK |
10 | ONE_SSD | SSD:1,DISK:n-1 | SSD,DISK | SSD,DISK |
7 | HOT(default) | DISK:n | <none> | ARCHIVE |
5 | WARM | DSIK:1,ARCHIVE:n-1 | ARCHIVE,DISK | ARCHIVE,DISK |
2 | COLD | ARCHIVE:n | <none> | <none> |
解析:
LAZY_PERSIST:一个副本保存在内存RAM_DISK中,其余副本保存在磁盘中。
ALL_SSD:所有副本都保存在SSD中。
ONE_SSD:一个副本保存在SSD中,其余副本保存在磁盘中。
HOT:所有副本保存在磁盘中,这也是默认的存储策略。
WARM:一个副本保存在磁盘上,其余副本保存在归档存储上。
COLD:所有副本都保存在归档存储上。
更正式的说,存储策略由以下字段组成:
(1)Policy ID(例:7)
(2)Policy name(例:HOT)
(3)A list of storage type types for block placement(例:DISK)
(4)A list of fallback storage types for file creation(creationFallbacks)
(5)A list of fallback storage types for replication(replicationFallbacks)
当有足够的空间时,块副本将根据#3中指定的存储类型列表进行存储。当#3中的某些存储类型快要用完空间时,在#4和#5中指定的回退存储类型列表分别用来替换文件创建和复制的空间不足以存储类型。
存储策略名称分别从LAZY_PERSIST到COLD,分别代表了设备的访问速度从快到慢,访问速度最快的为内存文件系统,其次是SSD,再是普通盘,最后是归档性存储,我们可以利用上面的策略来控制数据的分布以达到降低成本的目的。
creationFallbacks //对于第一个创建的block块的fallback情况时的可选存储类型
replicationFallbacks //对于block块的其余副本的fallback情况时的可选存储类型,这里出现了fallback的情况,什么叫做fallback的情况呢?当前存储类型不可用的时候,退一级所选择使用的存储类型。
2.3 存储策略相关shell命令
1)查看当前有哪些存储策略可以用
bin/hdfs storagepolicies -listPolicies
2)创建文件或目录时,其存储策略未指定,可以使用该命令指定存储策略。
bin/hdfs dfsadmin -setStoragePolicy
3)为指定路径(数据存储目录)设置指定的存储策略
bin/hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
4)获取指定路径(数据存储目录或文件)的存储策略
bin/hdfs storagepolicies -getStoragePolicy -path xxx
5)取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT
bin/hdfs storagepolicies -unsetStoragePolicy -path xxx
6)查看文件块的分布
bin/hdfs fsck xxx -files -blocks -locations
7)开启负载均衡
bin/start-balancer.sh
8)查看集群节点
bin/hadoop dfsadmin -report
2.4 HDFS异构存储的原理
DataNode通过心跳汇报自身数据存储目录的StorageType给NameNode(数据存储目录的解析/心跳汇报过程);
随后NameNode进行汇总并更新集群内各个节点的存储类型情况;
待存储文件根据自身设定的存储策略信息向NameNode请求拥有此类型存储介质的DataNode作为候选节点。
第3章 测试环境
3.1 测试环境描述
服务器配置:内存、CPU核数、磁盘
服务器规模:5台
框架版本:Hadoop3.1.3、Centos7.5、JDK1.8
集群配置:副本数为2,创建好带有存储类型的目录(提前创建)
3.2 配置文件信息
我们采取如下的节点存储类型分配:
节点 | 存储类型分配 |
hadoop102:192.168.24.102 | RAM_DISK,SSD |
hadoop103:192.168.24.103 | SSD,DISK |
hadoop104:192.168.24.104 | DISK,RAM_DISK |
hadoop105:192.168.24.105 | ARCHIVE |
hadoop106:192.168.24.106 | ARCHIVE |
配置信息:
dfs.storage.policy.enabled //用于启用、禁用存储策略特性,默认为true。
dfs.datanode.data.dir //在每个数据节点上,应该用都好分隔的存储位置标记它们的存储类型。这允许存储策略根据策略将块放置在不同的存储类型上。
为hadoop102节点的hdfs-site.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/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hdfsdata/ram_disk</value>
</property>
为hadoop103节点的hdfs-site.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/hdfsdata/ssd,[DISK]file:///opt/module/hdfsdata/disk</value>
</property>
为hadoop104节点的hdfs-site.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>[RAM_DISK]file:///opt/module/hdfsdata/ram_disk,[DISK]file:///opt/module/hdfsdata/disk</value>
</property>
为hadoop105节点的hdfs-site.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>[ARCHIVE]file:///opt/module/hdfsdata/archive</value>
</property>
为hadoop106节点的hdfs-site.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>[ARCHIVE]file:///opt/module/hdfsdata/archive</value>
</property>
第4章 存储策略测试
首先我们打开集群。
(1)并在hdfs上创建文件目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /hdfsdata
(2)并将文件资料上传
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put /opt/module/hdfsdata/atguigu.txt.gz /hdfsdata
4.1 HOT存储策略
(1)最开始我们未设置存储策略的情况下,我们获取该目录的存储策略
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs storagepolicies -getStoragePolicy -path /hdfsdata
The storage policy of /hdfsdata is unspecified
(2)我们查看上传的文件块分布
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
虽然显示存储策略未标识,但是我们可以看到文件都存储在130,104节点的DISK下。由此可知,我们的默认存储策略为HOT。
4.2 WARM存储策略
(1)接下来我们为数据降温
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
Set storage policy WARM on /hdfsdata
(2)再次查看文件块分布,我们可以看到文件块依然放在原处。
(3)我们需要让他hdfs按照存储策略自行移动文件块
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
由过程我们可以得知,文件块正在由DISK转向ARCHIVE
(4)移动完成
(5)再次查看文件块分布,
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
我们可以看到,文件块的存储,一半在DISK,一半在ARCHIVE,符合我们设置的WARM策略
4.3 COLD策略
(1)我们继续将数据降温为cold
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD
Set storage policy COLD on /hdfsdata
注:这里我们要注意,当我们将目录设置为COLD并且我们未配置ARCHIVE存储目录的情况下,不可以向该目录直接上传文件,会报出异常。
(2)移动文件块,我们可以观察到文件块正在由DISK转向ARCHIVE。
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)检查文件块的分布
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
我们可以看到,所有文件块都在ARCHIVE,符合COLD存储策略。
4.4 ONE_SSD策略
(1)接下来我们将存储策略从默认的HOT更改为One_SSD
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD
Set storage policy One_SSD on /hdfsdata
(2)移动文件块,从过程可以看到,部分文件块已经从DISK转向SSD
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)转移完成后,我们查看文件块分布,我们可以看到文件块分布为一半在SSD,一半在DISK,符合One_SSD存储策略。
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
4.5 ALL_SSD策略
(1)接下来,我们再将存储策略更改为All_SSD
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD
Set storage policy All_SSD on /hdfsdata
(2)并移动文件块,可看到文件块继续从DISK移动SSD(之前配置为One_SSD,已经移动一次了)
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)查看文件块分布,我们可以看到,所有的文件块都存储在SSD
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
4.6 LAZY_PERSIST策略
(1)继续改变策略,将存储策略改为lazy_persist
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist
Set storage policy lazy_persist on /hdfsdata
(2)移动文件块,可以看到过程
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs mover /hdfsdata
(3)查看文件块分布
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs fsck /hdfsdata -files -blocks -locations
这里我们发现所有的文件块都是存储在DISK,按照理论一个副本存储在RAM_DISK,其他副本存储在DISK中,这是因为,我们还需要配置“dfs.datanode.max.locked.memory”,“dfs.block.size”参数。
那么出现存储策略为LAZY_PERSIST时,文件块副本都存储在DISK上的原因有如下两点:
- 当客户端所在的DataNode节点没有RAM_DISK时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。
- 当客户端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”参数值未设置或者设置过小(小于“dfs.block.size”参数值)时,则会写入客户端所在的DataNode节点的DISK磁盘,其余副本会写入其他节点的DISK磁盘。
但是由于虚拟机的”max locked memory”为64KB,所以,如果参数配置过大,还会报出错误:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.lang.RuntimeException: Cannot start datanode because the configured max locked memory size (dfs.datanode.max.locked.memory) of 209715200 bytes is more than the datanode's available RLIMIT_MEMLOCK ulimit of 65536 bytes.
我们可以通过该命令查询此参数的内存
[atguigu@hadoop102 hadoop-3.1.3]$ ulimit -a
第5章 测试总结
由上述测试,我们可得知,HDFS的异构存储策略,默认存储策略为HOT,将数据存储在DISK上,当我们需要一定的计算效率时,我们可以将数据改存放在SSD或者RAM_DISK上面,但是需要我们注意的就是内存中会有发生数据丢失的可能性;但是对比以下,应用程序可以选择使用LAZY_PERSIST以牺牲一些持久性保证换取更低的延迟。
并且HDFS异构存储使得HDFS在实际生产的应用中,显得更加灵活,做到根据数据的实用性进行存储,提高存储资料的利用率。