Fayson的github: https://github.com/fayson/cdhproject
推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f,或者扫描文末二维码。
1.文档编写目的
Fayson在前面的文章中介绍过《0432-什么是HDFS的纠删码》,当时详细介绍了什么是纠删码,纠删码的实现原理,以及一些Benchmark的结果比较。
纠删码是CDH6/Hadoop3新加入的功能,之前的HDFS都是采用副本方式容错,默认情况下,一个文件有3个副本,可以容忍任意2个副本(DataNode)不可用,这样提高了数据的可用性,但也带来了2倍的冗余开销。例如3TB的空间,只能存储1TB的有效数据。而纠删码则可以在同等可用性的情况下,节省更多的空间,以rs-6-3-1024K这种纠删码策略为例子,6份原始数据,编码后生成3份校验数据,一共9份数据,只要最终有6份数据存在,就可以得到原始数据,它可以容忍任意3份数据不可用,而冗余的空间只有原始空间的0.5倍,只有副本方式的1/4,因此,可以大大节约成本。本文Fayson主要是介绍如何在CDH6.0中使用纠删码。
内容概述:
1.通过CM启用纠删码
2.纠删码策略介绍
3.纠删码基本操作
4.纠删码实操
5.总结
测试版本:
1.CM和CDH版本为6.0
2.Redhat7.4
3.集群已启用Kerberos
2.通过CM启用纠删码
1.通过Cloudera Manager搜索HDFS服务“erasure”,勾选“cloudera.erasure_coding.enabled”配置项,保存后退出需要重启HDFS服务,重启过程略。
2.如果不在Cloudera Manager中设置该选项,在后台使用命令行在启用纠删码的某一个策略时,会报错,如下所示。
[root@ip-172-31-6-83 311-hdfs-NAMENODE]# hdfs ec -enablePolicy -policy XOR-2-1-1024k
RemoteException: enableErasureCodingPolicy is not allowed because cloudera.erasure_coding.enabled=false
3.这里顺便解释一下Cloudera Manager中关于纠删码的几个参数。
CM中参数名:DataNode Striped Read Timeout
参数:dfs.datanode.ec.reconstruction.stripedread.timeout.millis
描述:DataNode的条带读取超时,默认是5000ms。即如果超过5s没从DataNode上读取到条带数据,则会在DataNode上启动后端的重建数据的线程。
CM中参数名:DataNode Striped Read Threads
参数:dfs.datanode.ec.reconstruction.threads
描述:在后台重建数据工作期间DataNode用于读取条带块的线程数。
CM中参数名:Erasure Coding Reconstruction Weight
参数:dfs.datanode.ec.reconstruction.xmits.weight
描述:EC后台恢复任务使用的资源的相对权重,EC模式下恢复数据需要读取多个块,比如在RS-6-3-1024k的情况下为6,而如果是以前的副本复制方式只需要读取单个副本即可。这个权重值越高,可以同时运行的重建任务越少。需要读取以完成恢复的块乘以该权重以确定恢复任务的总权重。这些权重会计入dfs.namenode.replication.max-streams参数所设置的限制。
CM中参数名:Default Policy when Setting Erasure Coding
参数:dfs.namenode.ec.system.default.policy
描述:默认的纠删码编码策略,这里可以看到是RS-6-3-1024k。在后台依旧还是可以单独对目录进行设置。
CM中参数名:Erasure Coding Enabled
参数:cloudera.erasure_coding.enabled
描述:是否启用纠删码,默