HDFS可以保证集群中文件存储的可靠性。它把文件分解成一个由数据块构成的序列,每个数据块有多个副本,这种数据冗余对容错非常关键。当一个数据块损坏时,不会造成数据丢失。数据块的大小和复制因子对每个文件都是可配的。
一般情况下,HDFS中一个文件的所有数据块,除最后一个块外,都有同样的大小。
但是,HDFS支持变长的数据块,就是说一个文件有可能包含两种大小的数据块。当用户重新配置了文件的块大小,然后向该文件中追加数据,这时HDFS不会填充文件的最后一个块,而是用新的尺寸创建新块存储追加的数据,这种情况下文件中就会同时存在两种大小的块。
应用可以指定一个文件的副本数,即复制因子。可以在文件创建时指定复制因子,这个复制因子的配置以后是可以改变的。除了追加和清除操作外,HDFS中的文件在任何时候都是严格地一次写入。
NameNode做出的所有操作,都会考虑数据块的复制。它周期性地接收集群中每个DataNode发出的心跳和块报告。接收到心跳说明DataNode工作正常。块报告包含该DataNode节点上所有数据块的列表。
HDFS使用所谓的“机架感知”策略放置数据块副本。这是一个需要进行大量实验并不断调整的特性,也是HDFS与其他分布式文件系统的主要区别。机架感知的目的是要提升数据可靠性、可用性和网络带宽的利用率。
在此简单说一下可靠性与可用性的区别。
可靠性是指系统可以无故障地持续运行,而可用性指的是系统在任何给定的时刻都能工作。
例如,如果系统每月崩溃1分钟,那么它的可用性是99.998%,但是它还是非常不可靠的。与之相反,如果一个系统从来不崩溃,但是每年要停机两星期,那么它是高度可靠的,但是可用性只有96%。
在一个复制因子为3的普通场景中,这样只写了两个机架,节省了一个机架的写入流量,提升了写入性能。
该策略的前提是认可这样一种假设:机架失效的可能性比机器失效的可能性小得多。因此这种策略并不会影响数据的可靠性和可用性。
该策略提升了写的性能,同时没有损害数据可靠性或读的性能。
如果复制因子大于3,第4个及其后面的副本被随机放置,但每个机架的副本数量要低于上限值,上限值的计算公式是:((副本数 -1)/(机架数 + 2))取整。
当Hadoop的NameNode节点启动时,会进入一种称为安全模式的特殊状态。
NameNode处于安全模式时不会进行数据块的复制操作。此时NameNode会接收来自DataNode的心跳和块报告消息。块报告中包含该DataNode节点所保存的数据块列表,每个数据块有一个特定的最小副本数。
NameNode检测到一个数据块达到了最小副本数时,就认为该数据块是复制安全的。当检测到的复制安全的数据块达到一定比例(由dfs.safemode.threshold.pct参数指定)30秒后,NameNode退出安全模式。然后NameNode会确定一个没有达到最小副本条件的数据块列表,并将这些数据块复制到其他DataNode节点,直至达到最小副本数。