文档章节

查询文件系统

超人学院
 超人学院
发布于 2015/03/10 11:14
字数 1790
阅读 33
收藏 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在给定时间范围内选出文件。

© 著作权归作者所有

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

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

范堡
2009/05/24
109
0
Linux下umount卸载文件系统

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

adelphos
06/26
0
0
linux初级命令

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

Daniel风潇潇
2015/07/08
0
0
HAWQ技术解析(十六) —— 运维监控

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

wzy0623
2017/04/27
0
0
基于云上分布式NoSQL的海量气象数据存储和查询方案

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

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

没有更多内容

加载失败,请刷新页面

加载更多

《Netkiller Java 手札》· 二进制文件操作大全

本文节选自《Netkiller Java 手札》 Netkiller Java 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市望海路半岛城邦三期 518067 +86 13113668890 <netkiller@msn.com> $Id: book.xml 6......

netkiller-
17分钟前
0
0
Fiddler Debugger post请求

常用的两种: 第一种默认的 对应URL为www 的要用请求头为:Content-Type: application/x-www-form-urlencoded 请求参数为 :param1=1234¶m2=12345 注:有些接口是指定用这种的第二方式并不...

轻量级赤影
24分钟前
1
0
如何搭建母婴亲子类知识社区

近期社交领域融资动作频繁,海尔高管、海尔医疗有限公司总裁管礼庆创办的母婴知识分享社区平台Alwayslove于上月获得700万天使轮融资。 Alwayslove是一个母婴知识分享社区平台,采用UGC模式,...

ThinkSNS账号
26分钟前
0
0
Android 自定义构建类型 BuildType

最近接触到自定义构建类型 BuildType,发现这一块有些地方稍不注意的话会被绕进去浪费点时间,既然我这边已经花费时间了,如果正好你也需要接触到 BuildType,也许接下来分享的 tips 可能会帮...

猴亮屏
28分钟前
1
0
美团点评基于 Flink 的实时数仓建设实践

引言 近些年,企业对数据服务实时化服务的需求日益增多。本文整理了常见实时数据组件的性能特点和适用场景,介绍了美团如何通过 Flink 引擎构建实时数据仓库,从而提供高效、稳健的实时数据服...

美团技术团队
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部