0460-HDFS纠删码的机架感知

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.163DataNoderack1
172.31.11.232DataNoderack1
172.31.11.9DataNoderack1
172.31.12.114DataNoderack2
172.31.12.142DataNoderack2
172.31.13.13DataNoderack2
172.31.13.166DataNoderack3
172.31.13.38DataNoderack3
172.31.4.105DataNoderack3
172.31.6.83Cloudera Manager/NameNodedefault
172.31.9.113DataNoderack4

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

文件名文件大小备注
100m.csv100MB1个block
200m.csv200MB2个block
300m.csv300MB3个block
1211m.csv1.2GB10个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_-9223372036854775504172.31.11.23250MBrack2原始
blk_-9223372036854775503172.31.13.3850MBrack3原始
blk_-9223372036854775502172.31.9.11350MBrack4校验

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_-9223372036854775488172.31.12.11434MBrack2原始
blk_-9223372036854775487172.31.12.14234MBrack2原始
blk_-9223372036854775486172.31.1.16333MBrack1原始
blk_-9223372036854775485172.31.9.11334MBrack4校验
blk_-9223372036854775484172.31.13.3834MBrack3校验

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_-9223372036854775472172.31.12.14217MBrack2原始
blk_-9223372036854775471172.31.12.11417MBrack2原始
blk_-9223372036854775470172.31.13.1317MBrack2原始
blk_-9223372036854775469172.31.4.10517MBrack3原始
blk_-9223372036854775468172.31.13.3816MBrack3原始
blk_-9223372036854775467172.31.9.11316MBrack4原始
blk_-9223372036854775466172.31.11.23217MBrack1校验
blk_-9223372036854775465172.31.1.16317MBrack1校验
blk_-9223372036854775464172.31.11.917MBrack1校验

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

hdfs fsck /no_ec -files -blocks -locations

在这里插入图片描述

block分布情况如下表所示:

block节点IP大小Rack类型
blk_1073753380172.31.4.105100MBrack3原始
blk_1073753380172.31.1.163100MBrack1原始
blk_1073753380172.31.13.38100MBrack3原始

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_-9223372036854775456172.31.13.13100MBrack2原始
blk_-9223372036854775455172.31.13.166100MBrack3原始
blk_-9223372036854775454172.31.9.113100MBrack4校验

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_-9223372036854775440172.31.4.10567MBrack3原始
blk_-9223372036854775439172.31.13.16667MBrack3原始
blk_-9223372036854775438172.31.12.14266MBrack2原始
blk_-9223372036854775437172.31.9.11367MBrack4校验
blk_-9223372036854775436172.31.11.967MBrack1校验

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_-9223372036854775424172.31.11.23234MBrack1原始
blk_-9223372036854775423172.31.1.16334MBrack1原始
blk_-9223372036854775422172.31.11.934MBrack1原始
blk_-9223372036854775421172.31.13.16634MBrack3原始
blk_-9223372036854775420172.31.4.10534MBrack3原始
blk_-9223372036854775419172.31.9.11334MBrack4原始
blk_-9223372036854775418172.31.12.11434MBrack2校验
blk_-9223372036854775417172.31.12.14234MBrack2校验
blk_-9223372036854775416172.31.13.1334MBrack2校验

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

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

在这里插入图片描述

block分布情况如下表所示:

block节点IP大小Rack类型
blk_1073753684172.31.13.38, 172.31.4.105, 172.31.12.142128MBrack3,rack3,rack2原始
blk_ 1073753685172.31.12.142, 172.31.13.13, 172.31.11.23272MBrack2,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 groupblock节点IP大小Rack类型
0blk_-9223372036854775408172.31.11.232128MBrack1原始
0blk_-9223372036854775407172.31.9.113128MBrack4原始
0blk_-9223372036854775406172.31.12.114128MBrack2校验
1blk_-9223372036854775392172.31.13.3822MBrack3原始
1blk_-9223372036854775391172.31.9.11322MBrack4原始
1blk_-9223372036854775390172.31.1.16322MBrack1校验

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_-9223372036854775376172.31.9.113100MBrack4原始
blk_-9223372036854775375172.31.11.232100MBrack1原始
blk_-9223372036854775374172.31.11.9100MBrack1原始
blk_-9223372036854775373172.31.13.38100MBrack3校验
blk_-9223372036854775372172.31.13.13100MBrack2校验

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_-9223372036854775360172.31.13.1350MBrack2原始
blk_-9223372036854775359172.31.12.11450MBrack2原始
blk_-9223372036854775358172.31.12.14250MBrack2原始
blk_-9223372036854775357172.31.13.3850MBrack3原始
blk_-9223372036854775356172.31.4.10550MBrack3原始
blk_-9223372036854775355172.31.9.11350MBrack4原始
blk_-9223372036854775354172.31.1.16350MBrack1校验
blk_-9223372036854775353172.31.11.23250MBrack1校验
blk_-9223372036854775352172.31.11.950MBrack1校验

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

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

在这里插入图片描述

block分布情况如下表所示:

block节点IP大小Rack类型
blk_1073753728172.31.13.166, 172.31.4.105, 172.31.11.9128MBrack3,rack3,rack1原始
blk_1073753729172.31.9.113, 172.31.13.13, 172.31.12.142128MBrack4,rack2,rack2原始
blk_1073753730172.31.13.13, 172.31.12.114, 172.31.13.3844MBrack2,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 groupblock节点IP大小Rack类型
0blk_-9223372036854775344172.31.9.113128MBrack4原始
0blk_-9223372036854775343172.31.12.114128MBrack2原始
0blk_-9223372036854775342172.31.4.105128MBrack3校验
group123略
4blk_-9223372036854775280172.31.1.16394MBrack1原始
4blk_-9223372036854775279172.31.13.16694MBrack3原始
4blk_-9223372036854775278172.31.12.11494MBrack2校验

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 groupblock节点IP大小Rack类型
0blk_-9223372036854775264172.31.4.105128MBrack3原始
0blk_-9223372036854775263172.31.13.166128MBrack3原始
0blk_-9223372036854775262172.31.12.114128MBrack2原始
0blk_-9223372036854775261172.31.9.113128MBrack4校验
0blk_-9223372036854775260172.31.11.232128MBrack1校验
group12略
3blk_-9223372036854775216172.31.13.16620MBrack3原始
3blk_-9223372036854775215172.31.4.10520MBrack3原始
3blk_-9223372036854775214172.31.13.1320MBrack2原始
3blk_-9223372036854775213172.31.9.11320MBrack4校验
3blk_-9223372036854775212172.31.1.16320MBrack1校验

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 groupblock节点IP大小Rack类型
0blk_-9223372036854775200172.31.12.114128MBrack2原始
0blk_-9223372036854775199172.31.12.142128MBrack2原始
0blk_-9223372036854775198172.31.13.13128MBrack2原始
0blk_-9223372036854775197172.31.11.9128MBrack1原始
0blk_-9223372036854775196172.31.11.232128MBrack1原始
0blk_-9223372036854775195172.31.1.163128MBrack1原始
0blk_-9223372036854775194172.31.13.166128MBrack3校验
0blk_-9223372036854775193172.31.4.105128MBrack3校验
0blk_-9223372036854775192172.31.9.113128MBrack4校验
1blk_-9223372036854775184172.31.9.11374MBrack4原始
1blk_-9223372036854775183172.31.1.16374MBrack1原始
1blk_-9223372036854775182172.31.11.974MBrack1原始
1blk_-9223372036854775181172.31.12.14274MBrack2原始
1blk_-9223372036854775180172.31.13.1374MBrack2原始
1blk_-9223372036854775179172.31.12.11474MBrack2原始
1blk_-9223372036854775178172.31.13.16674MBrack3校验
1blk_-9223372036854775177172.31.13.3874MBrack3校验
1blk_-9223372036854775176172.31.4.10574MBrack3校验

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

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

在这里插入图片描述

block分布情况如下表所示:

block节点IP大小Rack类型
blk_1073753812172.31.12.114, 172.31.12.142, 172.31.11.232128MBrack2,rack2,rack1原始
blk_1073753813, blk_1073753814, blk_1073753815, blk_1073753816, blk_1073753817, blk_1073753818, blk_1073753819, blk_1073753820略
blk_1073753821172.31.1.163, 172.31.11.232, 172.31.13.16660MBrack1,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实操

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值