初衷是当hadoop集群出现坏块时,能定位到它在某个节点上。进而通过坏块出现的频率来分析节点的健康状况。一开始想到了fsck 命令 ,纠结的是fsck只能检测到健康的块的准确位置。随后阅读fsck的实现代码发现,如果一个块有三个健康的副本 这里取得的 locs.length=3 可以得到每个块的所在节点的位置。
- if (locs.length == 0) {
- report.append(" MISSING!");
- res.addMissing(block.toString(), block.getNumBytes());
- missing++;
- missize += block.getNumBytes();
- } else {
- report.append(" repl=" + locs.length);
- if (showLocations || showRacks) {
- StringBuffer sb = new StringBuffer("[");
- for (int j = 0; j < locs.length; j++) {
- if (j > 0) { sb.append(", "); }
- if (showRacks)
- sb.append(NodeBase.getPath(locs[j]));
- else
- sb.append(locs[j]);
- }
- sb.append(']');
- report.append(" " + sb.toString());
- }
- }
通过上面的代码,我们不难发现 这个时候坏块的位置信息已经丢失了。
看到这里,我想我们都想问同一个问题,hadoop什么时候去更新的 这成对应关系的?
带这这个疑问,不断的问谷哥 问度娘 ,遗憾的是到目前为止 还没有一个好的解决方案 值得庆幸的是,在这个过程中 阅读到很多不错的资料。并做大致整理
如果你也有同样的需求,希望可以给你带去一些帮助。如果大侠有好的解决方案,记得告诉小弟。
xdataopenの邦
本文出自 “静谧也哉” 博客,请务必保留此出处http://xdataopen.blog.51cto.com/4219560/819855