学习篇-Hadoop-HDFS-API-相关文件操作

一、HDFS-API-create写入文件内容

要求:将“hdfs write test”写入进/hdfsapi/test/01.txt文件中。

  • 代码实现:

    // 创建需要写入内容的文件
    FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/01.txt"));
    // 写入内容
    out.writeUTF("hdfs write test");
    // 刷新缓存
    out.flush();
    // 关闭流
    out.close();
    
  • 使用hadoop fs -ls /hdfsapi/test查看文件是否存在
    在这里插入图片描述

  • 再使用hadoop fs -cat /hdfsapi/test/01.txt查看文件内容是否一致
    在这里插入图片描述

  • 注意需要手动配置副本数,因为在hadoop-hdfs-2.6.0-cdh5.15.1.jar中hdfs-default.xml文件默认配置3副本
    在这里插入图片描述
    设置dfs.replication属性为1即可:

    configuration.set("dfs.replication", "1");
    
二、HDFS-API-rename文件名
  • 代码实现

    // 源文件
    Path src = new Path("/hdfsapi/test/01.txt");
    // 目标文件
    Path dst = new Path("/hdfsapi/test/02.txt");
    // 重命名
    fileSystem.rename(src, dst);
    
  • 查看结果
    在这里插入图片描述

三、HDFS-API-copyFromLocalFile拷贝本地文件到hdfs
  • 代码实现

    // 拷贝的源文件路径
    Path src = new Path("/Users/xxxx/Downloads/sonar.txt");
    // 拷贝进hdfs的存放路径
    Path dst = new Path("/hdfsapi/test");
    // 拷贝
    fileSystem.copyFromLocalFile(src, dst);
    
  • 查看结果
    在这里插入图片描述

四、HDFS-API-带进度拷贝大文件
  • 代码实现

    // 获取源文件
    InputStream in = new BufferedInputStream(new FileInputStream(new File("/Users/x xx/Downloads/hadoop-2.6.0-cdh5.15.1.tar.gz")));
    // 需要上传hdfs的路径,带进度上传
    FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/cdh5.tgz"), new Progressable() {
      @Override
      public void progress() {
        System.out.print(".");
      }
    });
    // 拷贝文件
    IOUtils.copyBytes(in, out, 4096);
    
  • 代码效果:
    在这里插入图片描述

  • 存放位置
    在这里插入图片描述

五、HDFS-API-copyToLocalFile拷贝文件到本地
  • 代码实现

    // hdfs的文件路径
    Path src = new Path("/hdfsapi/test/02.txt");
    // 本地目录
    Path dst = new Path("/Users/xxx");
    // 拷贝到本地
    fileSystem.copyToLocalFile(src, dst);
    
六、HDFS-API-listStatus查看文件目录
  • 代码实现

    // 读取hdfs文件目录
    FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/hdfsapi/test"));
    // 遍历文件目录
    for (FileStatus fileStatus: fileStatuses) {
      short replication = fileStatus.getReplication();
      long len = fileStatus.getLen();
      String path = fileStatus.getPath().toString();
      System.out.println(replication + "\t" + len + "\t" + path );
    }
    
  • FileStatus
    在这里插入图片描述

  • 控制台打印结果
    在这里插入图片描述

  • 这种方式存在一个问题,就是目录中的目录文件是无法列出的。

七、HDFS-API-listFiles递归查看文件目录
  • 代码实现

    // 通过listFiles方法获取RemoteIterator对象
    RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/hdfsapi/test"), true);
    // 遍历迭代器
    while (listFiles.hasNext()) {
      LocatedFileStatus fileStatus = listFiles.next();
      short replication = fileStatus.getReplication();
      long len = fileStatus.getLen();
      String path = fileStatus.getPath().toString();
      System.out.println(replication + "\t" + len + "\t" + path );
    }
    
  • 控制台效果
    在这里插入图片描述

八、HDFS-API-getFileBlockLocations查看文件块信息
  • 代码实现

    // 通过路径构造FileStatus对象
    FileStatus fileStatus = fileSystem.getFileStatus(new Path("/hdfsapi/test/cdh5.tgz"));
    // 调用fileSystem的getFileBlockLocations方法构造BlockLocation数组
    BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
    // 遍历块信息数组
    for (BlockLocation block: blocks) {
      for (String name: block.getNames()) {
        System.out.println(name + " : " + block.getOffset() + " : " + block.getLength());
      }
    }
    
  • 控制台效果:
    在这里插入图片描述

九、HDFS-API-delete删除文件
  • 代码实现

    // 注意递归是否要打开true/false
    fileSystem.delete(new Path("/hdfsapi/test/02.txt"), true);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值