分享

通过实践验证HDFS纠删码的机架感知策略

本帖最后由 fc013 于 2018-11-24 17:17 编辑

问题导读:

1.什么情况下不建议对小文件使用纠删码策略?
2.怎样进行机架容错?
3.如何根据文件大小以及纠删码策略计算block group数量以及每个block的大小?

最新经典文章,欢迎关注公众号


文章编写目的

本文以四组不同大小的数据基于三种EC策略实操分析block的位置,从而说明HDFS纠删码的机架感知策略。

  • 内容概述
1.测试环境说明
2.block放置策略测试
3.总结
4.附录:如何根据文件大小以及纠删码策略计算block group数量以及每个block的大小

  • 测试版本
1.CM和CDH版本为6.0
2.Redhat7.4
3.集群已启用Kerberos

测试环境说明

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,如下图所示:

640.jpg

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

640.png

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

[mw_shl_code=shell,true]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[/mw_shl_code]

640.png

640.jpg

block放置策略测试

100MB文件

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

[mw_shl_code=shell,true][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[/mw_shl_code]

640.jpg

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

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

640.jpg

原始文件只有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:

640.jpg

172.31.13.38节点属于rack3,放置第2份block,为原始数据,大小为50MB:

640.jpg

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

640.jpg

汇总如下:

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目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /ec_RS-3-2-1024k -files -blocks -locations[/mw_shl_code]

640.jpg

原始文件只有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:

640.jpg

172.31.12.142节点属于rack2,放置第2份block,为原始数据,大小为34MB:

640.jpg

172.31.1.163节点属于rack1,放置第3份block,为原始数据,大小为33MB:

640.jpg

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

640.jpg

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

640.jpg

汇总统计如下:

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目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /ec_RS-6-3-1024k -files -blocks -locations[/mw_shl_code]

640.jpg

原始文件只有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.三副本目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /no_ec -files -blocks -locations[/mw_shl_code]

640.jpg

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
原始

200MB文件

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

[mw_shl_code=shell,true][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]#[/mw_shl_code]

640.jpg

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

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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.三副本目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /no_ec/200m.csv -files -blocks -locations[/mw_shl_code]

640.jpg

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
原始

300MB文件

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

[mw_shl_code=shell,true][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[/mw_shl_code]

640.jpg

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

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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.三副本目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /no_ec/300m.csv -files -blocks -locations[/mw_shl_code]

640.jpg

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
原始

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

[mw_shl_code=shell,true][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[/mw_shl_code]

640.jpg

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

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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目录的副本放置情况为:

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

640.jpg

原始文件只有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.三副本目录的副本放置情况为:

[mw_shl_code=shell,true]hdfs fsck /no_ec/1211m.csv -files -blocks -locations[/mw_shl_code]

640.jpg

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
原始

总结

以下数据基于CDH6.0.0的HDFS默认block size为128MB,是对本文第三节的一个汇总。

640.jpg

640.jpg

640.jpg

640.jpg

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)。

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

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

5.纠删码要求集群中的数据节点数最少与EC条带宽度相同。比如RS (6,3),意味着至少需要9个DataNode,否则纠删码策略也无法应用成功。

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

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

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

1.如果filesize小于等于默认条带cell大小1MB,则不管你的纠删码策略a或b的值为多少,原始数据block只有1个,校验数据block则还是b个。

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

[mw_shl_code=shell,true]#基于纠删码的策略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[/mw_shl_code]

举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语言的方式表示:

[mw_shl_code=shell,true]#基于纠删码的策略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[/mw_shl_code]




来源: weixin
作者: Fayson Hadoop实操

原文链接:0460-HDFS纠删码的机架感知




已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条