11,482
社区成员
发帖
与我相关
我的任务
分享HDFS具有较高的容错率,可以兼容链家的硬件设备,它把硬件出错看作是一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下三种形式
名称节点出错
名称节点保存了所有的元数据信息,其中最核心的两大文件时FsImage和EditLog,如果这两个文件发生损坏,那么整个HDFS实例将失败。Hadhoop次采用两种机制来确保名称节点的安全;一是把名称节点上的元数据同步存储到其它文件系统,比如远程挂载的网络文件系统中;二是运行一个第二名称节点,当名称节点死机后,可以把运行第二名称节点作为一种弥补措施,利用第二名称节点钟的元数据进行系统恢复,但是从前面对第二名称节点的介绍中可以看出,这样做仍然会丢失部分数据。因此,一般会把上述两种方式结合使用,当名称节点发生死机的时候,首先到远程挂载的网络文件中获取备份的元数据信息,放到第二名称节点上进行恢复,并把第二名称节点作为名称节点来使用。
数据节点出错
每个数据节点会定期像名称节点发送“心跳”信息,向名称节点报告自己的状态。当数据节点发生故障,或者网络发生断网的时候,名称节点就无法收到来自一些数据节点的心跳信息,这时这些数据节点就会被标记为“死机”,节点上面的所有数据都会被标注为“不可读”,名称节点也不会再给他发送任何I/O请求。这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余银子。名称节点会定期检查这种情况,一旦发现某个数据节点的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。HDFS与其它分布式文件系统的最大区别就是可以调整冗余数据的位置。
数据出错
网络传输和磁盘错误等因素都会造成数据错误。客户端在读取数据以后,会采用MD5和SHA-1对数据块进行校验,以确定读取正确的数据。在文件被创建时,客户端会对每一个文件快进行信息摘录,并把这些信息写入同一个路径的隐藏文件里。当客户端读取文件的时候,会先读取该文件信息,然后利用该信息文件对每个读取的数据块进行校验。如果校验出错i,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。