HDFS的默认副本存放策略是怎样的?
HDFS(Hadoop Distributed File System)默认的副本存放策略是基于机架感知(Rack Awareness)的。在默认情况下,HDFS的副本因子(Replication Factor)为 3。
HDFS 在放置这 3 个副本时,主要为了在可靠性(容错)、写入带宽和读取性能之间取得最佳平衡。其默认的存放策略(针对 3 个副本)如下:
1. 具体的副本放置步骤
第一个副本(Replica 1):存放在本地节点(Local Node)
- 如果客户端(Client)本身就是一个 DataNode(即在集群内部运行),那么第一个副本会优先存放在客户端所在的节点上。
- 如果客户端在集群外部,NameNode 会根据网络拓扑、磁盘空间和负载情况,随机选择一个负载不高的节点来存放。
- 目的:最大程度减少网络传输,提高写入速度。
第二个副本(Replica 2):存放在不同机架的节点上(Remote Rack)
- HDFS 会强制将第二个副本存放在与第一个副本不同的机架(Rack)上的随机节点。
- 目的:保证机架级别的容错。如果第一个副本所在的机架发生断电或交换机故障,数据依然可以从第二个机架恢复。
第三个副本(Replica 3):存放在与第二个副本相同机架的另一个节点上
- 第三个副本会被存放在与第二个副本所在的机架相同,但节点不同的机器上。
- 目的:平衡安全性和写入性能。因为跨机架的数据传输成本较高(需要经过机架顶部的交换机甚至核心交换机),将第三个副本放在和第二个同机架的节点上,可以减少跨机架的网络流量。
第 N 个副本(如果副本数大于 3):随机存放
- 如果配置了超过 3 个副本,剩余的副本将在集群中随机选择节点存放。但 HDFS 会尽量保证同一个机架上的副本数不会过多(通常单机架副本数上限设为
(replicas - 1) / racks + 2)。
- 如果配置了超过 3 个副本,剩余的副本将在集群中随机选择节点存放。但 HDFS 会尽量保证同一个机架上的副本数不会过多(通常单机架副本数上限设为
2. 策略总结(一句话概括)
3个副本会分布在 2 个不同的机架上:其中一个机架有 1 个副本,另一个机架有 2 个副本。
3. 为什么采用这种设计?(核心优势)
这种“1+2”的跨机架放置策略是经过精心设计的,它解决了以下痛点:
- 容错性(Reliability):
- 如果一台机器宕机,还有另外两个副本可用。
- 如果一个机架整体故障(如交换机坏了、断电),因为数据分布在两个机架上,另一个机架上至少还有一个副本,数据不会丢失。
- 写入性能(Write Bandwidth):
- HDFS 写入数据采用的是管线(Pipeline)方式:
Client -> 副本1 -> 副本2 -> 副本3。 - 如果 3 个副本放在 3 个不同的机架上,写入时需要跨越 2 次机架交换机,网络开销大。
- 当前的策略下,数据从副本 1 到副本 2 跨越一次机架,从副本 2 到副本 3 是在同一机架内传输,大大减少了跨机架的网络写带宽消耗。
- HDFS 写入数据采用的是管线(Pipeline)方式:
- 读取性能(Read Performance):
- 读取数据时,HDFS 会计算客户端与各个副本之间的“网络拓扑距离”,优先选择距离客户端最近的副本进行读取,从而降低读取延迟。
*注:要让这个策略生效,Hadoop 管理员必须在集群中正确配置**机架感知(Rack Awareness)*脚本。如果没有配置,HDFS 会认为所有的节点都在同一个默认机架(/default-rack)上,这样就无法实现跨机架容错。