本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见大数据技术体系
HDFS 的主要目标就是即使在出错的情况下也要保证数据存储的可靠性。
常见的三种出错情况是 Namenode 出错、Datanode 出错和网络割裂,HDFS 提供了多种错误恢复手段, 保障了系统的健壮性。
每个 Datanode 节点周期性地向 Namenode 发送心跳信号。
网络割裂可能导致一部分Datanode 与 Namenode 失去联系。
Namenode 通过心跳信号的缺失来检测这一情况,并将这些近期不再发送心跳信号的 Datanode 标记为死机,不会再将新的 10 请求发给它们。
任何存储在死机 Datanode 上的数据将不再有效。
Datanode 的死机可能会引起一些数据块的副本系数低于指定值,Namenode 不断地检测这些需要复制的数据块,一旦发现就启动复制操作。
在下列情况下,可能需要重新复制:
HDFS 的架构支持数据均衡策略。
如果某个 Datanode 节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个 Datanode 移动到其他空闲的Datanode。
当对某个文件的请求突然增加时,也可能启动一个计划创建该文件新的副本, 并旦同时重新平衡集群中的其他数据。
从某个Datanode 获取的数据块有可能是损坏的,损坏可能是由 Datanode 的存储设备错误、网络错误或者软件漏洞造成的。
HDFS 客户端软件实现了对 HDFS 文件内容的校验和 (checksum) 检查。
当客户端创建一个新的 HDFS 文件时,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个 HDFS 名宇空间下。
当客户端获取文件内容后,它会检验从 Datanode 获取的数据以及相应的校验和与文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他 Datanode 获取该数据块的副本。
FsImage 和 Editlog 是 HDFS 的核心数据结构。
如果这些文件损坏,整个 HDFS 实例都将失效。
因而,Namenode 可以配置成支持维护多个 Fslmage 和 Editlog 的副本。
任何对Fslmage 或者 Editlog 的修改,都将同步到它们的副本上。
这种多副本的同步操作可能会降低 Namenode 每秒处理的名字空间事务数量。
然而这个代价是可以接受的,因为即使HDFS 的应用是数据密集的,它们也非元数据密集的。
当 Namenode 重启的时候,它会选取最近的完整的 Fsimage 和 Editlog 来使用。
快照支持某一特定时刻的数据的复制备份。
利用快照,可以让 HDFS 在数据损坏时恢复到过去一个已知正确的时间点。