温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
提示:代码块部分可以左右滑动查看噢
1
文章编写目的
Fayson在前面的文章中对Hadoop3的新特性之一纠删码进行过介绍,参考《什么是HDFS的纠删码》,后面又对纠删码的使用进行了实操,参考《如何在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 | 原始 |
blk_-9223372036854775407 | 172.31.9.113 | 128MB | rack4 | 原始 | |
blk_-9223372036854775406 | 172.31.12.114 | 128MB | rack2 | 校验 | |
1 | blk_-9223372036854775392 | 172.31.13.38 | 22MB | rack3 | 原始 |
blk_-9223372036854775391 | 172.31.9.113 | 22MB | rack4 | 原始 | |
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 | 原始 |
blk_-9223372036854775343 | 172.31.12.114 | 128MB | rack2 | 原始 | |
blk_-9223372036854775342 | 172.31.4.105 | 128MB | rack3 | 校验 | |
group123略 | |||||
4 | blk_-9223372036854775280 | 172.31.1.163 | 94MB | rack1 | 原始 |
blk_-9223372036854775279 | 172.31.13.166 | 94MB | rack3 | 原始 | |
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 | 原始 |
blk_-9223372036854775263 | 172.31.13.166 | 128MB | rack3 | 原始 | |
blk_-9223372036854775262 | 172.31.12.114 | 128MB | rack2 | 原始 | |
blk_-9223372036854775261 | 172.31.9.113 | 128MB | rack4 | 校验 | |
blk_-9223372036854775260 | 172.31.11.232 | 128MB | rack1 | 校验 | |
group12略 | |||||
3 | blk_-9223372036854775216 | 172.31.13.166 | 20MB | rack3 | 原始 |
blk_-9223372036854775215 | 172.31.4.105 | 20MB | rack3 | 原始 | |
blk_-9223372036854775214 | 172.31.13.13 | 20MB | rack2 | 原始 | |
blk_-9223372036854775213 | 172.31.9.113 | 20MB | rack4 | 校验 | |
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 | 原始 |
blk_-9223372036854775199 | 172.31.12.142 | 128MB | rack2 | 原始 | |
blk_-9223372036854775198 | 172.31.13.13 | 128MB | rack2 | 原始 | |
blk_-9223372036854775197 | 172.31.11.9 | 128MB | rack1 | 原始 | |
blk_-9223372036854775196 | 172.31.11.232 | 128MB | rack1 | 原始 | |
blk_-9223372036854775195 | 172.31.1.163 | 128MB | rack1 | 原始 | |
blk_-9223372036854775194 | 172.31.13.166 | 128MB | rack3 | 校验 | |
blk_-9223372036854775193 | 172.31.4.105 | 128MB | rack3 | 校验 | |
blk_-9223372036854775192 | 172.31.9.113 | 128MB | rack4 | 校验 | |
1 | blk_-9223372036854775184 | 172.31.9.113 | 74MB | rack4 | 原始 |
blk_-9223372036854775183 | 172.31.1.163 | 74MB | rack1 | 原始 | |
blk_-9223372036854775182 | 172.31.11.9 | 74MB | rack1 | 原始 | |
blk_-9223372036854775181 | 172.31.12.142 | 74MB | rack2 | 原始 | |
blk_-9223372036854775180 | 172.31.13.13 | 74MB | rack2 | 原始 | |
blk_-9223372036854775179 | 172.31.12.114 | 74MB | rack2 | 原始 | |
blk_-9223372036854775178 | 172.31.13.166 | 74MB | rack3 | 校验 | |
blk_-9223372036854775177 | 172.31.13.38 | 74MB | rack3 | 校验 | |
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之前的文章《如何在Hadoop中处理小文件》,《如何使用Impala合并小文件》和《如何在Hadoop中处理小文件-续》。
3.使用纠删码后,对集群的CPU和网络资源要求会更高。
4.编码和解码在HDFS客户端和DataNode都会消耗额外的CPU。
5.纠删码要求集群中的数据节点数最少与EC条带宽度相同。比如RS (6,3),意味着至少需要9个DataNode,否则纠删码策略也无法应用成功,可以参考Fayson之前的文章《如何在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之前的文章《如何在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实操