Hadoop3.2.4纠删码实操(三)

耀灵12个月前技术文章403

1、纠删码实操

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

[root@hd2 hadoop]# hadoop fs -mkdir /ec_xor_s
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
[root@hd2 hadoop]# hadoop fs -mkdir /ec_xor_m
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
[root@hd2 hadoop]# hadoop fs -mkdir /ec_xor_l
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
[root@hd2 hadoop]# 
[root@hd2 hadoop]# 
[root@hd2 hadoop]# 
[root@hd2 hadoop]# hdfs ec -setPolicy -path /ec_xor_s -policy XOR-2-1-1024k
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Set XOR-2-1-1024k erasure coding policy on /ec_xor_s
[root@hd2 hadoop]# hdfs ec -setPolicy -path /ec_xor_m -policy XOR-2-1-1024k
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Set XOR-2-1-1024k erasure coding policy on /ec_xor_m
[root@hd2 hadoop]# hdfs ec -setPolicy -path /ec_xor_l -policy XOR-2-1-1024k
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Set XOR-2-1-1024k erasure coding policy on /ec_xor_l
[root@hd2 hadoop]#

1.png

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

[root@hd2 mnt]# dd if=/dev/urandom of=ec_test1.txt bs=50K count=1
记录了1+0 的读入
记录了1+0 的写出
51200字节(51 kB)已复制,0.0023516 秒,21.8 MB/秒
[root@hd2 mnt]# dd if=/dev/urandom of=ec_test2.txt bs=1200K count=1
记录了1+0 的读入
记录了1+0 的写出
1228800字节(1.2 MB)已复制,0.0182852 秒,67.2 MB/秒
[root@hd2 mnt]# ls -lrht
总用量 1.3M
drwxr-xr-x 2 root root    6 11月 18 2022 ramdisk
drwxr-xr-x 2 root root   36 3月  14 2023 hypervisor_app
drwxr-xr-x 2 root root   25 4月   4 2023 spark_test
-rw-r--r-- 1 root root   14 10月 19 18:03 ec_test.txt
-rw-r--r-- 1 root root  50K 10月 20 10:27 ec_test1.txt
-rw-r--r-- 1 root root 1.2M 10月 20 10:28 ec_test2.txt
[root@hd2 mnt]# rm -f ec_test.txt 
[root@hd2 mnt]# rm -f ec_test2.txt 
[root@hd2 mnt]# dd if=/dev/urandom of=ec_test.txt bs=1200K count=1
记录了1+0 的读入
记录了1+0 的写出
1228800字节(1.2 MB)已复制,0.0174861 秒,70.3 MB/秒
[root@hd2 mnt]# ls -lrht
总用量 1.3M
drwxr-xr-x 2 root root    6 11月 18 2022 ramdisk
drwxr-xr-x 2 root root   36 3月  14 2023 hypervisor_app
drwxr-xr-x 2 root root   25 4月   4 2023 spark_test
-rw-r--r-- 1 root root  50K 10月 20 10:27 ec_test1.txt
-rw-r--r-- 1 root root 1.2M 10月 20 10:29 ec_test.txt
[root@hd2 mnt]# dd if=/dev/urandom of=hbase_data.csv bs=1M count=1536
记录了1536+0 的读入
记录了1536+0 的写出
1610612736字节(1.6 GB)已复制,12.4121 秒,130 MB/秒
[root@hd2 mnt]# ls -lrht
总用量 1.6G
drwxr-xr-x 2 root root    6 11月 18 2022 ramdisk
drwxr-xr-x 2 root root   36 3月  14 2023 hypervisor_app
drwxr-xr-x 2 root root   25 4月   4 2023 spark_test
-rw-r--r-- 1 root root  50K 10月 20 10:27 ec_test1.txt
-rw-r--r-- 1 root root 1.2M 10月 20 10:29 ec_test.txt
-rw-r--r-- 1 root root 1.5G 10月 20 10:29 hbase_data.csv
[root@hd2 mnt]# rm -f hbase_data.csv 
[root@hd2 mnt]# dd if=/dev/urandom of=hbase_data.csv bs=1M count=1236
记录了1236+0 的读入
记录了1236+0 的写出
1296039936字节(1.3 GB)已复制,8.46749 秒,153 MB/秒
[root@hd2 mnt]#

2.png

3.png

确认hdfs上大小:

4.png


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

[root@hd2 mnt]# hdfs fsck /ec_xor_s -files -blocks -locations
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Connecting to namenode via https://hd2.dtstack.com:9871/fsck?ugi=hdfs&files=1&blocks=1&locations=1&path=%2Fec_xor_s
FSCK started by hdfs (auth:KERBEROS_SSL) from /172.16.106.252 for path /ec_xor_s at Fri Oct 20 10:37:01 CST 2023

/ec_xor_s <dir>
/ec_xor_s/ec_test1.txt 51200 bytes, erasure-coded: policy=XOR-2-1-1024k, 1 block(s):  OK
0. BP-1658176459-172.16.104.226-1666334387761:blk_-9223372036854775792_116224 len=51200 Live_repl=2  [blk_-9223372036854775792:DatanodeInfoWithStorage[172.16.106.252:9866,DS-ea8ff508-5999-4a30-a2cc-32d9b2e6804f,DISK], blk_-9223372036854775790:DatanodeInfoWithStorage[172.16.107.127:9866,DS-87fa9843-fb62-4eef-bfb3-94a97a031976,DISK]]


Status: HEALTHY
 Number of data-nodes:	3
 Number of racks:		2
 Total dirs:			1
 Total symlinks:		0

Replicated Blocks:
 Total size:	0 B
 Total files:	0
 Total blocks (validated):	0
 Minimally replicated blocks:	0
 Over-replicated blocks:	0
 Under-replicated blocks:	0
 Mis-replicated blocks:		0
 Default replication factor:	3
 Average block replication:	0.0
 Missing blocks:		0
 Corrupt blocks:		0
 Missing replicas:		0

Erasure Coded Block Groups:
 Total size:	51200 B
 Total files:	1
 Total block groups (validated):	1 (avg. block group size 51200 B)
 Minimally erasure-coded block groups:	1 (100.0 %)
 Over-erasure-coded block groups:	0 (0.0 %)
 Under-erasure-coded block groups:	0 (0.0 %)
 Unsatisfactory placement block groups:	0 (0.0 %)
 Average block group size:	2.0
 Missing block groups:		0
 Corrupt block groups:		0
 Missing internal blocks:	0 (0.0 %)
FSCK ended at Fri Oct 20 10:37:01 CST 2023 in 15 milliseconds


The filesystem under path '/ec_xor_s' is HEALTHY
[root@hd2 mnt]#

5.png

6.png

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

  • 首先只有一个block group,因为该测试文件只有50K,远远小于HDFS的block size,已经没办法再被拆分。

  • Live_repl=2,表明此数据块有2个副本,一个是原始数据,一个是校验数据,这里我们选择的纠删码策略是XOR(2,1),按道理应该是2个数据块,但是因为原始数据只有太小只有50K,小于纠删码策略的cell默认大小1024k,所以没办法再被拆分,只有一个cell。


  • 我们通过Live_repl的block ID也可以在DataNode上找到这2个副本进行确认。根据之前fsck打印出来的信息其实也可以知道blk_-9223372036854775792在DataNode(172.16.106.252)上,blk_-9223372036854775790在DataNode(172.16.107.127)上。

  • 接下来我们在这2台DataNode上分别查看这2个block

7.png

8.png

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

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

[root@hd2 mnt]# hdfs fsck /ec_xor_m -files -blocks -locations

9.png

10.png

  • 首先只有一个block group,因为该测试文件只有1.2MB,远远小于HDFS的block size,已经没办法再被拆分。

  • Live_repl=3,表明此数据块有3个副本,2个是原始数据,1个是校验数据,这里我们选择的纠删码策略是XOR(2,1),与策略一致。注意这里与上面那个50K文件的测试不一样的地方,因为这次的文件大于一个cell大小1MB,却又小于2个cell的大小2MB,刚好原始数据可以被拆分为2个cell也即2个原始数据块。

  • 我们通过Live_repl的block ID也可以在DataNode上找到这3个副本进行确认。根据之前fsck打印出来的信息其实也可以知道blk_-9223372036854775664在DataNode(172.16.106.252)上,blk_-9223372036854775663在DataNode(172.16.104.226)上,blk_-9223372036854775662在DataNode(172.16.107.127)。

  • 分别在3台DataNode上查看这3个block文件。

11.png

12.png

13.png

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

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

[root@hd2 mnt]# hdfs fsck /ec_xor_l -files -blocks -locations

14.png

15.png

  • 首先只有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.16.106.252上,blk_-9223372036854775647在172.16.104.226上,blk_-9223372036854775646在172.16.107.127上。

  • 分别在3台DataNode上查看这3个block文件。

172.16.106.252

16.png

172.16.104.226

17.png

172.16.107.127

18.png

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

3副本与启用XOR-2-1-1024K策略存储对比:

19.png

6、配置建议

策略

最少dn数

可靠性

存储效率

数据恢复计算开销

数据恢复网络开销

数据恢复效率

适用场景

3副本

3

2

33%

较低

任何场景,所需大容量存储

RS-3-2-1024K

5

2

60%

较高

较低

均衡可靠性和存储效率的场景。

RS-6-3-1024K

9

3

67%

较高

较低

高可靠性,大容量的存储需求。

RS-10-4-1024K

14

4

71%

较低

极高的容错性和数据保护,大规模存储需求。

XOR-2-1-1024K

3

1

67%

较低

较低

较高

相对较低的容错性需求,可以节省存储空间。

每个策略都有其优点和局限性,具体的选择应根据存储需求、容错需求、存储空间预算以及集群性能进行权衡。不同策略之间的权衡点在于可靠性、存储效率和计算开销   综合考虑,建议开启RS-6-3-1024k策略。考虑到EC策略目录的规范性,目前只支持管理员设置EC策略。

修改策略:

hdfs ec -disablePolicy -policy RS-3-2-1024k  ##禁用相应策略
hdfs ec -enablePolicy -policy RS-6-3-1024k  ##启用相应策略
hadoop fs -mkdir /ec_RS-6-3-1024k
hdfs ec -setPolicy -path /ec_RS-6-3-1024k -policy RS-6-3-1024k ##目录配置策略

7.总结

1.hadoop中默认没有开启纠删码,需要在hdfs-site.xml中进行设置,启用后需要重启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,因为测试环境只有3台DataNode,所以本文使用的策略是XOR-2-1-1024k。

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

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

8.在本次测试中选择了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)。


相关文章

MySQL性能优化(四)隐式类型转换

我们知道, where条件中,对一个索引字段进行运算会导致无法使用该字段的索引。有些情况下,即使没有显式地对索引字段进行运算,但是数据库会进行隐式类型转换,这也会导致无法使用索引。会发生隐式类型转换的...

hive元数据迁移

hive元数据迁移

一、在新集群中创建hive数据库,作为新集群中的元数据库。注意点:创建hive数据库时注意用户和用户的权限及使用的编码格式一致。查看旧集群中角色权限和编码格式,在新的hive元数据库中设置相同的角色权...

python-序列化和反序列化

1、为什么要序列化内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?如果是自己定义的类的实例,如何保存到一个文件中?如何从文件中读取数据,并让它们在内存中再次恢复成自己对应的类的实例?要设计...

ES组件集成nlpSQL模块

ES组件集成nlpSQL模块

查看sql插件github https://github.com/NLPchina/elasticsearch-sql 安装cd elasticsearch #进入目录可以先去下载...

kafka安全认证与授权

kafka安全认证与授权一、SASL、SSL、ACL介绍1.SASL鉴权协议,主要用来保证客户端登录服务器的时候,传输的鉴权数据的安全性,SASL是对用户名和密码加解密用的 2.SSL是一种间于传输层...

Kubernetes源码解读(二)--DeltaFIFO源码分析

Kubernetes源码解读(二)--DeltaFIFO源码分析

1、Queue接口与DeltaFIFO的实现1.1、Queue和Store接口接口和结构体先相关代码类似 workqueue 里的队列概念,这里也有一个队列,Queue 接口定义在 client-go...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。