在 Apache HDFS 中,当 DataNode 启动时,它会向 NameNode 注册。一段时间后会发生块报告(与寄存器无关)。我还没有完全理解代码,但在我看来,NameNode 将尚未发送其块报告的 DataNode 视为与已报告的所有其他 DataNode 相同。我得到这个提示是因为DatanodeManger 寄存器逻辑没有将 DataNode 标记为特殊状态,例如NOT_REPORTED
.
因此,HDFS 客户端将能够在完成向 NameNode 的报告之前对新的 DataNode 发出读/写操作。让我们讨论一下DataNode是否新鲜。
如果 DataNode 是新鲜的(即无论如何都没有存储块),则可以安全地用于读/写。没有什么可读的。并且写入的块应该在块报告中报告给NameNode。
如果 DataNode 不是新鲜的(即,此 DataNode 上有数据,不知何故它脱机并重新联机),NameNode 端元数据中可能存在间隙,其中一些块存在/从 DataNode 中消失,但 NameNode 还不知道. NameNode 仍然持有上一个报告中的陈旧块位置元数据(如果有的话)。这会导致像下面这样的不一致(当然还有许多其他边缘情况)?
- NameNode 指示客户端从该 DataNode 读取,但实际上该块已消失。
- NameNode 指示客户端写入此 DataNode,但该块实际上是存在的。
如果实际上处理了这些不一致,我错过了什么?或者,如果这些不一致无关紧要,为什么?
如果有人可以解释设计中的逻辑或将我指向相关代码,请不胜感激。提前致谢!