- 数据的完整性
- 当数据在管道中进行传输时,是存在数据损害的可能性的,因此在数据通过一个不可靠的管道进行传输时,会进行数据的检验,通过计算数据传输前后的校验和是否一致来判断数据是否损坏,常用的错误检验码是CRC-32(任何大小的数据均计算成一个32位的整数校验和),当然校验码本身也可能存在损坏的可能,但是因为校验比数据小的多,所以损坏的可能性也会低很多。
- HDFS回对所有写入的数据计算校验和,并且在读取数据时验证校验和,来确保数据的完整性。
- 客户端在写入数据时,会将数据和校验和一起发送到pileline中,由Pileline中最后一个DataNode来负责计算校验和。客户端在读数据时,也会验证校验和,每个DataNode均有一个校验和日志,记录每个数据块的最后一次校验时间,客户端每完成一次校验和验证之后都会通知DataNode更新日志,这个日志可以用来检测磁盘是否损坏。
- 客户端在读取数据时,遇到了损坏的数据块,如何处理?
- 首先,客户端在读取数据时,如果遇到了损坏的数据块,会抛出一个异常,告诉NameNode当前损坏的数据块和DataNode节点,由NameNode将该数据块标记为已损坏,之后NameNode在处理客户端请求时,不会在分配到该节点,同时会尝试将这个数据块的的复本复制到另一个DtaNode节点,这样就将复本数量恢复到了期望水平,之后在将损坏的数据块复本删除。
