初衷是当hadoop集群出现坏块时,能定位到它在某个节点上。进而通过坏块出现的频率来分析节点的健康状况。一开始想到了fsck 命令 ,纠结的是fsck只能检测到健康的块的准确位置。随后阅读fsck的实现代码发现,如果一个块有三个健康的副本 这里取得的 locs.length=3   可以得到每个块的所在节点的位置。

   
   
   
   
  1. if (locs.length == 0) {  
  2.        report.append(" MISSING!");  
  3.        res.addMissing(block.toString(), block.getNumBytes());  
  4.        missing++;  
  5.        missize += block.getNumBytes();  
  6.      } else {  
  7.        report.append(" repl=" + locs.length);  
  8.        if (showLocations || showRacks) {  
  9.          StringBuffer sb = new StringBuffer("[");  
  10.          for (int j = 0; j < locs.length; j++) {  
  11.            if (j > 0) { sb.append(", "); }  
  12.            if (showRacks)  
  13.              sb.append(NodeBase.getPath(locs[j]));  
  14.        
  15.            else 
  16.              sb.append(locs[j]);  
  17.          }  
  18.          sb.append(']');  
  19.          report.append(" " + sb.toString());  
  20.        }  
  21.      } 

通过上面的代码,我们不难发现 这个时候坏块的位置信息已经丢失了。
 

看到这里,我想我们都想问同一个问题,hadoop什么时候去更新的 这成对应关系的?

带这这个疑问,不断的问谷哥 问度娘  ,遗憾的是到目前为止 还没有一个好的解决方案  值得庆幸的是,在这个过程中 阅读到很多不错的资料。并做大致整理

如果你也有同样的需求,希望可以给你带去一些帮助。如果大侠有好的解决方案,记得告诉小弟。   

                                                                

                                                                                                        xdataopenの邦