我正在为 HDFS 中的写入实现一个数据节点故障转移,当 block 的第一个数据节点发生故障时,HDFS 仍然可以写入一个 block 。
算法是。首先,将识别故障节点。然后,请求一个新 block 。 HDFS port api提供了excludeNodes
,我用它来告诉Namenode不要在那里分配新的 block 。 failedDatanodes
被识别为失败的数据节点,它们在日志中是正确的。
req := &hdfs.AddBlockRequestProto{
Src: proto.String(bw.src),
ClientName: proto.String(bw.clientName),
ExcludeNodes: failedDatanodes,
}
但是,名称节点仍然将 block 定位到失败的数据节点。
谁知道为什么?我在这里错过了什么吗? 谢谢。
请您参考如下方法:
我找到了解决方案,先放弃区 block ,然后请求新区 block 。在之前的设计中,新请求的 block 不能替换旧的