首页 > HDFS的exists函数解析

HDFS的exists函数解析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在上传一个文件时,需要判断文件是否存在于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).

好,为后续分析提供了坚实的基础!

转载于:https://my.oschina.net/qiangzigege/blog/357591

更多相关:

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...

  • 在使用空时,习惯这么赋值  int *p = NULL;  编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数。  因此这面的问题就尴尬了 不好意思图片引用于网络中。 为啥呢不是this is the ptr function…这个。这就是C++中的...

  • var d= {a: 1,b: null,c: 3,d: undefined };Object.keys(d).forEach(k=>d[k]==null&&delete d[k]);//去掉值为null或undefined的对象属性//Object.keys(d).forEach(k=>(d[k]==null||d[k]==='')...

  • //ES6获取浏览器url跟参 public getUrlParam = a => (a = location.search.substr(1).match(new RegExp(`(^|&)${a}=([^&]*)(&|$)`)),a?a[2]:null);...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下C++实现C语言实现4. 缺点 1. 解决问题 在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣服的生产过程进行了封装。 当我们增加衣服种类的时候,在简单工厂模式中需要修改工厂的代码,破坏了类的开闭原则(对扩展开发, 对修改关闭),...

  • 在服务端数据库的处理当中,涉及中文字符的结构体字段,需要转为Utf8后再存储到表项中。从数据库中取出包含中文字符的字段后,如果需要保存到char *类型的结构体成员中,需要转为Ansi后再保存。从数据库中取出类型数字的字段后,如果需要保存到int型的结构体成员中,需要调用atoi函数进行处理后再保存。 1 static char *...