2019独角兽企业重金招聘Python工程师标准>>>
在上传一个文件时,需要判断文件是否存在于HDFS中,这是通过向namenode节点发请求得到的。
那么,namenode如何判断一个文件是否存在于文件系统中呢?
------------------------
/**
*/
public boolean exists(String src) throws IOException {
return namesystem.exists(new UTF8(src));//直接调用namesystem.
}
那下面我们来看看namesystem是如何来判断的。
public boolean exists(UTF8 src) {
if (dir.getFile(src) != null || dir.isDir(src)) {
return true;//从这可以看到,要么确实存在,如果不存在且是目录也可以。
} else {
return false;
}
}
先分析getFile(...)函数。
-----------------------------------------
public Block[] getFile(UTF8 src) {
waitForReady();
synchronized (rootDir) {
INode targetNode = rootDir.getNode(src.toString());//获取节点
if (targetNode == null) {
return null;//节点不存在
} else {
return targetNode.blocks;//节点存在,返回文件块信息
}
}
}
----------继续分析getNode
INode getNode(String target) {
if (! target.startsWith("/") || target.length() == 0) {
return null;//路径是否规范
} else if (parent == null && "/".equals(target)) {
return this;//是否为根目录
} else {
Vector components = new Vector();
int start = 0;
int slashid = 0;
while (start < target.length() && (slashid = target.indexOf('/', start)) >= 0) {
components.add(target.substring(start, slashid));
start = slashid + 1;
}
if (start < target.length()) {
components.add(target.substring(start));
}
return getNode(components, 0);//开启递归查找模式
}
}
---------
INode getNode(Vector components, int index) {
if (! name.equals((String) components.elementAt(index))) {
return null;//当前INode的名字是否OK?
}
if (index == components.size()-1) {
return this;//已经到了最后一个item
}
// Check with children
INode child = (INode) children.get(components.elementAt(index+1));//根据文件名从children中查找对应INode,然后再递归查找
if (child == null) {
return null;
} else {
return child.getNode(components, index+1);
}
}
-------------好,然后分析isDir函数
public boolean isDir(UTF8 src) {
synchronized (rootDir) {
INode node = rootDir.getNode(normalizePath(src));
return node != null && node.isDir();
}
}
这个就比较简单了,直接查看INode的block是否为NULL.
---从以上代码能分析出哪些结论?
1每个INode有个name
2 成员Block[] blocks记录了文件的块位置信息,如果没有则是目录
3 子INode信息存在TreeMap中,映射关系是(name,INode).
好,为后续分析提供了坚实的基础!