我想从运行HDFS的群集中的特定计算机(DataNode)中删除特定的原始块文件(并包含.meta文件),并将其移动到另一台特定的计算机(DataNode)。
如果我停止HDFS,手动移动块文件并重新启动它,则可以实现此目的。该块显示在新位置很好。但是,我想在不停止整个群集的情况下这样做。
我发现如果我停止有问题的两个DataNode,移动文件并重新启动它们,Namenode立即意识到目标DataNode现在有文件(注意dfsadmin -triggerBlockReport不起作用.DataNodes必须是重新启动)。 然而,似乎没有任何东西可以让HDFS意识到文件已从源DataNode中删除。无论我尝试什么,现在不存在的副本都显示为现有的,健康的和有效的。这意味着HDFS决定该块被过度复制,导致它删除一个随机副本,而其中一个现有副本实际上已经消失。
有没有办法强制Namenode以某种方式更全面地刷新,告知它副本已被删除,让它选择删除我自己现在知道不存在的副本,或以其他方式完成此任务?任何帮助将不胜感激。
(我知道Balancer / DiskBalancer必须以某种方式实现这一点,并且已经查看了它的来源,但是我发现它非常密集,并且希望尽可能避免手动编辑Hadoop / HDFS源代码。)
修改 找到了解决方案。如果我从源DataNode而不是.meta文件中删除块文件,则块报告然后触发通知Namenode副本丢失。我相信通过删除.meta文件,我正在制作它,以便Namenode从未考虑过对该DataNode上该块上的副本的更改(因为没有报道过它)。