首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >0460-HDFS纠删码的机架感知

0460-HDFS纠删码的机架感知

作者头像
Fayson
发布于 2018-12-17 03:51:52
发布于 2018-12-17 03:51:52
1.3K0
举报
文章被收录于专栏: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
AI代码解释
复制
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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
[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
AI代码解释
复制
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
AI代码解释
复制
#基于纠删码的策略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
AI代码解释
复制
#基于纠删码的策略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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在CDH6.0中使用纠删码
Fayson在前面的文章中介绍过《什么是HDFS的纠删码》,当时详细介绍了什么是纠删码,纠删码的实现原理,以及一些Benchmark的结果比较。
Fayson
2018/11/16
4.4K0
什么是HDFS的纠删码
Fayson在前面的文章中介绍过CDH6,参考《Cloudera Enterprise 6正式发布》和《如何在Redhat7.4安装CDH6.0》。CDH6主要集成打包了Hadoop3,包括Hadoop3的一些新特性的官方支持,比如NameNode联邦,纠删码等。纠删码可以将HDFS的存储开销降低约50%,同时与三分本策略一样,还可以保证数据的可用性。本文Fayson主要介绍纠删码的工作原理。
Fayson
2018/11/16
5.9K0
详解HDFS3.x新特性-纠删码
EC(纠删码)是一种编码技术,在HDFS之前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用最广泛(RAID介绍:大数据预备知识-存储磁盘、磁盘冗余阵列RAID介绍),RAID通过条带化技术实现EC,条带化技术就是一种自动将 I/O 的负载均衡到多个物理磁盘上的技术,原理就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去,这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突(当多个进程同时访问一个磁盘时,可能会出现磁盘冲突),而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。在HDFS中,把连续的数据分成很多的小部分称为条带化单元,对于原始数据单元的每个条带单元,都会计算并存储一定数量的奇偶检验单元,计算的过程称为编码,可以通过基于剩余数据和奇偶校验单元的解码计算来恢复任何条带化单元上的错误。
五分钟学大数据
2021/01/15
2K0
纯干货 | 深入剖析 HDFS 3.x 新特性-纠删码
HDFS是一个高吞吐、高容错的分布式文件系统,但是HDFS在保证高容错的同时也带来了高昂的存储成本,比如有5T的数据存储在HDFS上,按照HDFS的默认3副本机制,将会占用15T的存储空间。那么有没有一种能达到和副本机制相同的容错能力但是能大幅度降低存储成本的机制呢,有,就是在HDFS 3.x 版本引入的纠删码机制。
五分钟学大数据
2021/04/01
2.2K0
Hadoop3.0时代,怎么能不懂EC纠删码技术?
根据云存储服务商Backblaze发布的2021年硬盘“质量报告”,现有存储硬件设备的可靠性无法完全保证,我们需要在软件层面通过一些机制来实现可靠存储。一个分布式软件的常用设计原则就是面向失效的设计。
个推
2022/05/27
1.8K0
Hadoop3.0时代,怎么能不懂EC纠删码技术?
HDFS EC 在知乎的应用
纠删码(Erasure Coding)简称 EC,是一种编码技术,通常被用于 RAID 和通信领域来保证数据的可靠性。采用纠删码编码的文件通常称为纠删码文件或者 EC 文件,EC 文件在小部分损坏时,也能够解码出可靠的数据。
从大数据到人工智能
2023/02/21
1.4K0
HDFS EC 在知乎的应用
纠删码优势分析
纠删码概述 存储节点或者存储介质失效已经成为经常的事情,提高存储可靠性以及保障数据可用性已经变得非常重要,纠删码具有高存储效率和高容错能力。在体量非常大的存储中纠删码存储方式相比副本方式存在编码开销,又由于其特有的IO访问路径,其改进空间比较大 保障数据可用性的常用方法就是数据冗余,传统的数据冗余方式就是副本和纠删码方式,副本是将每个原始数据分块都镜像复制到其他设备上来保证原始数据丢失或者失效时有副本可恢复;副本方式不涉及数据变换,而纠删码会对数据进行变换和运算,得到支持数据冗余的编码数据,比如k+r(k个
用户4700054
2022/08/17
1.9K0
纠删码优势分析
Ozone社区的领航者:腾讯Ozone EC的方案剖析
[导语] EC(Erasure Coding, 纠删码) 是现代分布式存储系统一个重要的能力。它可以保证在相同数据持久度的基础上大幅提高存储空间利用率,对降低存储成本有极为重要的意义。腾讯大数据存储团队全程参与了 Ozone 社区 EC 的设计与开发,并先于社区在内部完成了 EC offline recovery 的开发和测试。本文主要讲解 EC 在 Ozone 中的设计与实现,并讨论其中的利弊权衡。 0.引言 Apache Ozone 做为 Hadoop 生态的下一代分布式存储系统,是 Hadoop 生态
腾讯大数据
2022/08/26
1.2K0
Ozone社区的领航者:腾讯Ozone EC的方案剖析
大数据之Hadoop企业级生产调优手册(下)
注:演示纠删码和异构存储需要一共 5台虚拟机。尽量拿另外一套集群。提前准备 5台服务器的集群。
王知无-import_bigdata
2021/10/13
7420
深入解析Hadoop如何实现数据可靠性:三副本策略、校验和验证与Pipeline复制
在大数据时代,数据可靠性已成为企业数字化转型的生命线。根据IDC预测,到2025年全球数据总量将增长至175ZB,其中企业数据占比超过60%。面对如此庞大的数据规模,任何数据丢失或损坏都可能造成数百万美元的经济损失和不可逆的业务影响。
用户6320865
2025/08/27
3750
深入解析Hadoop如何实现数据可靠性:三副本策略、校验和验证与Pipeline复制
为什么要知道Hadoop机架感知?
在了解hdfs负载均衡时,需要获取DataNode情况,包括每个DataNode磁盘使用情况,获取到数据不均衡,就要做负载均衡处理。做负载均衡就要考虑热点数据发送到哪里去,集群服务器配置是否相同,机架使用情况等。
大数据最后一公里
2021/08/05
1.3K0
深入解析Hadoop中的HDFS架构设计
作为Hadoop生态系统的基石,HDFS(Hadoop Distributed File System)是一种专为大规模数据处理而设计的分布式文件系统。它的核心设计理念源于对互联网时代数据特征的深刻洞察——数据规模呈指数级增长,而硬件故障在廉价商用服务器集群中成为常态。这种设计哲学使得HDFS在应对PB级甚至EB级数据存储时展现出独特优势,成为大数据基础设施中不可或缺的组成部分。
用户6320865
2025/08/27
3410
深入解析Hadoop中的HDFS架构设计
HDFS学习:HDFS机架感知与副本放置策略
洋哥YARN和HDFS实践系列大作,这是第三篇,前面两篇分别是: Yarn【label-based scheduling】实战总结(二) Yarn【label-based scheduling】实战总结(一) 1.1 机架感知(RackAwareness)概述 通常,大型Hadoop集群会分布在很多机架上。在这种情况下, -- 希望不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架。 -- 为了提高容错能力,名称节点会尽可能把数据块的副本放到多个机架上。 综合考虑这两点的基础上Hadoop
大数据和云计算技术
2018/03/08
5.4K1
HDFS学习:HDFS机架感知与副本放置策略
读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理
首先我们搭建一个简单的演示工程(演示工程使用的gradle,Maven项目也同样添加以下依赖),本次使用的是Hadoop最新的3.2.1。
牧码哥
2020/03/30
1.4K0
有趣的纠删码(erasure code)
RAID 是 "Redundant Array of Independent Disk" 的缩写,中文意思是独立冗余磁盘阵列 是一种古老的磁盘冗余备份技术,也许你从未了解其中的原理,但肯定也听说过它的大名。简单地解释,就是将N台硬盘通过RAID Controller(分Hardware,Software)结合成虚拟单台大容量的硬盘使用,其特色是N台硬盘同时读取速度加快及提供容错性.
王磊-字节跳动
2021/05/30
12.8K0
CDH6——HDFS 开关纠删码策略
大概意思是说:HDFS 使用的 RS-6-3-1024k 编码纠删码策略至少需要9个DataNodes,当前只安装了1个,所以再增加8个DataNodes节点即可解决该问题。
bboy枫亭
2021/12/07
9000
CDH6——HDFS 开关纠删码策略
分布式存储系统纠删码技术分享
海云捷迅云课堂专题,旨在秉承开源理念,为大家提供OpenStack技术原理与实践经验,该专题文章均由海云捷迅工程师理论与实践相结合总结而成,如大家有其他想要了解的信息,可留言给我们,我们会根据问题酌情回复。
海云捷迅
2020/07/08
4.4K0
分布式存储系统纠删码技术分享
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
在保证可靠性的前提下如何提高存储利用率已成为当前 DFS 应用的主要问题之一。
ethanzhang
2018/12/30
10.6K1
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
Erasure Code(EC),即纠删码,是一种前向错误纠正技术(Forward Error Correction,FEC,说明见后附录)。目前很多用在分布式存储来提高存储的可靠性。相比于多副本技术而言,纠删码以最小的数据冗余度获得更高的数据可靠性,但是它的编码方式比较复杂。
区块链大本营
2020/03/24
1.7K0
RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
顶会论文:纠删码存储系统中的投机性部分写技术
本文已被USENIX'17年度技术大会录用,此处为中文简译版。 阅读英文论文完整版请点击:Speculative Partial Writes in Erasure-Coded Systems 。 前言 多副本和纠删码(EC,Erasure Code)是存储系统中常见的两种数据可靠性方法。与多副本冗余不同,EC将m个原始数据块编码生成k个检验块,形成一个EC组,之后系统可最多容忍任意k个原始数据块或校验块损坏,都不会产生数据丢失。纠删码可将数据存储的冗余度降低50%以上,大大降低了存储成本,在许多大规模分
美团技术团队
2018/03/13
2.5K0
顶会论文:纠删码存储系统中的投机性部分写技术
相关推荐
如何在CDH6.0中使用纠删码
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场