文档章节

查询文件系统

超人学院
 超人学院
发布于 2015/03/10 11:14
字数 1790
阅读 33
收藏 0
点赞 0
评论 0

1. 文件元数据:FileStatus

任何文件系统的一个重要特征都是提供其目录结构浏览和检索它所存文件和目录相关信息的功能。FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、复本、修改时间、所有者以及权限信息。

FileSystem的getFileStatus()方法用于获取文件或目录的FileStatus对象。范例3-5显示了它的用法。

范例3-5. 展示文件状态信息
 

public class ShowFileStatusTest {            private MiniDFSCluster cluster; // use an in-process HDFS cluster for testing      private FileSystem fs;         @Before      public void setUp() throws IOException {        Configuration conf = new Configuration();        if (System.getProperty("test.build.data") == null) {          System.setProperty("test.build.data", "/tmp");        }        cluster = new MiniDFSCluster(conf, 1, true, null);        fs = cluster.getFileSystem();        OutputStream out = fs.create(new Path("/dir/file"));        out.write("content".getBytes("UTF-8"));        out.close();      }            @After      public void tearDown() throws IOException {        if (fs != null) { fs.close(); }        if (cluster != null) { cluster.shutdown(); }      }            @Test(expected = FileNotFoundException.class)      public void throwsFileNotFoundForNonExistentFile() throws IOException {        fs.getFileStatus(new Path("no-such-file"));      }            @Test      public void fileStatusForFile() throws IOException {        Path file = new Path("/dir/file");        FileStatus stat = fs.getFileStatus(file);        assertThat(stat.getPath().toUri().getPath(), is("/dir/file"));        assertThat(stat.isDir(), is(false));        assertThat(stat.getLen(), is(7L));        assertThat(stat.getModificationTime(),            is(lessThanOrEqualTo(System.currentTimeMillis())));        assertThat(stat.getReplication(), is((short) 1));        assertThat(stat.getBlockSize(), is(64 * 1024 * 1024L));        assertThat(stat.getOwner(), is("tom"));        assertThat(stat.getGroup(), is("supergroup"));        assertThat(stat.getPermission().toString(), is("rw-r--r--"));      }            @Test      public void fileStatusForDirectory() throws IOException {        Path dir = new Path("/dir");        FileStatus stat = fs.getFileStatus(dir);        assertThat(stat.getPath().toUri().getPath(), is("/dir"));        assertThat(stat.isDir(), is(true));        assertThat(stat.getLen(), is(0L));        assertThat(stat.getModificationTime(),            is(lessThanOrEqualTo(System.currentTimeMillis())));        assertThat(stat.getReplication(), is((short) 0));        assertThat(stat.getBlockSize(), is(0L));        assertThat(stat.getOwner(), is("tom"));        assertThat(stat.getGroup(), is("supergroup"));        assertThat(stat.getPermission().toString(), is("rwxr-xr-x"));      }          }

如果文件或目录均不存在,会抛出一个FileNotFoundException异常。但如果只是想检查文件或目录是否存在,那么调用exists()方法会更方便:
 

public boolean exists(Path f) throws IOException

2. 列出文件

查找一个文件或目录相关的信息很实用,但通常还需要能够列出目录中的内容。这就是FileSystem的listStatus()方法的功能:
 

public FileStatus[] listStatus(Path f) throws IOException    public FileStatus[] listStatus(Path f, PathFilter filter) throws IOException    public FileStatus[] listStatus(Path[] files) throws IOException    public FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException

当传入的参数是一个文件时,它会简单转变成以数组方式返回长度为1的FileStatus对象。当传入参数是一个目录时,则返回0或多个FileStatus对象,表示此目录中包含的文件和目录。

它的重载方法允许使用PathFilter来限制匹配的文件和目录——可以参见3.5.5节提供的例子。最后,如果指定一组路径,其执行结果相当于依次轮流传递每条路径并对其调用listStatus()方法,再将FileStatus对象数组累积存入同一数组中,但该方法更为方便。这从文件系统树的不同分支构建输入文件列表时,这是很有用的。范例3-6简单显示了这个方法。注意FileUtil中stat2Paths()方法的使用,它将一个FileStatus对象数组转换为一个Path对象数组。

范例3-6. 显示Hadoop 文件系统中一组路径的文件信息
 

public class ListStatus {           public static void main(String[] args) throws Exception {         String uri = args[0];         Configuration conf = new Configuration();         FileSystem fs = FileSystem.get(URI.create(uri), conf);                  Path[] paths = new Path[args.length];         for (int i = 0; i < paths.length; i++) {           paths[i] = new Path(args[i]);         }         FileStatus[] status = fs.listStatus(paths);         Path[] listedPaths = FileUtil.stat2Paths(status);         for (Path p : listedPaths) {           System.out.println(p);         }       }     }

我们可以用这个程序来显示一组路径集目录列表的并集:
 

% hadoop ListStatus hdfs://localhost/ hdfs://localhost/user/tom    hdfs://localhost/user    hdfs://localhost/user/tom/books    hdfs://localhost/user/tom/quangle.txt

3. 文件模式

在单个操作中处理一批文件是一个很常见的需求。例如,一个用于处理日志的MapReduce作业可能需要分析一个月内包含在大量目录中的日志文件。在一个表达式中使用通配符来匹配多个文件是比较方便的,无需列举每个文件和目录来指定输入,该操作称为“通配”(globbing)。Hadoop为执行通配提供了两个FileSystem方法:
 

public FileStatus[] globStatus(Path pathPattern) throws IOException    public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException

globStatus()方法返回与其路径匹配于指定模式的所有文件的FileStatus对象数组,并按路径排序。PathFilter命令作为可选项可以进一步对匹配结果进行限制。

Hadoop支持的通配符与Unix bash的相同(参见表3-2)。

表3-2. 通配符及其含义

通配符

名称

匹配

*

星号

匹配或多个字符

问号

匹配单一字符

[ab]

字符类

匹配{a,b}集合中的一个字符

[^ab]

非字符类

匹配非{a,b}集合中的一个字符

[a-b]

字符范围

匹配一个在{a,b}范围内的字符(包括ab)a在字典顺序上要小于或等于b

[^a-b]

非字符范围

匹配一个不在{a,b}范围内的字符(包括ab)a在字典顺序上要小于或等于b

{a,b}

或选择

匹配包含中的一个的表达式

\c

转义字符

匹配元字符c

假设有日志文件存储在按日期分层组织的目录结构中。如此一来,2007年最后一天的日志文件就会保存在名为/2007/12/31的目录中。假设整个文件列表如下所示:
 

        /  |—— 2007/  |     ┗——12/  |       |—— 30/  |       ┗——31/  ┗——2008/        ┗—— 01/             |—— 01/             ┗—— 02/

一些文件通配符及其扩展如下所示。

通配符

扩展

/*

/2007/2008

/*/*

/2007/12/2008/01

/*/12/*

/2007/12/30/2007/12/31

/200?

/2007/2008

/200[78]

/2007/2008

/200[7-8]

/2007/2008

/200[^01234569]

/2007/2008

/*/*/{31,01}

/2007/12/31/2008/01/01

/*/*/3{0,1}

/2007/12/30/2007/12/31

/*/{12/31,01/01}

/2007/12/31/2008/01/01

4. PathFilter对象

通配符模式并不总能够精确地描述我们想要访问的文件集。比如,使用通配格式排除一个特定的文件就不太可能。FileSystem中的listStatus()和globStatus()方法提供了可选的PathFilter对象,以编程方式控制通配符:
 

package org.apache.hadoop.fs;         public interface PathFilter {        boolean accept(Path path);     }

PathFilter与java.io.FileFilter一样,是Path对象而不是File对象。

范例3-7显示了PathFilter用于排除匹配正则表达式的路径。

范例3-7. PathFilter,用于排除匹配正则表达式的路径
 

public class RegexExcludePathFilter implements PathFilter {              private final String regex;           public RegexExcludePathFilter(String regex) {         this.regex = regex;       }           public boolean accept(Path path) {         return !path.toString().matches(regex);       }     }

这个过滤器只传递不匹配于正则表达式的文件。在通配符选出一组需要包含的初始文件之后,过滤器可优化其结果。如下示例将扩展到/2007/12/30:
 

fs.globStatus(new Path("/2007/*/*"), new RegexExcludeFilter("^.*/2007/12/31$"))

过滤器由Path表示,只能作用于文件名。不能针对文件的属性(例如创建时间)来构建过滤器。但是,通配符模式和正则表达式同样无法对文件属性进行匹配。例如,如果将文件存储在按照日期排列的目录结构中(如前一节中讲述的那样),则可以根据Pathfilter在给定时间范围内选出文件。

© 著作权归作者所有

共有 人打赏支持
超人学院
粉丝 106
博文 335
码字总数 388917
作品 0
昌平
CTO(技术副总裁)
Linux操作系统下关于RPM软件包管理方法

rpm -qa:查询并显示系统中已安装的软件包的详细信息 rpm -qi:查询指定软件包的详细信息 rpm -ql:查询指定软件包中包括的文件列表 rpm -qf:指定文件所属软件包 rpm -qpi:rpm安装包文件的...

范堡 ⋅ 2009/05/24 ⋅ 0

Linux下umount卸载文件系统

1. intruduction 命令用于卸载指定文件系统 卸载文件系统时,须所有用户需退出挂载的文件系统,也没有任何程序在读写文件系统。 卸载文件系统时,按挂载的逆顺序依次卸载。如 mount /dev/sda...

adelphos ⋅ 2015/03/01 ⋅ 0

HAWQ技术解析(十六) —— 运维监控

与任何IT系统一样,为了保证HAWQ集群的高可用和高性能,需要进行一系列监控与维护活动。本篇讨论HAWQ推荐的运维与监控活动。 一、推荐的监控与维护任务 表1至表5是HAWQ向系统管理员推荐定期执...

wzy0623 ⋅ 2017/04/27 ⋅ 0

浅谈webshell检测方式

一 什么是webshell “web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程...

Tar0 ⋅ 2016/01/10 ⋅ 0

linux初级命令

1. exit 退出 date 查看日期时间 bc 计算器 hwclock 硬件时间 cal: 月历/日历 2. shutdown -h/-r 关机重启 reboot:重启 poweroff:关机 alias 别名 unalias 取消别名 3. pwd:查看当前目录 ...

Daniel风潇潇 ⋅ 2015/07/08 ⋅ 0

基于云上分布式NoSQL的海量气象数据存储和查询方案

摘要:气象数据是一类典型的大数据,具有数据量大、时效性高、数据种类丰富等特点,每天产生的数据量常在几十TB到上百TB的规模,且在爆发性增长。如何存储和高效的查询这些气象数据越来越成为...

阿里云云栖社区 ⋅ 2017/12/01 ⋅ 0

Linux常用命令分类汇总(5)

由于本篇文章整理时间比较久,篇幅比较长,博客无法一次性以一篇文章发布,其他的内容见文章链接 Linux常用命令分类汇总(1) http://longlei.blog.51cto.com/12685458/1970770 Linux常用命令...

long9617 ⋅ 2017/10/08 ⋅ 0

CI的“数据库缓存类”

1 作用:数据库缓存类允许你把数据库查询结果保存在文本文件中以减少对数据库的访问。 2 工作原理:当页面被浏览时CI的查询缓存系统能够动态执行。如果缓存特性被激活,那么在此页面首次被加...

图巴巴 ⋅ 2012/07/02 ⋅ 0

基于云上分布式NoSQL的海量气象数据存储和查询方案

前言 气象数据是一类典型的大数据,具有数据量大、时效性高、数据种类丰富等特点。气象数据中大量的数据是时空数据,记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量,每天产生...

云栖社区 ⋅ 2017/11/22 ⋅ 0

用户空间文件系统--kpfs

kpfs是一款基于FUSE开发的用户空间文件系统,实现了在Linux中对快盘的基本操作。当文件系统挂载到Linux的某个文件夹下,用户只需像普通文件一样操作自己快盘中的目录和文件。 kpfs的特点 基于...

kjpioo ⋅ 2013/07/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sbt网络问题解决方案

http://dblab.xmu.edu.cn/blog/maven-network-problem/

狐狸老侠 ⋅ 12分钟前 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 55分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部