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