HDFS——查询文件系统详解

1. 文件元数据:FileStatus

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

FileStatus的getFileStatus()方法用于获取文件或目录的FileStatus对象。看下面:

范例1,展示文件状态信息

public class ShowFileStatusTest{
    
    private MiniDFSCluster cluster;//use an in-process 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.Builder(conf).build();
        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
    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.isDirectory(),is(false));
        assertThat(stat.getLen(),is(7L));
        assertThat(stat.getModificationTime(),is(lessThanOrEqualTo(System.CurrentTimeMillis())));
        assertThat(stat.getReplication(),is((short)1));
        assertThat(stat.getBlockSize(),is(128*1024*1024L));
        assertThat(stat.getOwner(),is(System.getProperty("user.name")));
        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.isDirectory(),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(System.getProperty("user.name")));
        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来限制匹配的文件和目录。如果指定一组路径,其执行结果相当于依次轮流传递每条路径并对其调用listStatus()方法,再将FileStatus对象数组累积存入同一数组中,该方法更方便。在文件系统树的不同分支构建输入文件列表时,这是很有用的。举个例子(范例2),Hadoop中的FileUtil中stat2Path()方法的使用,它将一个FileStatus对象数组转换为一个Path对象数组:

范例2:

范例2:显示Hadoop文件系统中一组路径的文件信息

public class ListStatus{
    public static void main(String[] args) throws Exception{
        String uri = arg[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++){
            path[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作业可能需要分析一个月包含在大量目录中的日志文件。在一个表达式中使用通配符来匹配多个文件是比较方便的,无需列举每个文件和目录来指定输入,该操作称为“通配”,Hadoop为执行通配提供了两个FileSystem方法。

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

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

Hadoop支持的通配符与Unix bash shell支持的相同,见下表

通配符以及含义
通配符名称匹配
*星号匹配 0 或多个字符
问号匹配单一字符
[ab]字符类匹配{a,b}集合中的一个字符
[^ab]非字符类匹配非{a,b}集合中的一个字符
[a-b]字符范围匹配一个在{a,b}范围内的字符,包括a和b,a在字典顺序上要小于或等于b
[^a-b]非字符范围匹配一个不在{a,b}范围内的字符,包括a和b,a在字典顺序上要小于或等于b
{a,b}或选择匹配包含 a 或 b 中的一个表达式
\c转义字符匹配元字符c

 

 

 

 

 

 

 

 

 

 

 假设有日志文件存储在按日期分层组织的目录结构中,那么2019年的最后一天的日志文件就会保存在名为/2019/12/31的目录中。

下表是常用文件通配符的示例

常用的时间日期通配符
通配符扩展
/*/2018/2019
/*/*/2018/12/2019/01
/*/12/*/2018/12/01/2018/12/02
/201?/2017/2018
/201[78]/2017/2018
/201[7-8]/2017/2018
/201[^01234569]/2017/2018
/*/*/{31,01}/2017/12/31/2017/01/01
/*/*/3{0,1}/2017/12/30/2017/12/31
/*/{12/31,01/01}/2017/12/31/2018/01/01

 

 

 

 

 

 

 

 

 

 

 

 

4. PathFilter对象——过滤文件

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

package org.apache.hadoop.fs;

public insterface PathFilter{
    boolean accept(Path path);
}

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

下面举个例子(范例3),用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);
    }
}

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

fs.globStatus(new Path("/2017/*/*"),new RegexExcluderFilter("^.*/2017/12/31$"))

以Path为代表,过滤器只能作用于文件名。不能针对文件的属性(例如创建时间)来构建过滤器。但是,过滤器却能实现通配符模式和正则表达式都无法完成的匹配任务。例如,如果将文件存储在按照日期排列的目录结构中,则可以写一个PathFilter选出给定时间范围内的文件。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 HDFS HA及解决方案 1.1 HDFS系统架构 1.2 HA定义 1.3 HDFS HA原因分析及应对措施 1.3.1 可靠性 1.3.2 可维护性 1.4 现有HDFS HA解决方案 1.4.1 Hadoop的元数据备份方案 1.4.2 Hadoop的SecondaryNameNode方案 1.4.3 Hadoop的Checkpoint ode方案 1.4.4 Hadoop的BackupNode方案 1.4.5 DRDB方案 1.4.6 FaceBook的AvatarNode方案 1.5 方案优缺点比较 第2章 HDFS元数据解析 2.1 概述 2.2 内存元数据结构 2.2.1 INode 2.2.2 Block 2.2.3 BlockInfo和DatanodeDescriptor 2.2.4 小结 2.2.5 代码分析——元数据结构 2.3 磁盘元数据文件 2.4 Format情景分析 2.5 元数据应用场景分析 第3章 Hadoop的元数据备份方案 3.1 运行机制分析 4 3.1.1 NameNode启动加载元数据情景分析 3.1.2 元数据更新及日志写入情景分析 3.1.3 Checkpoint过程情景分析 3.1.4 元数据可靠性机制 3.1.5 元数据一致性机制 3.2 使用说明 第4章 Hadoop的Backup Node方案 4.1 Backup Node概述 4.1.1 系统架构 4.1.2 使用原则 4.1.3 优缺点 4.2 运行机制分析 4.2.1 启动流程 4.2.2 元数据操作情景分析 4.2.3 日志池(journal spool)机制 4.2.4 故障切换机制 4.3 实验方案说明 4.4 构建实验环境 4.4.1 网络拓扑 4.4.2 系统安装及配置 4.4.3 安装JDK 4.4.4 虚拟机集群架设 4.4.5 NameNode安装及配置 4.4.6 Backup Node安装及配置 4.4.7 Data Node安装及配置 4.4.8 Clients安装及配置 4.5 异常解决方案 4.5.1 异常情况分析 4.5.2 NameNode配置 4.5.3 Backup Node配置 4.5.4 Data Node配置 4.5.5 NameNode宕机切换实验 4.5.6 NameNode宕机读写测试 第5章 AvatarNode运行机制 5.1 方案说明 5.1.1 系统架构 5.1.2 思路分析 5.1.3 性能数据 5.2 元数据分析 5.2.1 类FSNamesystem 5.2.2 类FSDirectory 5.2.3 AvatarNode的磁盘元数据文件 5.3 AvatarNode Primary启动过程 5.4 AvatarNode Standby启动过程 5.4.1 AvatarNode的构造方法 5.4.2 Standby线程的run()方法 5.4.3 Ingest线程的run()方法 5.4.4 Ingest线程的ingestFSEdits ()方法 5.4.5 Standby线程的doCheckpoint()方法 5.5 用户操作情景分析 5.5.1 创建目录情景分析 5.5.2 创建文件情景分析 5.6 AvatarNode Standby故障切换过程 5.7 元数据一致性保证机制 5.7.1 元数据目录树信息 5.7.2 Data Node与Block数据块映射信息 5.8 Block更新同步问题 5.8.1 问题描述 5.8.2 结论 5.8.3 源码分析 第6章 AvatarNode使用 6.1 方案说明 6.1.1 网络拓扑 6.1.2 操作系统安装及配置 6.2 使用Avatar打补丁版本 6.2.1 Hadoop源码联机Build 6.2.2 Hadoop源码本地Build 6.2.3 NFS服务器构建 6.2.4 Avatar分发与部署 6.2.5 Primary(namenode0)节点配置 6.2.7 Data Node节点配置 6.2.8 Client节点配置 6.2.9 创建目录 6.2.10 挂载NFS 6.2.11 启动Ucarp 6.2.12 格式化 6.2.13 系统启动 6.2.14 检查 6.2.15 NameNode失效切换写文件实验 6.2.16 NameNode失效切换读文件实验 6.3 Avatar FaceBook版本的使用 6.3.1 Hadoop FaceBook版本安装 6.3.2 节点配置 6.3.3 启动HDFS 6.3.4 NameNode失效切换 第7章 AvatarNode异常解决方案 7.1 测试环境 7.2 Primary失效 7.2.1 解决方案 7.2.2 写操作实验步骤 7.2.3 改进写操作机制 7.2.4 读操作实验步骤 7.2.5 小结 7.3 Standby失效 7.4 NFS失效(数据未损坏) 7.4.1 解决方案 7.4.2 写操作实验步骤 7.4.3 读操作实验步骤 7.4.4 小结 322 7.5 NFS失效(数据已损坏) 7.5.1 解决方案 7.5.2 写操作实验步骤 7.5.3 读操作实验步骤 7.5.4 小结 7.6 Primary先失效,NFS后失效(数据未损坏) 7.6.1 解决方案 7.6.2 写操作实验步骤 7.6.3 读操作实验步骤 7.6.4 小结 7.7 Primary先失效(数据未损坏),NFS后失效(数据损坏) 7.7.1 解决方案 7.7.2 写操作实验步骤 7.7.3 读操作实验步骤 7.7.4 小结 7.8 NFS先失效(数据未损坏),Primary后失效 7.8.1 解决方案 7.8.2 写操作实验步骤 7.8.3 读操作实验步骤 7.8.4 小结 7.9 NFS先失效(数据损坏),Primary后失效(数据损坏) 7.9.1 解决方案 7.9.2 写操作实验步骤 7.9.3 读操作实验步骤 7.9.4 小结 7.10 实验结论 第8章 Cloudera HA NameNode使用 8.1 HA NameNode说明 8.2 CDH4B1版本HDFS集群配置 8.2.1 虚拟机安装 8.2.2 nn1配置 8.2.3 dn1~dn3配置 8.2.4 HDFS集群构建 8.3 HA NameNode配置 8.3.1 nn1配置 8.3.2 其他节点配置 8.4 HA NameNode使用 8.4.1 启动HA HDFS集群 8.4.2 第1次failover 8.4.3 模拟写操作 8.4.4 模拟Active Name Node失效,第2次failover 8.3.5 模拟新的Standby NameNode加入 8.5 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值