如何在CDH6.0中使用纠删码

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.文档编写目的


Fayson在前面的文章中介绍过《什么是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

描述:是否启用纠删码,默认为关闭状态,如果要使用纠删码功能,需要勾选。

3.纠删码策略介绍


首先我们查看一下系统中具体支持的纠删码策略类型。

[root@ip-172-31-6-83 ~]# hdfs ec -listPolicies
Erasure Coding Policies:
ErasureCodingPolicy=[Name=RS-10-4-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=10, numParityUnits=4]], CellSize=1048576, Id=5], State=DISABLED
ErasureCodingPolicy=[Name=RS-3-2-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=3, numParityUnits=2]], CellSize=1048576, Id=2], State=DISABLED
ErasureCodingPolicy=[Name=RS-6-3-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=1], State=ENABLED
ErasureCodingPolicy=[Name=RS-LEGACY-6-3-1024k, Schema=[ECSchema=[Codec=rs-legacy, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=3], State=DISABLED
ErasureCodingPolicy=[Name=XOR-2-1-1024k, Schema=[ECSchema=[Codec=xor, numDataUnits=2, numParityUnits=1]], CellSize=1048576, Id=4], State=ENABLED

(可左右滑动)

可以看到一共有5种纠删码策略,这里具体解释一下:

1.RS-10-4-1024k:使用RS编码,每10个数据单元(cell),生成4个校验单元,共14个单元,也就是说:这14个单元中,只要有任意的10个单元存在(不管是数据单元还是校验单元,只要总数=10),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。

2.RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元,也就是说:这5个单元中,只要有任意的3个单元存在(不管是数据单元还是校验单元,只要总数=3),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。

3.RS-6-3-1024k:使用RS编码,每6个数据单元,生成3个校验单元,共9个单元,也就是说:这9个单元中,只要有任意的6个单元存在(不管是数据单元还是校验单元,只要总数=6),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。

4.RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k一样,只是编码的算法用的是rs-legacy,应该是之前遗留的rs算法。

5.XOR-2-1-1024k:使用XOR编码(速度比RS编码快),每2个数据单元,生成1个校验单元,共3个单元,也就是说:这3个单元中,只要有任意的2个单元存在(不管是数据单元还是校验单元,只要总数=2),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。

以RS-6-3-1024k为例,6个数据单元+3个校验单元,可以容忍任意的3个单元丢失,冗余的数据是50%。而采用副本方式,3个副本,冗余200%,却还不能容忍任意的3个单元丢失。因此,RS编码在相同冗余度的情况下,会大大提升数据的可用性,而在相同可用性的情况下,会大大节省冗余空间。

4.纠删码基础操作


纠删码策略是与具体的路径(path)相关联的。也就是说,如果我们要使用纠删码,则要给一个具体的路径设置纠删码策略,后续,所有往此目录下存储的文件,都会执行此策略。

1.首先我们在HDFS中建立一个目录。

[root@ip-172-31-6-83 ~]# hadoop fs -mkdir /ec_xor

(可左右滑动)

2.使用命令获取该目录的纠删码策略,提示未指定,说明新建目录不会被默认增加纠删码策略属性。

[root@ip-172-31-6-83 ~]# hdfs ec -getPolicy -path /ec_xor
The erasure coding policy of /ec_xor is unspecified
[root@ip-172-31-6-83 ~]#

(可左右滑动)

3.我们先启用XOR-2-1-1024k策略。

[root@ip-172-31-6-83 ~]# hdfs ec -enablePolicy -policy XOR-2-1-1024k
Erasure coding policy XOR-2-1-1024k is enabled
[root@ip-172-31-6-83 ~]#

(可左右滑动)

注意Fayson集群启用了Kerberos,要先使用hdfs的keytab登录,否则会报没权限。如下所示:

[root@ip-172-31-6-83 ~]# hdfs ec -enablePolicy -policy XOR-2-1-1024k
AccessControlException: Access denied for user fayson. Superuser privilege is required
[root@ip-172-31-6-83 ~]#  kinit -kt hdfs.keytab hdfs/ip-172-31-6-83.ap-southeast-1.compute.internal@FAYSON.COM

(可左右滑动)

4.给目录设置纠删码策略

[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor -policy XOR-2-1-1024k
Set erasure coding policy XOR-2-1-1024k on /ec_xor
[root@ip-172-31-6-83 ~]# hdfs ec -getPolicy -path /ec_xor
XOR-2-1-1024k

(可左右滑动)

5.这里再测试一下给目录设置另外一些没启用的纠删码策略

[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor -policy RS-10-4-1024k
RemoteException: Policy 'RS-10-4-1024k' does not match any enabled erasure coding policies: [XOR-2-1-1024k]. An erasure coding policy can be enabled by enableErasureCodingPolicy API.
[root@ip-172-31-6-83 ~]#

(可左右滑动)

报错,说明在使用某个纠删码策略是,需要先启用。

6.我们启用策略RS-6-3-1024k,然后再给/ec_xor目录set策略。同时往这个目录写入数据。

[root@ip-172-31-6-83 ~]# hdfs ec -enablePolicy -policy RS-6-3-1024k
Erasure coding policy RS-6-3-1024k is enabled
[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor -policy RS-6-3-1024k
Set erasure coding policy RS-6-3-1024k on /ec_xor
[root@ip-172-31-6-83 ~]# hadoop fs -put ec_test.txt /ec_xor
put: File /ec_xor/ec_test.txt._COPYING_ could only be written to 3 of the 6 required nodes for RS-6-3-1024k. There are 3 datanode(s) running and no node(s) are excluded in this operation.

(可左右滑动)

发现启用纠删码策略,设置目录策略都可以成功,但是在往目录丢数据的时候会报错,这是因为RS(6,3)策略需要6份原始数据,3份校验校验,至少需要9台DataNode,但是Fayson的环境比较屌丝总共4个节点,只有3个数据节点。所以接下来的章节,Fayson会基于XOR-2-1-1024k策略来进行实操,因为XOR(2,1)只需要2份原始数据,1份校验数据,3台DataNode可以进行操作。

5.纠删码实操


1.在HDFS中建立以下三个目录,并都设置为XOR-2-1-1024k策略。

[root@ip-172-31-6-83 ~]# hadoop fs -mkdir /ec_xor_s
[root@ip-172-31-6-83 ~]# hadoop fs -mkdir /ec_xor_m
[root@ip-172-31-6-83 ~]# hadoop fs -mkdir /ec_xor_l
[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor_s -policy XOR-2-1-1024k
Set erasure coding policy XOR-2-1-1024k on /ec_xor_s
[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor_m -policy XOR-2-1-1024k 
Set erasure coding policy XOR-2-1-1024k on /ec_xor_m
[root@ip-172-31-6-83 ~]# hdfs ec -setPolicy -path /ec_xor_l -policy XOR-2-1-1024k 
Set erasure coding policy XOR-2-1-1024k on /ec_xor_l
[root@ip-172-31-6-83 ~]#

(可左右滑动)

2.准备3个数据文件,一个小于cell的默认大小1024k,一个大于1024k但是小于2048k,一个是1个GB多的超大文件,并分别put到上一步准备好的3个目录。

3.查看/ec_xor_s编码后block的分布

[root@ip-172-31-6-83 generatedata]# hdfs fsck /ec_xor_s -files -blocks -locations

(可左右滑动)

通过该命令查看block的文件信息。在EC中这里列出来的每一条block信息,与之前三副本的方式有一点区别,这里是指一个block group。

  • 首先只有一个block group,因为该测试文件只有49.7K,远远小于HDFS的block size,已经没办法再被拆分。
  • Live_repl=2,表明此数据块有2个副本,一个是原始数据,一个是校验数据,这里我们选择的纠删码策略是XOR(2,1),按道理应该是2个数据块,但是因为原始数据只有太小只有49.7K,小于纠删码策略的cell默认大小1024k,所以没办法再被拆分,只有一个cell。
  • 我们通过Live_repl的block ID也可以在DataNode上找到这2个副本进行确认。根据之前fsck打印出来的信息其实也可以知道blk_-9223372036854775680在DataNode(172.31.12.142)上,blk_-9223372036854775678在DataNode(172.31.4.105)上。
  • 接下来我们在这2台DataNode上分别查看这2个block

注意到2台DataNode上存储的block数据包括内容和大小其实是一样,其中一个是数据块,一个是校验块。即当原始数据文件太小,无法拆分再被cell的1MB拆分的时候,类似XOR(2,1)策略的一个数据块一个校验块其实就是类似副本的方式。

4.查看/ec_xor_m编码后block的分布

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_xor_m -files -blocks -locations

(可左右滑动)

  • 首先只有一个block group,因为该测试文件只有1.2MB,远远小于HDFS的block size,已经没办法再被拆分。
  • Live_repl=3,表明此数据块有3个副本,2个是原始数据,1个是校验数据,这里我们选择的纠删码策略是XOR(2,1),与策略一致。注意这里与上面那个49K文件的测试不一样的地方,因为这次的文件大于一个cell大小1MB,却又小于2个cell的大小2MB,刚好原始数据可以被拆分为2个cell也即2个原始数据块。
  • 我们通过Live_repl的block ID也可以在DataNode上找到这3个副本进行确认。根据之前fsck打印出来的信息其实也可以知道blk_-9223372036854775664在DataNode(172.31.4.105)上,blk_-9223372036854775663在DataNode(172.31.12.142)上,blk_-9223372036854775662在DataNode(172.31.9.113)。
  • 分别在3台DataNode上查看这3个block文件。

说明原始文件被拆分成2个cell分别保存在172.31.4.105和172.31.12.142,而172.31.9.113上保存的是校验数据块,直接用命令查看为乱码。

5.查看/ec_xor_l编码后block的分布

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_xor_l -files -blocks -locations

(可左右滑动)

  • 首先只有5个block group,因为该测试文件只有约1.2GB,每个block group保存2份原始数据,按默认的block size为128MB,计算2个数据文件为256MB,所以一共5个block group,最后一个block group不够256MB。
  • Live_repl=3,表明此数据块有3个副本,2个是原始数据,1个是校验数据,这里我们选择的纠删码策略是XOR(2,1),与策略一致。只是这里原始文件大很多,每个副本为128MB,包含128个1MB的cell。
  • 以第一个block group为例,我们来具体看看每个block的情况。blk_-9223372036854775648在172.31.12.142上,blk_-9223372036854775647在172.31.4.105上,blk_-9223372036854775646在172.31.9.113上。
  • 分别在3台DataNode上查看这3个block文件。

说明每个block group里的保存2份原始数据,这2份原始数据均为HDFS的默认block size大小128MB,分别保存在172.31.4.105和172.31.12.142,而172.31.9.113上保存的是校验数据块,也为128MB,直接用命令查看为乱码。

6.总结


1.CDH6中默认没有开启纠删码,需要在Cloudera Manager中进行设置,启用后需要重启HDFS服务。

2.目前默认的纠删码策略一共有5种,包括RS-10-4-1024k,RS-3-2-1024k,RS-6-3-1024k,RS-LEGACY-6-3-1024k和XOR-2-1-1024k。

3.默认纠删码策略都是disable状态,需要使用hdfs用户才能启用这些策略,否则会报权限不足。启用后的纠删码策略,你才能设置给某个目录,否则会报错无法为目录设置该纠删码策略。

4.纠删码是以目录为单位的,一旦某个纠删码策略被启用后,你就可以为某个目录设置策略,为目录设置策略不需要高级用户,普通用户即可。一旦目录设置了某个策略,写入该目录的文件都会被编码拆分为原始数据块,以及校验数据块。

5.纠删码策略对DataNode的数量有要求,比如RS-6-3-1024k即RS(6,3),需要6个数据块,3个校验块,你至少需要9台DataNode,因为Fayson的环境只有3台DataNode,所以本文使用的策略是XOR-2-1-1024k。

6.使用纠删码后保存的文件,跟之前三副本的方式有区别,会以block group组为单位,每个block group里都会保存原始数据块和校验数据块(具体比例取决于你选择的纠删码策略),group中的数据块才是真正以前的HDFS block。

7.校验数据块也是以HDFS block为单位保存在DataNode上的,直接用cat命令查看为乱码。

8.Fayson在本文的实操部分选择了3种场景,1个文件非常小,小于策略默认的cell大小1024K,另一个文件大于策略默认的cell大小1024K,却小于2*1024K,最后一个文件非常大1.2G,大约可以被拆分为5个256MB。对于第一个场景虽然选择的策略是XOR(2,1),但因文件太小,没办法被cell的size拆分,所以只有一个原始数据块,一个校验数据块,这2个数据块属于同一个block group。第二种情况因为可以被cell的size拆分,所以按照策略XOR(2,1),有2个原始数据块,一个校验数据块,3个数据块都属于一个block group。第三种情况原始数据特别大,被拆为5个256MB的block group,每个group都包含2个原始数据块(均为128MB每个),同时包含1个校验数据块(也为128MB)。

参考:

http://bigdatastudy.net/show.aspx?id=458&cid=8

https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html

https://www.cloudera.com/documentation/enterprise/latest/topics/admin_hdfs_deployec.html

http://itxx00.github.io/blog/2017/08/20/hadoop3-ec-test/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

https://www.cnblogs.com/basenet855x/p/7889994.html

https://www.jianshu.com/p/9f99cc9630cd

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

TensorFlow 1.8.0正式发布,Bug修复和改进内容都在这里了

【导语】TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编译如下。 ▌主要特点及改进 可以将 tf.contrib...

42190
来自专栏用户2442861的专栏

Tesseract文字训练,以及样本生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details...

20410
来自专栏大数据文摘

TensorFlow 1.2.0新版本发布:新增Intel MKL优化深度学习基元

46940
来自专栏AI科技大本营的专栏

快速构建深度学习图像数据集,微软Bing和Google哪个更好用?

译者 | Serene 编辑 | 明明 【AI 科技大本营导读】在本文中,作者将利用微软的 Bing Image Search API 来建立深度学习图像数据集...

51560
来自专栏AI2ML人工智能to机器学习

TF Boy 之初筵 - 机器簇

在 "TF Boy 之初筵 - 分布十三式", 里面,我们提到参数服务器PS+Worker。 我们基本上是在Client里面定义好了TF模型(网络图),然后提交...

8010
来自专栏PaddlePaddle

【进阶篇】安装与编译C-API预测库

编写|PaddlePaddle 排版|wangp 1 概述 使用 C-API 进行预测依赖于将 PaddlePaddle 核心代码编译成链接库,只需在编译时...

379100
来自专栏机器之心

资源 | AMD 开源高性能机器智能库MIOpen,可加速卷积神经网络

选自GitHub 机器之心编译 参与:蒋思源 AMD 最近宣布新的深度学习加速库 MIOpen 1.0 现已发布,该深度学习库支持加速卷积神经网络,并且构建和运...

37880
来自专栏计算机视觉

为stackGan一个工程创建一个虚拟环境,python 2.7 tensorflow0.12-tensorflow 1.01

安装conda 下载地址:https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64...

362100
来自专栏Django中文社区

创建 Django 博客的数据库模型

设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。我们把写好的文章永...

31860
来自专栏林冠宏的技术文章

Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等

14230

扫码关注云+社区

领取腾讯云代金券