前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0460-HDFS纠删码的机架感知

0460-HDFS纠删码的机架感知

作者头像
Fayson
发布2018-12-17 11:51:52
1.1K0
发布2018-12-17 11:51:52
举报
文章被收录于专栏:Hadoop实操Hadoop实操

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

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

提示:代码块部分可以左右滑动查看噢

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和无策略。

代码语言:javascript
复制
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个目录。

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
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目录的副本放置情况为:

代码语言:javascript
复制
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.三副本目录的副本放置情况为:

代码语言:javascript
复制
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个目录。

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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.三副本目录的副本放置情况为:

代码语言:javascript
复制
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个目录。

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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.三副本目录的副本放置情况为:

代码语言:javascript
复制
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个目录。

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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目录的副本放置情况为:

代码语言:javascript
复制
[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.三副本目录的副本放置情况为:

代码语言:javascript
复制
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个数和大小参考以下公式:

代码语言:javascript
复制
#基于纠删码的策略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语言的方式表示:

代码语言:javascript
复制
#基于纠删码的策略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

(可左右滑动)

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档