Hadoop3.2.4纠删码实操(三)
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]#
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]#
确认hdfs上大小:
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]#
通过该命令查看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
注意到2台DataNode上存储的block数据包括内容和大小其实是一样,其中一个是数据块,一个是校验块。即当原始数据文件太小,无法拆分再被cell的1MB拆分的时候,类似XOR(2,1)策略的一个数据块一个校验块其实就是类似副本的方式。
4.查看/ec_xor_m编码后block的分布
[root@hd2 mnt]# hdfs fsck /ec_xor_m -files -blocks -locations
首先只有一个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文件。
说明原始文件被拆分成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
首先只有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
172.16.104.226
172.16.107.127
说明每个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策略存储对比:
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)。