在Hadoop集群中两个节点之间的距离是如何定义的呢?如何判断两个节点是否“邻近”?当需要处理海量数据时,节点之间的数据传输能力就成为了最明显的限制因素——带宽是一种非常稀缺的资源。因此,使用两个节点之间的带宽作为他们之间距离的度量应该是一个非常棒的思路。
但是,想要度量出两个节点之间真实的带宽却非常难以实现。因为这需要集群中所有节点都直接相连,节点之间的网线连接数量将是节点数量的平方。因此,Hadoop采用了一个相对简单的近似方法,即使用两个节点之间的跳数来代表节点之间的距离。跳数就是两个节点之间的线缆的段数。Hadoop将整个集群理解为树形结构,树的每个节点代表集群中的每个机器(处理机或者路由器)。树的层次结构不是预先定义好的,但是一般会把数据中心(center)、机架(rack)和节点(node)分别映射到不同的层次。在这种设计中,以下每种情况的带宽是递减的:
- 同一节点中的两个程序
- 同一机架上的两个节点
- 同一数据中心的不同机架上的两个节点
- 不同数据中心的节点
如果将数据中心d1里的机架r1上的节点n1定义为/d1/r1/n1的话,那么将会有以下结果:
- distance(/d1/r1/n1, /d1/r1/n1) = 0 (同一节点上的两个应用程序)
- distance(/d1/r1/n1, /d1/r1/n2) = 2 (同一机架上的两个节点)
- distance(/d1/r1/n1, /d1/r2/n3) = 4 (同一数据中心里不同机架上的两个节点)
- distance(/d1/r1/n1, /d2/r3/n4) = 6 (不同数据中心的两个节点)