文档章节

HDFS的exists函数解析

强子1985
 强子1985
发布于 2014/12/18 14:12
字数 456
阅读 395
收藏 6

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

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

© 著作权归作者所有

共有 人打赏支持
强子1985

强子1985

粉丝 882
博文 1180
码字总数 870993
作品 8
南京
架构师
私信 提问
使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作

Hadoop文件系统 基本的文件系统命令操作, 通过hadoop fs -help可以获取所有的命令的详细帮助文件。 Java抽象类org.apache.hadoop.fs.FileSystem定义了hadoop的一个文件系统接口。该类是一个抽...

大数据之路
2012/12/05
0
0
PostgreSQL 源码解读(28)- 查询语句#13(查询优化-上拉子链接#3)

本节简单介绍了PG查询逻辑优化中的子查询链接(subLink),以EXISTS子链接为例介绍了子查询链接上拉主函数处理逻辑以及使用gdb跟踪分析。 一、源码解读 上一节介绍了ANY子链接,本节介绍了EXIST...

EthanHe
2018/08/27
0
0
org.apache.hadoop.mapred.FileAlreadyExistsException

利用mapreduce进行数据计算,但出现错误: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://127.0.0.1:9000/dir/output_sig already exists Exception in t......

mackaywang
2015/01/07
730
3
scala中hdfs文件的操作

对于org.apache.hadoop.fs.Path来说, path.getName只是文件名,不包括路径 path.getParent也只是父文件的文件名,同样不包括路径 path.toString才是文件的全路径名 创建文件 hdfs.createNew...

hblt-j
2018/11/21
0
0
一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

1:MapReduce的概述:   (1):MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.   (2):MapReduce由两个阶段组成:Map和Reduce,用户只需要...

别叫小伙
2017/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ZStack--工作流引擎

在IaaS软件中的任务通常有很长的执行路径,一个错误可能发生在任意一个给定的步骤。为了保持系统的完整性,一个IaaS软件必须提供一套机制用于回滚先前的操作步骤。通过一个工作流引擎,ZStac...

ZStack社区版
12分钟前
0
0
Eclipse 安装lombok

1.首先打开lombok官网:https://projectlombok.org/ 2.选择下载 3.使用java -jar 运行jar包(一般情况下双击即可) 4.安装 5.重启IDE...

hengbao5
16分钟前
1
0
混合式开发框架资料汇总

1.quickhybrid 2.kerkee 3.Hybrid

IT追寻者
23分钟前
0
0
PyCharm入门教程——基本编辑程序

PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web...

电池盒
26分钟前
0
0
分布式、高并发、多线程

分布式 分布式是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。包括但不限于:分布式文件系统,分布式缓存,分布式数据库,分布式计算。 分布式的实现有两种形式: 水平扩展:...

细节探索者
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部