namenode如何选择在哪个datanode存储复本?这里需要对可靠性,写入带宽和读取带宽进行权衡。例如,把所有复本都存储在一个节点损失的写入带宽最小,因为复制管线都是在同一节点上运行,但这并不提供真实的冗余(如果节点发生故障,那么该块中的数据会丢失)。同时同一机架上服务器间的读取带宽是很高的。另一个极端,把复本放在不同的数据中心可以最大限度地提高冗余,但带宽的损耗非常大,即使在同一数据中心,也有许多不同的数据布局策略。
Hadoop的默认布局策略是在运行客户端的节点上放第1个复本,如果客户端运行在集群之外就随机选择一个节点,不过系统会避免挑选那些存储太满或太忙的节点。第2个复本放在与第一个不同且随机另外选择的机架中节点上(离架)。第3个复本与第2个复本放在同一机架上,且随机选择另外一个节点。其他复本放在集群中随机选择的节点上,不过系统会尽量避免在同一个机架上放太多的复本。
一旦选定复本的放置位置,就根据网络拓扑创建一个管线,如果复本为3,则有如图的管线。
总的来说,这一方法不仅提供很好的稳定性(数据块存储在两个机架中)并且实现很好的附在均衡,包括写入带宽(写入操作只需要遍历一个交换机),读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架上写入一个块)。