1 基本概念
HDFS
为擦除编码(EC
)提供了支持,以更有效地存储数据。与默认三个副本机制相比,EC
策略可以节省约50%
的存储空间
但不可忽略的是编解码的运算会消耗CPU资源。纠删码的编解码性能对其在HDFS
中的应用起着至关重要的作用,如果不利用硬件方面的优化就很难得到理想的性能。英特尔的智能存储加速库(ISA-L
)提供了对纠删码编解码的优化,极大的提升了其性能
纠删码是hadoop3.x新加入的功能
,之前的hdfs
都是采用副本方式容错,默认情况下,一个文件有3个副本
,可以容忍任意2个副本(datanode
)不可用,这样提高了数据的可用性,但也带来了2倍的冗余开销。例如3TB
的空间,只能存储1TB的有效数据。而纠删码则可以在同等可用性的情况下,节省更多的空间,以RS-6-3-1024K
这种纠删码策略为例子,6份原始数据
,编码后生成3份校验数据
,一共9
份数据,只要最终有6
份数据存在,就可以得到原始数据,它可以容忍任意3
份数据不可用.
2 纠删码操作
2.1 纠删码策略查看
hdfs ec -listPolicies
上述策略中有多种,如上述策略箭头指向,这里介绍其中一种,其他
以此类推
RS-6-3-1024k
:使用RS
编码,每6个数据单元
,生成3个校验单元
,共9个单元
,也就是说:这9
个单元中,只要有任意的6
个单元存在(不管是数据单元还是校验单元,只要总数=6
),就可以得到原始数据。例如上传一个40MB
的数据,那么就会将40MB
的数据按1024KB
为一块进行完全划分(1024KB
也是最小的数据单元
)。而策略中的6
表示分割6
个原始数据部分,对于40MB
的数据,划分为6个部分
,那么每个部分是7MB
,7MB
的数据可以看做由多个1024KB的组成
,同时它也是使用1024KB
进行计算的(因为并不能做到每个数据内容都能进行一个6
的整倍数)原始数据部分存储是6*7MB=42MB
,而使用原来副本数存储(我这里设置的是3个
),那么占用的内存就是120MB
,虽然纠删码策略的校验单元也占用内存,但是理论上纠删码策略节省的空间高达50%
,
State
:表示策略的状态。上图中RS-6-3-1024K
表示开启状态
理论状态下RS-6-3-1024k
需要9
台DataNode
,RS-3-2-1024k
需要5
台DataNode
支持,其他以此类推
2.2 纠删码策略设置
纠删码策略是与具体的路径(
path
)相关联的。也就是说,如果我们要使用纠删码,则要给一个具体的路径设置纠删码策略,后续,所有往此目录下存储的文件,都会执行此策略
默认只开启对RS-6-3-1024k策略的支持,如要使用别的策略需要先启用
以下以为input
目录设置RS-3-2-1024K
为例,开启纠删码策略,就不会以原来的副本策略去存储文件
1、 开启对RS-3-2-1024k
策略的支持(开启以后才能使用该策略)
#开启
hdfs ec -enablePolicy -policy RS-3-2-1024k
#禁用
hdfs ec -disablePolicy -policy RS-3-2-1024k
2、在HDFS创建目录,并设置擦除策略
#目录创建
hdfs dfs -mkdir /input
#为input目录设置策略
hdfs ec -setPolicy -path /input -policy RS-3-2-1024k
#获取目录的纠删码策略
hdfs ec -getPolicy -path /input
3、上传文件,并查看文件编码后的存储情况
将任意文件上传到HDFS
上,并查看副本数(当前集群中设置副本数是3
,并且创建了5台DataNode
,理论上RS-3-2-1024K
需要5台DataNode
支持)
可以看到副本数为1
,跟设置的不相同。点击文件可以产看数据的存储情况,可以看到在5
台机器上都有数据,5
个机器上的数据也就是我们的3
个数据单元以及2
个检验单元,每个单元在一个机器上,而不是5
个单元在一个机器上。每个单元只会存一份
通过以下文件查看文件的存储情况
hdfs fsck /input/aaa.txt -files -blocks -locations
2.3 纠删码策略测试
根据纠删码策略的特性,这里关闭其中一个DataNode
,那么存储的5
个单元中,就会缺失一个,尝试是否能正常获取文件,使用一下命令获取文件到本地
hadoop fs -get input/aaa.txt ./ec
正常而言是会报一下的错误,但是该存储是正常的,打开ec文件会
看到文件被完整复制到了本地中