鲁棒性
数据磁盘故障、心跳和重新复制
每一个DataNode向NameNode定期发送心跳消息。网络分区可以导致datanode的子集与NameNode失去连接。NameNode通过心跳检测这种情况的消息。datanode最近没有心跳,NameNode认为该datanode死亡,并且不向它推送任何的新的IO请求。死亡的DataNode上任何数据对于HDFS不可用。DataNode死亡可能会导致一些块的复制因子低于指定值,NameNode不断跟踪哪些模块需要复制,并且在必要时启动复制。重新复制可能由于许多原因造成:比如一个DataNode不可用,副本损坏,复制品DataNode硬盘故障,或文件的复制因子增加。
数据完整性
很有可能是从一个DataNode获取数据损坏已经损坏。这些损坏可能由于为存储设备故障,网络故障或缺陷的软件。HDFS客户端软件对HDFS文件内容进行校验和,当一个客户端创建一个HDFS文件时,它计算文件块的校验和,同时在HDFS名称空间吧校验和存储在在一个单独的隐藏文件里。当客户端检索文件内容时,确认收到每个DataNode匹配的数据的校验和和关联的校验和文件里面的校验和一样,如果校验和不一样,那么客户端就可以选择从其他有该数据快的datanode上获取数据。
元数据损坏
FsImage和EditLog是HDFS的核心数据结构。这些文件的损坏可以导致整个HDFS宕机。出于这个原因,NameNode可以配置为支持维护FsImage和EditLog的多个副本。任何对EditLog或者FsImage的更新触发每个FsImages和EditLog同步更新。对多个副本FsImage EditLog的同步更新可能降低命名空间处理事务数的速度。然而,这个代价是可以接受的,因为HDFS数据密集型应用程序而不是元数据密集型。NameNode重启时,它选择最新的EditLog和FsImage使用。
NameNode属于HDFS集群的单点故障。如果NameNode出现故障,人工干预是必要的。目前,并不支持NameNode软件的自动重启和故障转移到另一个机器。
数据组织
数据块
HDFS被设计为支持非常大的文件。那些处理大型数据集的应用程序和HDFS相互兼容。这些应用程序编写自己的数据只有一次,但他们读一次或多次并且要求需要读取得速度非常快。HDFS支持对文件写一次读多次。HDFS所使用的一个典型的块大小是64 MB的。因此,一个HDFS文件切成64 MB的块,如果可能,每个块将驻留在不同的DataNode。
客户端请求创建一个文件并不是立即达到NameNode的。事实上,最初HDFS客户端缓存文件数据到本地的一个临时文件。应用程序写文件被透明地重定向到这个临时文件。当本地临时文件的长度超过一个HDFS块大小,客户请求NameNode。NameNode将文件名插入到文件系统层次结构和同时分配数据块给客户端。然后客户端把数据写到给定的DataNode的数据块中。当一个文件被关闭时,其余没有写完的本地临时文件中的数据转移到DataNode。然后客户端告诉NameNode,文件关闭。NameNode提交文件创建操作持久化存储。如果关闭文件前NameNode死亡,则文件丢失。
采用经过仔细考虑的运行在HDFS上的目标应用程序的特点决定采取上述措施。这些应用程序需要流写入文件。如果客户直接写入远程文件没有任何客户端缓冲,网络速度和网络中的拥塞会造成很大的影响。这种方法不是没有先例。早期的分布式文件系统,例如AFS,使用客户端缓存来提高性能。
管道复制
当客户端写入数据到一个HDFS文件,其数据是首次写入本地文件的。假设HDFS文件的replication因子是3,当本地文件积累一个完整的数据块时,客户端从NameNode检索到datanode的列表。这个列表包含即将被写入数据的的datanode块。首先客户端把数据写到第一个DataNode。第一个DataNode一边把数据写进本地存储中,一边把数据传给第二个DataNode。反过来第二个DataNode开始接收数据,且把数据传给第三个DataNode。最后,第三个DataNode写数据本地存储库。因此,一个DataNode可以从上一个管道接收数据,同时将数据转发给下一个管道。因此,数据在管道里从一个DataNode流到下一个。
删除文件
当一个文件被用户或应用程序删除,它不是立即从HDFS移除。相反,HDFS把它丢到/trash目录中。该文件可以快速恢复,只要它仍然在/trash。可配置文件在/trash的存留时间。期满后,NameNode从HDFS文件名称空间中将其删除。删除文件导致与该文件关联的数据块被释放。注意,在一个文件被用户删除和HDFS上空余空间增加之间会有一个明显的时间延迟时间。
用户可以恢复删除的文件,只要它仍然在/trash目录中。如果用户想恢复一个已经删除的文件,进入/trash目录,检索文件即可。/trash目录只包含被删除文件最新的副本。/trash目录和其他任何目录相同。但是HDFS指定策略从这个目录中自动删除文件。当前默认垃圾时间间隔设置为0(删除垃圾文件之后不储存在/trash)。这个值是可配置的参数(core-site.xml fs.trash.interval)。