1

HDFS 块的校验和与块的原始内容一起存储在本地文件中,两者都在每个专用数据节点(副本)上。

我想知道:块的校验和是否存储在名称节点中,作为文件元数据的一部分?

4

2 回答 2

2

不。校验和仅与从节点上的块一起存储[有时也称为数据节点]。

来自 HDFS 的 Apache 文档

数据的完整性

从 DataNode 获取的数据块可能已损坏。由于存储设备故障、网络故障或有缺陷的软件,可能会发生这种损坏。

它以下列方式工作。

  1. HDFS 客户端软件实现校验和检查器。当客户端创建 HDFS 文件时,它会计算文件每个块的校验和,并将这些校验和存储在同一 HDFS 命名空间中的单独隐藏文件中。
  2. 当客户端检索文件内容时,它会验证它从每个 DataNode 接收到的数据是否与存储在相关校验和文件中的校验和匹配。
  3. 如果没有,那么客户端可以选择从另一个具有该块副本的 DataNode 检索该块。
  4. 如果另一个 Data 节点块的校验和与隐藏文件的校验和匹配,则系统将服务这些数据块。
于 2018-03-08T19:11:44.993 回答
0

简短的回答:校验和存储在数据节点上

说明

  1. HDFS 透明地校验所有写入它的数据,并在读取数据时默认验证校验和。为每个 dfs.bytes-perchecksum 字节数据创建一个单独的校验和。默认为 512 字节,由于 CRC-32C 校验和为 4 字节长,存储开销小于 1%。
  2. Datanodes负责在存储数据及其校验和之前验证他们收到的数据。这适用于他们在复制期间从客户端和其他数据节点接收的数据。
  3. 写入数据的客户端将其发送到数据节点管道,管道中的最后一个数据节点验证校验和。
    • 如果数据节点检测到错误,客户端会收到一个 IOException 的子类,它应该以特定于应用程序的方式处理它(例如,通过重试操作)。
  4. 当客户端从 datanodes 读取数据时,它们也会验证校验和,并将它们与存储在 datanodes 中的校验和进行比较。每个数据节点都保存校验和验证的持久日志,因此它知道其每个块的最后一次验证时间。
  5. 当客户端成功验证一个块时,它会告诉数据节点,数据节点会更新其日志。保留诸如此类的统计数据对于检测坏磁盘很有价值。
  6. 除了客户端读取的块验证之外,每个数据节点还在后台线程中运行 DataBlockScanner,该线程定期验证存储在数据节点上的所有块。这是为了防止由于物理存储介质中的“位腐烂”而导致损坏。

请参阅“hadoop 权威指南第 4 版第 98 页”

于 2019-08-24T18:06:27.880 回答