任务目的
- 了解 HDFS 副本存放策略的作用
- 理解 DataNode 网络拓扑图
- 知晓查看集群机架及其节点情况的命令
- 熟记 HDFS 副本存放策略
任务清单
- 任务1:副本存放策略的作用
- 任务2:机架感知
- 任务3:HDFS 副本存放策略基本思想
详细任务步骤
任务1:副本存放策略的作用
HDFS 作为 Hadoop 中的一个分布式文件系统,而且是专门为它的 MapReduce 设计,所以 HDFS 除了必须满足自己作为分布式文件系统的高可靠性外,还必须为 MapReduce 提供高效的读写性能,那么 HDFS 是如何做到这些的呢?
首先,HDFS 将每一个文件的数据进行分块存储,同时每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上,这种数据分块存储和副本的策略是 HDFS 保证可靠性和性能的关键。这是因为:
(1)文件分块存储之后按照数据块来读,提高了文件随机读的效率和并发读的效率;
(2)保存数据块若干副本到不同的机器节点实现可靠性的同时也提高了同一数据块的并发读效率;
(3)数据分块是非常切合MapReduce中任务切分的思想。
所以说,副本的存放策略是 HDFS 实现高可靠性和高性能的关键。
任务2:机架感知
大型 Hadoop 集群以机架的形式来组织的,两个不同机架上的节点是通过交换机实现通信的,在大多数情况下,相同机架上节点间的网络带宽优于在不同机架上的节点。
另外,Hadoop 将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,NameNode 设法将数据块副本保存在不同的机架上以提高容错性。
但是 HDFS 是如何确定两个节点是否是同一节点,如何确定不同节点跟客户端的远近呢?
答案就是机架感知!!!!
图1
有了机架感知,NameNode 就能够画出上图所看到的 DataNode 网络拓扑图。D1、D2是机房,R1、R2是机架,最底层是DataNode 。
H1的 rackID=/D1/R1/H1,H1 的 parent 是 R1,R1 的 parent 是 D1。这些 rackID 信息能够通过 “net.topology.script.file.name” 配置。有了这些rackID信息就能够计算出随意两台DataNode之间的距离。
distance(/D1/R1/H1,/D1/R1/H1)=0 相同的DataNode
distance(/D1/R1/H1,/D1/R1/H3)=2 同一rack下的不同DataNode
distance(/D1/R1/H1,/D1/R2/H4)=4 同一IDC(互联网数据中心)机房下的不同DataNode
distance(/D1/R1/H1,/D2/R3/H7)=6 不同IDC机房下的DataNode
默认情况下,Hadoop 机架感知是没有启用的,这时任何一台 DataNode 机器,不管物理上是否属于同一个机架, NameNode 都会默认他们在同一个机架下,机架名为 “/default-rack”。可以通过以下命令查看 NameNode 报告的机架及其节点情况:
hdfs dfsadmin -printTopology
效果如下所示:
图2
任务3:HDFS 副本存放策略基本思想
NameNode 通过机架感知过程确定每一个 DataNode 在哪个机架。
一个简单但不是最优的方式就是将副本放置在不同的机架上,这就防止了机架故障时数据的丢失,保证了数据的可靠性,并且在读数据的时候可以充分利用不同机架的带宽。这个方式均匀地将副本分散在集群中,这就简单地实现了组建故障时的负载均衡。然而这种方式增加了写的成本,因为写的时候需要跨越多个机架传输文件块。
如何在可靠性、写入带宽和读入带宽之间做出权衡呢?
默认的 HDFS 副本存放策略在最小化写开销和最大化数据可靠性(block 在不同的机架上)、可用性以及总体读取带宽之间进行了一些折中。
在多数情况下, HDFS 默认的副本系数是 3。Hadoop 默认对 3 个副本的存放策略,如下图:
图3
-
第一个 block 副本存放在 client 所在的 node 中(如果 client 不在集群范围内,则第一个 node 是随机选取 的,系统会尝试不选择那些太满或者太忙的 node);
-
第二个副本放置在与第一个 node 不同机架的 node 中(近乎随机选择,系统会尝试不选择那些太满或者太忙 的 node);
-
第三个副本放在与第二个副本同机架不同的 node 中。
-
如果还有更多的副本就随机放在集群的 node 中,限制每个 node 不超过一个副本,同时保持每个机架的副本数量低于上限((副本数-1)/机架 + 2)。
可以看出这种方案比较合理:
- 可靠性:block 存储在两个机架上,若是其中一个机架网络出现异常,可以保证在其它机架 node 上找到数据。
- 写操作:写操作仅仅穿过一个网络交换机,减少了机架间的数据传输,提高了写操作的效率。
- 读操作:在读取数据时,为了减少整体的带宽消耗和降低整体的带宽延时,HDFS 会尽量让读取操作读取离 client 最近的副本。如果在读取操作的同一个机架上有一个副本,那么就读取该副本。如果本地数据损坏, node 可以从同一个机架内的相邻 node 上拿到数据,速度一定会比跨机架拿数据快。
- block 分布在整个集群中。