HDFS是一种高度分布的多层次结构布局。典型的HDFS集群是由数百个服务器被同时部署在同一个集群之中,并且可以同时被来自同一或者不同地点的多个客户机进行访问。HDFS的数据存储的目标有两个,最大化数据可靠性与可用性,最大化利用网络带宽资源。为了实现这两个目的,仅仅在多台机器上进行单一存储是不够的,并不能预防硬件设备失误带来的损失。因此而采用的是多副本存储复制。在多个节点之间重复分布存储数据副本,这保证了即使有一个存储所需数据硬件设备损坏,也能够安全合理地获得所需要的数据。同时为更大资源的利用带宽,对节点的选择则需要进行专门的研究与设计。 那么对于NameNode如何选择具体的DataNode来存储数据,并能够充分利用现有带宽呢?首先需要对节点和带宽做出HDFS中的定义。
在通过宽带网络进行的数据交换与处理过程中,使用数据传输速度作为衡量节点之间的限制因素是自然而然并且是可行的。但是问题在于,使用带宽或者说使用传输速率作为衡量标准的话,在实际工作中是很难获得一个准确的测量。因为影响因素非常多,网络的稳定性,其他数据的传输带宽占用,交换机的负载等等,都能够对某个时间点的带宽起到决定性的因素。因此并不能简单的使用传输速度作为节点距离的衡量标准。
为此,为了解决通过测量带宽不能够获得一个长期准确稳定的速率的问题,HDFS 采用了一个简单的方法对带宽进行衡量。假设客户端也就是数据的调用端为数据的获取点的话,以根据数据存放的不同位置进行计算距离值。设定见下所示,定义得距离值依次相减:
同一节点上的存储数据
同一机架上不同节点上的存储数据
同一数据中心不同机架上的存储数据
不同数据中心的节点
以上这四个位置距离值依次减少,标志以此作为衡量距离的话其距离位置加长。我们举例来说,假设数据中心某一个客户端Client,需要获取相关数据Data,那么可以认为:
Client距离同一节点上不同存储Data距离为0
Client同一机架上不同节点上的存储数据Data距离为3
Client同一数据中心不同机架上的存储数据Data距离为6
Client不同数据中心的节点Data距离为9
我们看到,HDFS根据客户端与数据的相对位置获取距离值,因此可以较为方便的获取数据存放于获取方之间的关系从而获得更快捷的数据输入。在确定数据距离后,HDFS中NameNode节点即可根据定义的距离对数据进行读取并切割和存放入最近的节点,同时为了维护数据的稳定性与预防灾难,需要将数据进行副本的备份操作。
小提示:对于副本的复制操作可以自行制定数目,如果数据过于庞大而安全性不是那么重要,可以减少复制的副本数目,或者关闭复制而采用硬盘Raid模式。
对于副本存放的位置也是相当需要进行考虑和评价。首先此种操作也要对带宽及传输速率进行衡量,衡量的依据就是上文定义的距离值。我们知道如果想要求最高的网络速度,那么将所有数据都存放在同一节点上最为合适的,但是此种存放是非常危险,因此你无法正确估量和测试硬件的稳定状态,一旦灾难发生,则可能无法避免数据损失。而我们换另一种极端的考虑方法,将数据存放在不同数据节点中,这样看的话,不同数据中心不同节点同时出现故障的可能性是非常低的,但是由于客户端有可能需要对多个节点中的数据进行复制操作,因此此种存放在传输速率上会大打则扣。
HDFS数据存放策略就是采用同节点与同机架并行的存储方式。在运行客户端的当前节点上存放第一个副本,第二个副本存放在于第一个副本不同的机架上的节点,第三个副本放置的位置与第二个副本在同一个机架上而非同一个节点。