温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
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和无策略。
hadoop fs -mkdir /ec_XOR-2-1-1024k
hdfs ec -setPolicy -path /ec_XOR-2-1-1024k -policy XOR-2-1-1024k
hadoop fs -mkdir /ec_RS-3-2-1024k
hdfs ec -setPolicy -path /ec_RS-3-2-1024k -policy RS-3-2-1024k
hadoop fs -mkdir /ec_RS-6-3-1024k
hdfs ec -setPolicy -path /ec_RS-6-3-1024k -policy RS-6-3-1024k
hadoop fs -mkdir /no_ec
hdfs ec -getPolicy -path /ec_XOR-2-1-1024k
hdfs ec -getPolicy -path /ec_RS-3-2-1024k
hdfs ec -getPolicy -path /ec_RS-6-3-1024k
hdfs ec -getPolicy -path /no_ec
(可左右滑动)
3
block放置策略测试
3.1
100MB文件
1.将准备好的100MB的文件分别put到在上章测试环境说明中的4个目录。
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_XOR-2-1-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-3-2-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-6-3-1024k
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /no_ec
[root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec
Found 1 items
-rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv
Found 1 items
-rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv
Found 1 items
-rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv
Found 1 items
-rw-r--r-- 3 fayson supergroup 104094922 2018-11-22 11:51 /no_ec/100m.csv
(可左右滑动)
2.XOR-2-1-1024k目录的副本放置情况为:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k -files -blocks -locations
(可左右滑动)
原始文件只有100MB,如果按照三副本策略,应该只有1个block(算上个3副本一共是3个),我们根据上图可以发现有一个block group,同样具有3个block文件,因为纠删码策略是XOR-2-1,所以2个block是原始文件,1个block是校验数据。以下再看看具体的block分布:
172.31.11.232节点属于rack1,放置第1份block,为原始数据,大小为50MB:
172.31.13.38节点属于rack3,放置第2份block,为原始数据,大小为50MB:
172.31.9.113节点属于rack4,放置第3份block,是校验数据,大小为50MB,直接cat查看为乱码:
汇总如下:<