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,如下图所示:
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和无策略。
[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]
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]
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]
原始文件只有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目录的副本放置情况为:
[mw_shl_code=shell,true]hdfs fsck /ec_RS-3-2-1024k -files -blocks -locations[/mw_shl_code]
原始文件只有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目录的副本放置情况为:
[mw_shl_code=shell,true]hdfs fsck /ec_RS-6-3-1024k -files -blocks -locations[/mw_shl_code]
原始文件只有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]
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]
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]
原始文件只有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]
原始文件只有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]
原始文件只有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]
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]
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]
原始文件只有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
| 类型
|
| blk_-9223372036854775408
| 172.31.11.232
| 128MB
| rack1
| 原始
|
blk_-9223372036854775407
| 172.31.9.113
| 128MB
| rack4
| 原始
|
blk_-9223372036854775406
| 172.31.12.114
| 128MB
| rack2
| 校验
|
| 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]
原始文件只有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]
原始文件只有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]
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]
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]
原始文件只有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
| 类型
|
| 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略
|
| 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]
原始文件只有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
| 类型
|
| 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略
|
| 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]
原始文件只有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]
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,是对本文第三节的一个汇总。
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表格也可以看出来。
附录:如何根据文件大小以及纠删码策略计算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实操