0460-HDFS纠删码的机架感知

版权声明:原创文章,欢迎转载,转载请注明:转载自 https://blog.csdn.net/Hadoop_SC/article/details/84594366

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

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f,或者扫描文末二维码。

1.文章编写目的

Fayson在前面的文章中对Hadoop3的新特性之一纠删码进行过介绍,参考《0432-什么是HDFS的纠删码》,后面又对纠删码的使用进行了实操,参考《0434-如何在CDH6.0中使用纠删码》。但我们知道,在HDFS的三副本年代,Hadoop为了最大限度保证数据可用性,HDFS本身还有一个机架感知策略。这里先温习一下:

“1.如果上传本机不是一个datanode,而是一个客户端,那么就从所有slave机器中随机选择一台datanode作为第一个块的写入机器(datanode1)。而此时如果上传机器本身就是一个datanode,那么就将该datanode本身作为第一个块写入机器(datanode1)。

2.随后在datanode1所属的机架以外的另外的机架上,随机的选择一台,作为第二个block的写入datanode机器(datanode2)。

3.在写第三个block前,先判断是否前两个datanode是否是在同一个机架上,如果是在同一个机架,那么就尝试在另外一个机架上选择第三个datanode作为写入机器(datanode3)。而如果datanode1和datanode2没有在同一个机架上,则在datanode2所在的机架上选择一台datanode作为datanode3。

4.得到3个datanode的列表以后,从namenode返回该列表到DFSClient之前,会在namenode端首先根据该写入客户端跟datanode列表中每个datanode之间的“距离”由近到远进行一个排序,客户端根据这个顺序有近到远的进行数据块的写入。

5.当根据“距离”排好序的datanode节点列表返回给DFSClient以后,DFSClient便会创建Block OutputStream,并向这次block写入pipeline中的第一个节点(最近的节点)开始写入block数据。

6.写完第一个block以后,依次按照datanode列表中的次远的node进行写入,直到最后一个block写入成功,DFSClient返回成功,该block写入操作结束。

通过以上策略,namenode在选择数据块的写入datanode列表时,就充分考虑到了将block副本分散在不同机架下,并同时尽量地避免了之前描述的网络开销。

链接:https://www.jianshu.com/p/372d25352d3a”

那么如果使用了纠删码机架感知策略会是怎样呢。本文Fayson会以四组不同大小的数据基于三种EC策略实操分析block的位置,从而说明HDFS纠删码的机架感知策略。

内容概述

1.测试环境说明

2.block放置策略测试

3.总结

4.附录:如何根据文件大小以及纠删码策略计算block group数量以及每个block的大小

测试版本

1.CM和CDH版本为6.0

2.Redhat7.4

3.集群已启用Kerberos

2.测试环境说明

1.Fayson的集群一共11个节点,包括1个管理节点和10个DataNode,然后将DataNode分配了4个机架rack1,rack2,rack3,rack4,每个机架下对应的节点数为3 3 3 1。因为Fayson只有10个DataNode,所以EC策略最高可以启用RS-6-3-1024k,而RS-10-4-1024k则无法使用因为至少需要14个DataNode,如下图所示:
在这里插入图片描述

2.具体的节点,角色和机架表格示意如下:

节点IP 角色 机架
172.31.1.163 DataNode rack1
172.31.11.232 DataNode rack1
172.31.11.9 DataNode rack1
172.31.12.114 DataNode rack2
172.31.12.142 DataNode rack2
172.31.13.13 DataNode rack2
172.31.13.166 DataNode rack3
172.31.13.38 DataNode rack3
172.31.4.105 DataNode rack3
172.31.6.83 Cloudera Manager/NameNode default
172.31.9.113 DataNode rack4

3.另外Fayson准备了4个文件,分别对应到不同的大小,如下表所示:

文件名 文件大小 备注
100m.csv 100MB 1个block
200m.csv 200MB 2个block
300m.csv 300MB 3个block
1211m.csv 1.2GB 10个block

在这里插入图片描述

4.分别在HDFS中创建4个目录,设置纠删码策略分别为XOR-2-1-1024k,RS-3-2-1024k,RS-6-3-1024k和无策略。

hadoop fs -mkdir /ec_XOR-2-1-1024k
hdfs ec -setPolicy -path /ec_XOR-2-1-1024k -policy XOR-2-1-1024k

hadoop fs -mkdir /ec_RS-3-2-1024k
hdfs ec -setPolicy -path /ec_RS-3-2-1024k -policy RS-3-2-1024k

hadoop fs -mkdir /ec_RS-6-3-1024k
hdfs ec -setPolicy -path /ec_RS-6-3-1024k -policy RS-6-3-1024k

hadoop fs -mkdir /no_ec

hdfs ec -getPolicy -path /ec_XOR-2-1-1024k
hdfs ec -getPolicy -path /ec_RS-3-2-1024k
hdfs ec -getPolicy -path /ec_RS-6-3-1024k
hdfs ec -getPolicy -path /no_ec

在这里插入图片描述
在这里插入图片描述

3.block放置策略测试

3.1.100MB文件

1.将准备好的100MB的文件分别put到在上章测试环境说明中的4个目录。

[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_XOR-2-1-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-3-2-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-6-3-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /no_ec
[root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec
Found 1 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv
Found 1 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv
Found 1 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv
Found 1 items
-rw-r--r--   3 fayson supergroup  104094922 2018-11-22 11:51 /no_ec/100m.csv

在这里插入图片描述

2.XOR-2-1-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k -files -blocks -locations

在这里插入图片描述

原始文件只有100MB,如果按照三副本策略,应该只有1个block(算上个3副本一共是3个),我们根据上图可以发现有一个block group,同样具有3个block文件,因为纠删码策略是XOR-2-1,所以2个block是原始文件,1个block是校验数据。以下再看看具体的block分布:

172.31.11.232节点属于rack1,放置第1份block,为原始数据,大小为50MB:
在这里插入图片描述

172.31.13.38节点属于rack3,放置第2份block,为原始数据,大小为50MB:
在这里插入图片描述

172.31.9.113节点属于rack4,放置第3份block,是校验数据,大小为50MB,直接cat查看为乱码:

在这里插入图片描述

汇总如下:

block 节点IP 大小 Rack 类型
blk_-9223372036854775504 172.31.11.232 50MB rack2 原始
blk_-9223372036854775503 172.31.13.38 50MB rack3 原始
blk_-9223372036854775502 172.31.9.113 50MB rack4 校验

3.RS-3-2-1024k目录的副本放置情况为:

hdfs fsck /ec_RS-3-2-1024k -files -blocks -locations

在这里插入图片描述

原始文件只有100MB,如果按照三副本策略,应该只有1个block(算上个3副本一共是3个),但是我们根据上图可以发现有一个block group,却有5个block文件,因为纠删码策略是RS-3-2,所以3个block是原始文件,2个block是校验数据。以下再看看具体的block分布:

172.31.12.114节点属于rack2,放置第1份block,为原始数据,大小为34MB:
在这里插入图片描述

172.31.12.142节点属于rack2,放置第2份block,为原始数据,大小为34MB:
在这里插入图片描述

172.31.1.163节点属于rack1,放置第3份block,为原始数据,大小为33MB:
在这里插入图片描述

172.31.9.113节点属于rack4,放置第4份block,为校验数据,大小为34MB,直接cat查看为乱码:

在这里插入图片描述

172.31.13.38节点属于rack3,放置第5份block,为校验数据,大小为34MB,直接cat查看为乱码:
在这里插入图片描述

汇总统计如下:

block 节点IP 大小 Rack 类型
blk_-9223372036854775488 172.31.12.114 34MB rack2 原始
blk_-9223372036854775487 172.31.12.142 34MB rack2 原始
blk_-9223372036854775486 172.31.1.163 33MB rack1 原始
blk_-9223372036854775485 172.31.9.113 34MB rack4 校验
blk_-9223372036854775484 172.31.13.38 34MB rack3 校验

4.RS-6-3-1024k目录的副本放置情况为:

hdfs fsck /ec_RS-6-3-1024k -files -blocks -locations

在这里插入图片描述

原始文件只有100MB,如果按照三副本策略,应该只有1个block(算上个3副本一共是3个),但是我们根据上图可以发现有一个block group,却有9个block文件,因为纠删码策略是RS-6-3,所以6个block是原始文件,3个block是校验数据。为了节省篇幅,具体的block分布Fayson不再一台一台机器查看,直接看下表:

block 节点IP 大小 Rack 类型
blk_-9223372036854775472 172.31.12.142 17MB rack2 原始
blk_-9223372036854775471 172.31.12.114 17MB rack2 原始
blk_-9223372036854775470 172.31.13.13 17MB rack2 原始
blk_-9223372036854775469 172.31.4.105 17MB rack3 原始
blk_-9223372036854775468 172.31.13.38 16MB rack3 原始
blk_-9223372036854775467 172.31.9.113 16MB rack4 原始
blk_-9223372036854775466 172.31.11.232 17MB rack1 校验
blk_-9223372036854775465 172.31.1.163 17MB rack1 校验
blk_-9223372036854775464 172.31.11.9 17MB rack1 校验

5.三副本目录的副本放置情况为:

hdfs fsck /no_ec -files -blocks -locations

在这里插入图片描述

block分布情况如下表所示:

block 节点IP 大小 Rack 类型
blk_1073753380 172.31.4.105 100MB rack3 原始
blk_1073753380 172.31.1.163 100MB rack1 原始
blk_1073753380 172.31.13.38 100MB rack3 原始

3.2.200MB文件

1.将准备好的200MB的文件分别put到在上章测试环境说明中的4个目录。

[root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_XOR-2-1-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_RS-3-2-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_RS-6-3-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /no_ec
[root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec
Found 2 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:55 /ec_XOR-2-1-1024k/200m.csv
Found 2 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:57 /ec_RS-3-2-1024k/200m.csv
Found 2 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:57 /ec_RS-6-3-1024k/200m.csv
Found 2 items
-rw-r--r--   3 fayson supergroup  104094922 2018-11-22 11:51 /no_ec/100m.csv
-rw-r--r--   3 fayson supergroup  208900504 2018-11-22 16:58 /no_ec/200m.csv
[root@ip-172-31-6-83 generatedata]#

在这里插入图片描述

2.XOR-2-1-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/200m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有200MB,如果按照三副本策略,应该只有2个block(算上个3副本一共是6个),但是我们根据上图可以发现有一个block group,却有3个block文件,因为纠删码策略是XOR-2-1,所以2个block是原始文件,1个block是校验数据。block的具体分布为:

block 节点IP 大小 Rack 类型
blk_-9223372036854775456 172.31.13.13 100MB rack2 原始
blk_-9223372036854775455 172.31.13.166 100MB rack3 原始
blk_-9223372036854775454 172.31.9.113 100MB rack4 校验

3.RS-3-2-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/200m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有200MB,如果按照三副本策略,应该只有2个block(算上个3副本一共是6个),但是我们根据上图可以发现有一个block group,却有5个block文件,因为纠删码策略是RS-3-2,所以3个block是原始文件,2个block是校验数据。block的具体分布为:

block 节点IP 大小 Rack 类型
blk_-9223372036854775440 172.31.4.105 67MB rack3 原始
blk_-9223372036854775439 172.31.13.166 67MB rack3 原始
blk_-9223372036854775438 172.31.12.142 66MB rack2 原始
blk_-9223372036854775437 172.31.9.113 67MB rack4 校验
blk_-9223372036854775436 172.31.11.9 67MB rack1 校验

4.RS-6-3-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/200m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有200MB,如果按照三副本策略,应该只有2个block(算上个3副本一共是6个),但是我们根据上图可以发现有一个block group,却有9个block文件,因为纠删码策略是RS-6-3,所以6个block是原始文件,3个block是校验数据。block的具体分布为:

block 节点IP 大小 Rack 类型
blk_-9223372036854775424 172.31.11.232 34MB rack1 原始
blk_-9223372036854775423 172.31.1.163 34MB rack1 原始
blk_-9223372036854775422 172.31.11.9 34MB rack1 原始
blk_-9223372036854775421 172.31.13.166 34MB rack3 原始
blk_-9223372036854775420 172.31.4.105 34MB rack3 原始
blk_-9223372036854775419 172.31.9.113 34MB rack4 原始
blk_-9223372036854775418 172.31.12.114 34MB rack2 校验
blk_-9223372036854775417 172.31.12.142 34MB rack2 校验
blk_-9223372036854775416 172.31.13.13 34MB rack2 校验

5.三副本目录的副本放置情况为:

hdfs fsck /no_ec/200m.csv -files -blocks -locations

在这里插入图片描述

block分布情况如下表所示:

block 节点IP 大小 Rack 类型
blk_1073753684 172.31.13.38, 172.31.4.105, 172.31.12.142 128MB rack3,rack3,rack2 原始
blk_ 1073753685 172.31.12.142, 172.31.13.13, 172.31.11.232 72MB rack2,rack2,rack1 原始

3.3.300MB文件

1.将准备好的300MB的文件分别put到在上章测试环境说明中的4个目录。

[root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_XOR-2-1-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_RS-3-2-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_RS-6-3-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /no_ec
[root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec
Found 3 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:55 /ec_XOR-2-1-1024k/200m.csv
-rw-r--r--   1 fayson supergroup  313817537 2018-11-22 17:40 /ec_XOR-2-1-1024k/300m.csv
Found 3 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:57 /ec_RS-3-2-1024k/200m.csv
-rw-r--r--   1 fayson supergroup  313817537 2018-11-22 17:40 /ec_RS-3-2-1024k/300m.csv
Found 3 items
-rw-r--r--   1 fayson supergroup  104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv
-rw-r--r--   1 fayson supergroup  208900504 2018-11-22 16:57 /ec_RS-6-3-1024k/200m.csv
-rw-r--r--   1 fayson supergroup  313817537 2018-11-22 17:40 /ec_RS-6-3-1024k/300m.csv
Found 3 items
-rw-r--r--   3 fayson supergroup  104094922 2018-11-22 11:51 /no_ec/100m.csv
-rw-r--r--   3 fayson supergroup  208900504 2018-11-22 16:58 /no_ec/200m.csv
-rw-r--r--   3 fayson supergroup  313817537 2018-11-22 17:40 /no_ec/300m.csv

在这里插入图片描述

2.XOR-2-1-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/300m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有300MB,如果按照三副本策略,应该只有3个block(算上个3副本一共是9个),但是我们根据上图可以发现有2个block group,却有6个block文件,因为纠删码策略是XOR-2-1,所以在每个block group中,2个block是原始文件,1个block是校验数据。block的具体分布为:

block group block 节点IP 大小 Rack 类型
0 blk_-9223372036854775408 172.31.11.232 128MB rack1 原始
0 blk_-9223372036854775407 172.31.9.113 128MB rack4 原始
0 blk_-9223372036854775406 172.31.12.114 128MB rack2 校验
1 blk_-9223372036854775392 172.31.13.38 22MB rack3 原始
1 blk_-9223372036854775391 172.31.9.113 22MB rack4 原始
1 blk_-9223372036854775390 172.31.1.163 22MB rack1 校验

3.RS-3-2-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/300m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有300MB,如果按照三副本策略,应该只有3个block(算上个3副本一共是9个),但是我们根据上图可以发现有一个block group,却有5个block文件,因为纠删码策略是RS-3-2,所以3个block是原始文件,2个block是校验数据。block的具体分布为:

block 节点IP 大小 Rack 类型
blk_-9223372036854775376 172.31.9.113 100MB rack4 原始
blk_-9223372036854775375 172.31.11.232 100MB rack1 原始
blk_-9223372036854775374 172.31.11.9 100MB rack1 原始
blk_-9223372036854775373 172.31.13.38 100MB rack3 校验
blk_-9223372036854775372 172.31.13.13 100MB rack2 校验

4.RS-6-3-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/300m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有300MB,如果按照三副本策略,应该只有3个block(算上个3副本一共是9个),但是我们根据上图可以发现有一个block group,却有9个block文件,因为纠删码策略是RS-6-3,所以6个block是原始文件,3个block是校验数据。block的具体分布为:

block 节点IP 大小 Rack 类型
blk_-9223372036854775360 172.31.13.13 50MB rack2 原始
blk_-9223372036854775359 172.31.12.114 50MB rack2 原始
blk_-9223372036854775358 172.31.12.142 50MB rack2 原始
blk_-9223372036854775357 172.31.13.38 50MB rack3 原始
blk_-9223372036854775356 172.31.4.105 50MB rack3 原始
blk_-9223372036854775355 172.31.9.113 50MB rack4 原始
blk_-9223372036854775354 172.31.1.163 50MB rack1 校验
blk_-9223372036854775353 172.31.11.232 50MB rack1 校验
blk_-9223372036854775352 172.31.11.9 50MB rack1 校验

6.三副本目录的副本放置情况为:

hdfs fsck /no_ec/300m.csv -files -blocks -locations

在这里插入图片描述

block分布情况如下表所示:

block 节点IP 大小 Rack 类型
blk_1073753728 172.31.13.166, 172.31.4.105, 172.31.11.9 128MB rack3,rack3,rack1 原始
blk_1073753729 172.31.9.113, 172.31.13.13, 172.31.12.142 128MB rack4,rack2,rack2 原始
blk_1073753730 172.31.13.13, 172.31.12.114, 172.31.13.38 44MB rack2,rack2,rack3 原始

3.4.1211MB文件

1.将准备好的1211MB的文件分别put到在上章测试环境说明中的4个目录。

[root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_XOR-2-1-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_RS-3-2-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_RS-6-3-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /no_ec 
[root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k  /no_ec

在这里插入图片描述

2.XOR-2-1-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/1211m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有1211MB,如果按照三副本策略,应该只有10个block(算上3副本为30个block),但是我们根据上图可以发现有5个block group,每个group有3个block,一共15个block。因为纠删码策略是XOR-2-1,所以在每个block group中,2个block是原始文件,1个block是校验数据。block的具体分布为:

block group block 节点IP 大小 Rack 类型
0 blk_-9223372036854775344 172.31.9.113 128MB rack4 原始
0 blk_-9223372036854775343 172.31.12.114 128MB rack2 原始
0 blk_-9223372036854775342 172.31.4.105 128MB rack3 校验
group123略
4 blk_-9223372036854775280 172.31.1.163 94MB rack1 原始
4 blk_-9223372036854775279 172.31.13.166 94MB rack3 原始
4 blk_-9223372036854775278 172.31.12.114 94MB rack2 校验

3.RS-3-2-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/1211m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有1211MB,如果按照三副本策略,应该只有10个block(算上3副本为30个block),但是我们根据上图可以发现有4个block group,每个group有5个block,一共20个block。因为纠删码策略是RS-3-2,所以在每个block group中,3个block是原始文件,2个block是校验数据。block的具体分布为:

block group block 节点IP 大小 Rack 类型
0 blk_-9223372036854775264 172.31.4.105 128MB rack3 原始
0 blk_-9223372036854775263 172.31.13.166 128MB rack3 原始
0 blk_-9223372036854775262 172.31.12.114 128MB rack2 原始
0 blk_-9223372036854775261 172.31.9.113 128MB rack4 校验
0 blk_-9223372036854775260 172.31.11.232 128MB rack1 校验
group12略
3 blk_-9223372036854775216 172.31.13.166 20MB rack3 原始
3 blk_-9223372036854775215 172.31.4.105 20MB rack3 原始
3 blk_-9223372036854775214 172.31.13.13 20MB rack2 原始
3 blk_-9223372036854775213 172.31.9.113 20MB rack4 校验
3 blk_-9223372036854775212 172.31.1.163 20MB rack1 校验

4.RS-6-3-1024k目录的副本放置情况为:

[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/1211m.csv -files -blocks -locations

在这里插入图片描述

原始文件只有1211MB,如果按照三副本策略,应该只有10个block(算上3副本为30个block),但是我们根据上图可以发现有2个block group,每个group有9个block,一共18个block。因为纠删码策略是RS-6-3,所以在每个block group中,6个block是原始文件,3个block是校验数据。block的具体分布为:

block group block 节点IP 大小 Rack 类型
0 blk_-9223372036854775200 172.31.12.114 128MB rack2 原始
0 blk_-9223372036854775199 172.31.12.142 128MB rack2 原始
0 blk_-9223372036854775198 172.31.13.13 128MB rack2 原始
0 blk_-9223372036854775197 172.31.11.9 128MB rack1 原始
0 blk_-9223372036854775196 172.31.11.232 128MB rack1 原始
0 blk_-9223372036854775195 172.31.1.163 128MB rack1 原始
0 blk_-9223372036854775194 172.31.13.166 128MB rack3 校验
0 blk_-9223372036854775193 172.31.4.105 128MB rack3 校验
0 blk_-9223372036854775192 172.31.9.113 128MB rack4 校验
1 blk_-9223372036854775184 172.31.9.113 74MB rack4 原始
1 blk_-9223372036854775183 172.31.1.163 74MB rack1 原始
1 blk_-9223372036854775182 172.31.11.9 74MB rack1 原始
1 blk_-9223372036854775181 172.31.12.142 74MB rack2 原始
1 blk_-9223372036854775180 172.31.13.13 74MB rack2 原始
1 blk_-9223372036854775179 172.31.12.114 74MB rack2 原始
1 blk_-9223372036854775178 172.31.13.166 74MB rack3 校验
1 blk_-9223372036854775177 172.31.13.38 74MB rack3 校验
1 blk_-9223372036854775176 172.31.4.105 74MB rack3 校验

5.三副本目录的副本放置情况为:

hdfs fsck /no_ec/1211m.csv -files -blocks -locations

在这里插入图片描述

block分布情况如下表所示:

block 节点IP 大小 Rack 类型
blk_1073753812 172.31.12.114, 172.31.12.142, 172.31.11.232 128MB rack2,rack2,rack1 原始
blk_1073753813, blk_1073753814, blk_1073753815, blk_1073753816, blk_1073753817, blk_1073753818, blk_1073753819, blk_1073753820略
blk_1073753821 172.31.1.163, 172.31.11.232, 172.31.13.166 60MB rack1,rack1,rack3 原始

4.总结

以下数据基于CDH6.0.0的HDFS默认block size为128MB,是对本文第三节的一个汇总。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.三副本方式的每个block的副本放置策略与Hadoop2(CDH5.x)之前一致,即第一个副本在一个加价,第二个和第三个副本在另外的机架。

2.对于小文件比如本文测试环境的100MB,200MB,使用条带宽度比较大的纠删码策略RS (6,3)最终保存的block数会比三副本方式还多,比如100MB和200MB的文件对于RS (6,3)均为9个block,而三副本方式则分别为3个和6个,在这种情况下,使用纠删码会带NameNode带来小文件过多的压力,而当文件较大如本文测试所使用过的1211MB的文件,RS (6,3)为18个block,而三副本方式则为30个,大大减少了block的数量。所以放置集群中block数过多,不建议对小文件使用纠删码策略,或者对小文件则使用条带宽度较小的纠删码策略比如XOR(2,1)。Hadoop小文件问题参考Fayson之前的文章《0403-如何在Hadoop中处理小文件》,《0405-如何使用Impala合并小文件》和《0455-如何在Hadoop中处理小文件-续》。

3.使用纠删码后,对集群的CPU和网络资源要求会更高。

4.编码和解码在HDFS客户端和DataNode都会消耗额外的CPU。

5.纠删码要求集群中的数据节点数最少与EC条带宽度相同。比如RS (6,3),意味着至少需要9个DataNode,否则纠删码策略也无法应用成功,可以参考Fayson之前的文章《0434-如何在CDH6.0中使用纠删码》。

6.纠删码文件包括原始数据文件和校验数据会分布在各个机架中,以实现机架容错(rack fault-tolerance)。这意味着在读取和写入条带文件时,大多数操作都需要跨机架访问。所以对分带宽(bisection bandwidth)非常重要。

7.对于机架容错,机架的个数最好与EC条带宽度一致,比如RS(6,3),你最少需要9个机架,理想情况下10个以上会更好,以预防意外停机。如果机架个数少于条带宽度,HDFS无法保证机架容错,但会尽量将条带文件存储在尽可能多的节点上以保证节点级别的容错。参考本文第三章节,Fayson本次测试的无论是100MB,200MB,300MB还是1211MB文件,纠删码的每一个block group里的每个block都尽可能分布在不同的机架上,然后每个block必然是在不同的节点上。你若有兴趣仔细分析上面的4个Excel表格也可以看出来。

8.假设你的集群跨9个机架,则RS-10-4-1024k策略无法保证机架容错,建议你选择RS-6-3-1024k或RS-3-2-1024k可能更合适。如果管理员只关心节点级别容错,则你的集群只要有14个DataNode,则依旧可以选用RS-10-4-1024k。

参考:

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

5.附录:如何根据文件大小以及纠删码策略计算block group数量以及每个block的大小

假设HDFS的block size为128MB,文件大小为filesize(单位为MB),纠删码策略为RS(a,b),以下分几种情况进行说明:

1.如果filesize小于等于默认条带cell大小1MB,则不管你的纠删码策略a或b的值为多少,原始数据block只有1个,校验数据block则还是b个。这一点你依旧可以参考Fayson之前的文章《0434-如何在CDH6.0中使用纠删码》,里面有举例使用一个几KB的文件进行测试验证。

2.如果1MB<filesize<a*1MB,block group只有一个,这个block group里的block个数和大小参考以下公式:

#基于纠删码的策略R(a,b),在不同文件大小计算的情况下切分的Block数量
cellsize = 1MB; #纠删码底层定义每个Cell的默认大小

0 < filesize <= (a * cellsize) 的情况下Block数量及每个Block大小计算方式:
#拆分的block梳理 
blockcount = Math.ceil(filesize/cellsize), Math.ceil()为向上取舍(如1.2取舍后为2)
#前blockcount-1个block,每个block的大小
block_file_size[1...(n-1)] = cellsize
#最后一个block的大小
block_file_size[n] = filesize - (blockcount-1) * cellsize

举1个栗子帮助理解:

假设filesize=1.5MB,纠删码策略为XOR(2,1),则block group只有一个,这个block group里会有2个原始数据block,每个block的大小为1MB,0.5MB,1个校验数据block,每个block的大小也为1MB。

3.如果a*1MB<=filesize<=a*128MB,block group只有一个,这个block group里会有a个原始数据block,每个block的大小为filesize/a,b个校验数据block,每个block的大小也为filesize/a,注意这里每个block的大小其实已经违背了三副本方式默认block size的128MB的方式(即尽量会按照128MB拆分),纠删码的方式会先保证有足够的原始数据block数,采用的是均分的方式。

举几个栗子帮助理解:

假设filesize=2.5MB,纠删码策略为XOR(2,1),则block group只有一个,这个block group里会有2个原始数据block,每个block的大小为2.5MB/2=1.25MB,1个校验数据block,每个block的大小也为1.25MB。

假设filesize=2.5MB,纠删码策略为RS(6,3),则block group只有一个,这个block group里会有3个原始数据block,每个block的大小为1MB,1MB,0.5MB(因为2.5MB/6小于1MB,所以会以cell size进行拆分),1个校验数据block,每个block的大小也为1MB。

假设filesize=100MB,即本文测试的场景之一,纠删码策略为XOR(2,1),则block group只有一个,这个block group里会有2个原始数据block,每个block的大小为100MB/2=50MB,1个校验数据block,每个block的大小也为50MB。具体参考第三章。

假设filesize=100MB,即本文测试的场景之一,如果纠删码策略RS(6,3),则block group只有一个,这个block group里会有6个原始数据block,每个block的大小为100MB/6=17MB,3个校验数据block,每个block的大小也为17MB。具体参考第三章。

假设filesize=200MB,即本文测试的场景之一,纠删码策略为XOR(2,1),则block group只有一个,这个block group里会有2个原始数据block,每个block的大小为200MB/2=100MB,1个校验数据block,每个block的大小也为100MB。如果纠删码策略RS(6,3),则block group只有一个,这个block group里会有6个原始数据block,每个block的大小为200MB/6=34MB,3个校验数据block,每个block的大小也为34MB。具体参考第三章。

4.如果filesize>a*128MB,block group有n=filesize/(a*128MB)个(n的值向上取舍)。前n-1个block group每个group都会有a个原始数据block,每个block的大小为128MB,b个校验数据block,每个block的大小为128MB。最后第n个block group里的原始数据block会稍微复杂,具体多少个或多大又会进入前面1,2,3情况的判断。

举几个栗子帮助理解:

假设filesize=300MB,即本文测试的场景之一,纠删码策略为XOR(2,1),则block group有2个,第一个block group里会有2个原始数据block,每个block的大小为128MB,1个校验数据block,每个block的大小也为128MB。第二个block group里会有2个原始数据block,每个block的大小为22MB,1个校验数据block,每个block的大小也为22MB。如果纠删码策略RS(6,3),则block group只有一个,这个block group里会有6个原始数据block,每个block的大小为300MB/6=50MB,3个校验数据block,每个block的大小也为50MB。具体参考第三章。

假设filesize=257MB,即本文测试的场景之一,纠删码策略为XOR(2,1),则block group有2个,第一个block group里会有2个原始数据block,每个block的大小为128MB,1个校验数据block,每个block的大小也为128MB。第二个block group里会有1个原始数据block,block的大小为1MB,1个校验数据block,block的大小也为1MB。如果纠删码策略RS(6,3),则block group只有一个,这个block group里会有6个原始数据block,每个block的大小为257MB/6=43MB,3个校验数据block,每个block的大小也为43M。

备注:对于上面1,2,3三种情况,都只有一个block group,也可以简单点以Java语言的方式表示:

#基于纠删码的策略R(a,b),在不同文件大小计算的情况下切分的Block数量
cellsize = 1MB; #纠删码底层定义每个Cell的默认大小

0 < filesize <= (a * cellsize) 的情况下Block数量及每个Block大小计算方式:
#拆分的block梳理 
blockcount = Math.ceil(filesize/cellsize), Math.ceil()为向上取舍(如1.2取舍后为2)
#前blockcount-1个block,每个block的大小
block_file_size[1...(n-1)] = cellsize
#最后一个block的大小
block_file_size[n] = filesize - (blockcount-1) * cellsize

a * cellsize < filesize < a * 128MB 的情况下Block数量及每个Block大小计算方式:
#拆分的block数量即为纠删码策略的a
blockcount = a
#每个block文件的大小平均分配
block_file_size = filesize / a

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
在这里插入图片描述

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

猜你喜欢

转载自blog.csdn.net/Hadoop_SC/article/details/84594366