HDFS可以保证集群中文件存储的可靠性。它把文件分解成一个由数据块构成的序列,每个数据块有多个副本,这种数据冗余对容错非常关键。当一个数据块损坏时,不会造成数据丢失。数据块的大小和复制因子对每个文件都是可配的。
一般情况下,HDFS中一个文件的所有数据块,除最后一个块外,都有同样的大小。
但是,HDFS支持变长的数据块,就是说一个文件有可能包含两种大小的数据块。当用户重新配置了文件的块大小,然后向该文件中追加数据,这时HDFS不会填充文件的最后一个块,而是用新的尺寸创建新块存储追加的数据,这种情况下文件中就会同时存在两种大小的块。
应用可以指定一个文件的副本数,即复制因子。可以在文件创建时指定复制因子,这个复制因子的配置以后是可以改变的。除了追加和清除操作外,HDFS中的文件在任何时候都是严格地一次写入。
NameNode做出的所有操作,都会考虑数据块的复制。它周期性地接收集群中每个DataNode发出的心跳和块报告。接收到心跳说明DataNode工作正常。块报告包含该DataNode节点上所有数据块的列表。
HDFS使用所谓的“机架感知”策略放置数据块副本。这是一个需要进行大量实验并不断调整的特性,也是HDFS与其他分布式文件系统的主要区别。机架感知的目的是要提升数据可靠性、可用性和网络带宽的利用率。
在此简单说一下可靠性与可用性的区别。
可靠性是指系统可以无故障地持续运行,而可用性指的是系统在任何给定的时刻都能工作。
例如,如果系统每月崩溃1分钟,那么它的可用性是99.998%,但是它还是非常不可靠的。与之相反,如果一个系统从来不崩