HDFS—存储优化
纠删码
纠删码原理
-
概述
HDFS默认情况下,一个文件有3个副本,这虽然提高了数据的可靠性,但也带来了2倍的冗余开销。Hadoop 3.x引入了纠删码机制,通过计算方法,可以节省大约50%的存储空间。
-
纠删码操作命令
[lzl@hadoop12 hadoop-3.1.3]$ hdfs ec Usage: bin/hdfs ec [COMMAND] [-listPolicies] [-addPolicies -policyFile <file>] [-getPolicy -path <path>] [-removePolicy -policy <policy>] [-setPolicy -path <path> [-policy <policy>] [-replicate]] [-unsetPolicy -path <path>] [-listCodecs] [-enablePolicy -policy <policy>] [-disablePolicy -policy <policy>] [-help <command-name>].
-
查看支持的纠删码策略
[lzl@hadoop12 hadoop-3.1.3] hdfs ec -listPolicies
-
策略解释
RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元。只要存在任意3个单元(无论是数据单元还是校验单元),就可以恢复原始数据。每个单元大小为1024k。
RS-10-4-1024k:使用RS编码,每10个数据单元,生成4个校验单元,共14个单元。只要存在任意10个单元,就可以恢复原始数据。每个单元大小为1024k。
RS-6-3-1024k:使用RS编码,每6个数据单元,生成3个校验单元,共9个单元。只要存在任意6个单元,就可以恢复原始数据。每个单元大小为1024k。
RS-LEGACY-6-3-1024k:策略与RS-6-3-1024k相同,但使用的编码算法是rs-legacy。
XOR-2-1-1024k:使用XOR编码(速度比RS编码快),每2个数据单元,生成1个校验单元,共3个单元。只要存在任意2个单元,就可以恢复原始数据。每个单元大小为1024k。
纠删码案例实操
-
策略应用
- 纠删码策略是针对具体路径设置的。所有上传到该路径下的文件都将遵循此策略。
-
具体步骤
启用RS-3-2-1024k策略支持
[lzl@hadoop12 hadoop-3.1.3]$ hdfs ec -enablePolicy -policy RS-3-2-1024k Erasure coding policy RS-3-2-1024k is enabled
创建HDFS目录并设置策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs dfs -mkdir /input [lzl@hadoop12 hadoop-3.1.3]$ hdfs ec -setPolicy -path /input -policy RS-3-2-1024k
上传文件并查看存储情况
[lzl@hadoop12 hadoop-3.1.3]$ hdfs dfs -put web.log /input
注意:上传的文件大小需要大于2M才能看到纠删码的效果(低于2M时,只会有一个数据单元和两个校验单元)。
- 查看存储路径的数据单元和校验单元
- 破坏实验
异构存储(冷热数据分离)
异构存储Shell操作
查看可用存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -listPolicies
为指定路径设置存储策略
hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx
获取指定路径的存储策略
hdfs storagepolicies -getStoragePolicy -path xxx
取消存储策略
hdfs storagepolicies -unsetStoragePolicy -path xxx
查看文件块的分布
bin/hdfs fsck xxx -files -blocks -locations
查看集群节点
hadoop dfsadmin -report
测试环境准备
-
环境描述
服务器规模:5台
集群配置:副本数为2,创建好带有存储类型的目录(提前创建)
集群规划:
节点 存储类型分配 hadoop12 RAM_DISK,SSD hadoop13 SSD,DISK hadoop14 DISK,RAM_DISK hadoop15 ARCHIVE hadoop16 ARCHIVE -
配置文件信息
hadoop12节点
<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>
hadoop13节点
<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,[DISK]file:///opt/module/hadoop-3.1.3/hdfsdata/disk</value> </property>
hadoop14节点
<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/hadoop-3.1.3/hdfsdata/disk</value> </property>
hadoop15节点
<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/hadoop-3.1.3/hdfsdata/archive</value> </property>
hadoop16节点
<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/hadoop-3.1.3/hdfsdata/archive</value> </property>
-
数据准备
启动集群
[lzl@hadoop12 hadoop-3.1.3]$ hdfs namenode -format [lzl@hadoop12 hadoop-3.1.3]$ myhadoop.sh start
创建HDFS文件目录
1[lzl@hadoop12 hadoop-3.1.3]$ hadoop fs -mkdir /hdfsdata
上传文件
[lzl@hadoop12 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-3.1.3/NOTICE.txt /hdfsdata
HOT存储策略案例
-
获取初始存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -getStoragePolicy -path /hdfsdata
-
查看文件块分布
1[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
-
默认存储策略为HOT
WARM存储策略测试
-
设置WARM存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM
-
查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
-
手动迁移文件块
[lzl@hadoop12 hadoop-3.1.3]$ hdfs mover /hdfsdata
-
再次查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
COLD策略测试
设置COLD存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD
手动迁移文件块
[lzl@hadoop12 hadoop-3.1.3]$ hdfs mover /hdfsdata
查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
ONE_SSD策略测试
设置ONE_SSD存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD
手动迁移文件块
[lzl@hadoop12 hadoop-3.1.3]$ hdfs mover /hdfsdata
查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
ALL_SSD策略测试
设置ALL_SSD存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD
手动迁移文件块
[lzl@hadoop12 hadoop-3.1.3]$ hdfs mover /hdfsdata
查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
LAZY_PERSIST策略测试
设置LAZY_PERSIST存储策略
[lzl@hadoop12 hadoop-3.1.3]$ hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy lazy_persist
手动迁移文件块
[lzl@hadoop12 hadoop-3.1.3]$ hdfs mover /hdfsdata
查看文件块分布
[lzl@hadoop12 hadoop-3.1.3]$ hdfs fsck /hdfsdata -files -blocks -locations
注意事项
-
当客户端所在的DataNode节点没有RAM_DISK时,文件块将被写入客户端所在的DataNode节点的DISK磁盘,其余副本将写入其他节点的DISK磁盘。
-
如果客户端所在的DataNode有RAM_DISK,但“dfs.datanode.max.locked.memory”参数值未设置或者设置过小(小于“dfs.block.size”参数值),文件块同样会被写入客户端所在的DataNode节点的DISK磁盘,其余副本将写入其他节点的DISK磁盘。
-
虚拟机的“max locked memory”限制为64KB,因此,如果参数配置过大,将会报错。
-
查询“max locked memory”参数
[lzl@hadoop12 hadoop-3.1.3]$ ulimit -a