Hadoop块校验和:也存储在namenode中?
Posted
技术标签:
【中文标题】Hadoop块校验和:也存储在namenode中?【英文标题】:Hadoop block checksum: stored in namenode too? 【发布时间】:2018-03-08 18:44:20 【问题描述】:HDFS 块的校验和与块的原始内容一起存储在本地文件中,都存储在每个专用数据节点(副本)上。
我想知道:块的校验和是否存储在名称节点中也,作为文件元数据的一部分?
【问题讨论】:
【参考方案1】:没有。校验和仅与从节点[有时也称为数据节点]上的块一起存储。
来自 HDFS 的 Apache 文档
数据完整性
有可能从 DataNode 获取的数据块到达 损坏。由于存储中的故障,可能会发生这种损坏 设备、网络故障或有缺陷的软件。
它的工作方式如下。
-
HDFS 客户端软件实现校验和检查器。当客户端创建 HDFS 文件时,它会计算文件每个块的校验和,并将这些校验和存储在同一 HDFS 命名空间中的单独隐藏文件中。
当客户端检索文件内容时,它会验证它从每个 DataNode 接收到的数据是否与存储在相关校验和文件中的校验和相匹配。
如果没有,那么客户端可以选择从另一个具有该块副本的 DataNode 检索该块。
如果另一个Data节点块的校验和与隐藏文件的校验和匹配,系统将提供这些数据块。
【讨论】:
【参考方案2】:简短答案:校验和存储在数据节点上
解释:
-
HDFS 透明地校验所有写入它的数据,并在读取数据时默认验证校验和。为每个 dfs.bytes-perchecksum 字节数据创建一个单独的校验和。默认为 512 字节,由于 CRC-32C 校验和为 4 字节长,存储开销小于 1%。
Datanodes 负责在存储数据及其校验和之前验证他们收到的数据。这适用于他们在复制期间从客户端和其他数据节点接收的数据。
写入数据的客户端将其发送到数据节点管道,管道中的最后一个数据节点验证校验和。
如果数据节点检测到错误,客户端会收到一个 IOException 的子类,它应该以特定于应用程序的方式处理(例如,通过重试操作)。
当客户端从数据节点读取数据时,他们也会验证校验和,并将其与存储在数据节点的校验和进行比较。每个数据节点都保存校验和验证的持久日志,因此它知道其每个块的最后一次验证时间。
当客户端成功验证一个块时,它会告诉数据节点,数据节点会更新它的日志。保留此类统计数据对于检测坏磁盘很有价值。
除了客户端读取的块验证外,每个数据节点还在后台线程中运行 DataBlockScanner,定期验证存储在数据节点上的所有块。这是为了防止由于物理存储介质中的“位腐烂”而导致损坏。
参见“hadoop 权威指南第 4 版第 98 页”
【讨论】:
以上是关于Hadoop块校验和:也存储在namenode中?的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop:NameNode如何知道哪些块对应于一个文件?