CDH6.2.1版本的集群:
172.30.81.203 manager
172.30.81.204 node1
172.30.81.205 node2
172.30.81.206 node3
存在隐患:9 DataNodes are required for the erasure coding policies: RS-6-3-1024k.The number of DataNodes is only 3.
解决方案
使用RS-6-3-1024k编码纠删码策略至少需要9个DataNodes,当前只安装了3个,所以再增加6个DataNodes节点即可解决该问题。
修改编码纠删码策略同样也可以解决,不过会比较麻烦
补充:
纠删码基本操作
1. 查看当前支持的纠删码策略
命令如下
hdfs ec -listPolicies
查看Hadoop版本命令:
hadoop version
目前hadoop-3.0.0beta1共支持5种纠删码策略,分别是:
RS-10-4-1024k:使用RS编码,每10个数据单元(cell),生成4个校验单元,共14个单元,也就是说:这14个单元中,只要有任意的10个单元存在(不管是数据单元还是校验单元,只要总数=10),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576。
RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元,也就是说:这5个单元中,只要有任意的3个单元存在(不管是数据单元还是校验单元,只要总数=3),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576。
RS-6-3-1024k:使用RS编码,每6个数据单元,生成3个校验单元,共9个单元,也就是说:这9个单元中,只要有任意的6个单元存在(不管是数据单元还是校验单元,只要总数=6),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576。
RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k一样,只是编码的算法用的是rs-legacy,应该是之前遗留的rs算法。
XOR-2-1-1024k:使用XOR编码(速度比RS编码快),每2个数据单元,生成1个校验单元,共3个单元,也就是说:这3个单元中,只要有任意的2个单元存在(不管是数据单元还是校验单元,只要总数=2),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576。
以RS-6-3-1024k为例,6个数据单元+3个校验单元,可以容忍任意的3个单元丢失,冗余的数据是50%。而采用副本方式,3个副本,冗余200%,却还不能容忍任意的3个单元丢失。因此,RS编码在相同冗余度的情况下,会大大提升数据的可用性,而在相同可用性的情况下,会大大节省冗余空间。
2. 设置纠删码策略
纠删码策略是与具体的路径(path)相关联的。也就是说,如果我们要使用纠删码,则要给一个具体的路径设置纠删码策略,后续,所有往此目录下存储的文件,都会执行此策略。
例子如下
首先在/下创建目录rs-6-3,然后查看其是否设置了纠删码策略,结果显示没有指定策略(新建的目录不会指定策略)
[root@manager ~]# hdfs dfs -mkdir /rs-6-3
[root@manager ~]# hdfs ec -getPolicy -path /rs-6-3
The erasure coding policy of /rs-6-3 is unspecified
接下来,给此目录设置纠删码策略RS-6-3-1024k,此策略名是从前面list策略中查到的。可以看到已经设置成功。
[root@manager ~]# hdfs ec -setPolicy -path /rs-6-3 -policy RS-6-3-1024k
Set erasure coding policy RS-6-3-1024k on /rs-6-3
注意:
RS-6-3-1024k可以直接设置成功,其它的策略需要enable后,才能设置:
设置RS-3-2-1024k,这个需要先enablePolicy
[root@manager ~]# hdfs ec -enablePolicy -policy RS-3-2-1024k
Erasure coding policy RS-3-2-1024k is enabled
[root@manager ~]# hdfs ec -setPolicy -path /rs-3-2 -policy RS-3-2-1024k
Set erasure coding policy RS-3-2-1024k on /rs-3-2
验证
[root@manager ~]# hdfs ec -getPolicy -path /rs-3-2
RS-3-2-1024k
设置RS-10-4-1024k,如果不enablePolicy,会报错
[root@manager ~]# hdfs dfs -mkdir /rs-10-4
[root@manager ~]# hdfs ec -setPolicy -path /rs-10-4 -policy RS-10-4-1024k
报错:
RemoteException: Policy 'RS-10-4-1024k' does not match any enabled erasure coding policies: [RS-3-2-1024k, RS-6-3-1024k]. An erasure coding policy can be enabled by enableErasureCodingPolicy API.