文档章节

HDFS的exists函数解析

强子哥哥
 强子哥哥
发布于 2014/12/18 14:12
字数 456
阅读 371
收藏 6
点赞 0
评论 0

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

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

© 著作权归作者所有

共有 人打赏支持
强子哥哥

强子哥哥

粉丝 856
博文 551
码字总数 647493
作品 8
南京
架构师
使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作

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

xrzs ⋅ 2012/12/05 ⋅ 0

Hive的简单操作(37)

对Hive表的操作 hive -e "CREATE TABLE t3(id INT)"; hive -e可以不在hive shell脚本里面执行; 1 普通表 CREATE TABLE t1(id INT); hive插入数据:LOAD DATA LOCAL INPATH '/root/Downloads......

肖鋭 ⋅ 2014/04/09 ⋅ 0

一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

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

别叫小伙 ⋅ 2017/09/18 ⋅ 0

循序渐进,了解Hive是什么!

一直想抽个时间整理下最近的所学,断断续续接触hive也有半个多月了,大体上了解了很多Hive相关的知识。那么,一般对陌生事物的认知都会经历下面几个阶段: 为什么会出现?解决了什么问题? ...

青夜之衫 ⋅ 2017/12/05 ⋅ 0

hadoop判断文件是否存在

在shell中判断一个HDFS目录/文件是否存在 直接看shell代码: hadoop fs -test -e /hdfs_dir if [ $? -ne 0 ]; then echo "Directory not exists!" fi hadoop fs -test -e 用于判断HDFS目录/......

疯狂的艺术家 ⋅ 2013/05/15 ⋅ 0

Hive几种数据导入方式

1.从本地文件系统中导入数据到hive表 (1)数据准备(/home/sopdm/test.dat): 1,wyp,25,131888888882,test,30,138999999993,zs,34,89931412 (2)首先创建表use sopdm;drop table if exist...

qhaiyan ⋅ 2016/12/03 ⋅ 0

hive学习总结(1)—Hive几种数据导入方式

1.从本地文件系统中导入数据到hive表 (1)数据准备(/home/sopdm/test.dat): 1,wyp,25,13188888888 2,test,30,13899999999 3,zs,34,89931412 (2)首先创建表 use sopdm; drop table if e...

vieky ⋅ 2014/12/02 ⋅ 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 ⋅ 3

Hive学习总结之二:HiveQL介绍DDL

Hive支持原子和复杂数据类型。原子数据类型包括数值型、布尔型和字符串类型,其中数值型有int / bigint / smallint / tinyint /double / float,布尔型为boolean,字符串类型为string。复杂数...

酷帅CoolBash ⋅ 2013/01/30 ⋅ 0

hive自定义udf实现md5功能

Hive自定义UDF实现md5算法 Hive发展至今,自身已经非常成熟了,但是为了灵活性,还是提供了各种各样的插件的方式,只有你想不到的,没有做不到的,主流的开源框架都有类似的机制,包括Hadoo...

九劫散仙 ⋅ 2016/05/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 27分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 48分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 58分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部