HDFS API 操作(Scala&Java版本)

目录

1. API 操作流程说明

2. 相关API

2.1 创建目录

2.2 上传文件

2.3 下载文件

2.4 更名&移动文件

2.5 删除文件或目录

2.6  查看文件详情

2.7 对 文件和目录的 判断


1. API 操作流程说明

 Configuration 类
 功能:
        解析并封装参数
        加载 默认配置文件 core-default.xml、hdfs-default.xml
        加载 自定义配置文件 resources目录下 core-site.xml、hdfs-site.xml


FileSystem 类
功能:
        文件系统的抽象基类,它的实现可以是分布式文件系统、也可以是”本地“文件系统
 常用实现类:
        LocalFileSystem : 本地文件系统
        DistributedFileSystem : 分布式文件系统


2. 相关API

2.1 创建目录

使用默认权限创建(drwxr-xr-x)
public boolean mkdirs(Path f)

使用指定权限创建
public boolean mkdirs(Path f, FsPermission permission)

tips:  1.当目录存在时,会返回true(不会报错哦)

        2.当发生写入失败,没有权限(Permission denied: user=worker01),可以看这里 传送门

代码示例:

  test("创建目录") {
    // 1. 获取客户端
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "worker01"
    )

    // 2.1 创建目录(使用默认权限 drwxr-xr-x)
    val bool = fs.mkdirs(new Path("/csv/dir"))

    // 2.2 创建目录(使用指定权限)
    //    val bool = fs.mkdirs(new Path("/dawang/tmp/demo5")
    //      , new FsPermission(100644))

    // 3. 关闭资源
    fs.close()
    println(s"是否创建成功:$bool")

  }

2.2 上传文件

public void copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
public void copyFromLocalFile(boolean delSrc, Path src, Path dst)
public void copyFromLocalFile(Path src, Path dst)

delSrc – 是否删除本地的源文件(默认为false)
overwrite – 是否覆盖现有文件(默认为true)
src – path  本地文件路径
dst – path  hdfs文件路径

FAQ: 报错: File /dawang/3.txt could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

看这里: 传送门

代码示例:

  test("上传文件") {

    // 1 获取文件系统
    val conf = new Configuration()

    // 指定 文件副本个数
    conf.set("dfs.replication", "4")

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 上传文件
    fs.copyFromLocalFile(
      new Path("src/main/resources/data/1.txt"), // 指定本地路径
      new Path("/dawang/4.txt") // 指定hdfs路径
    )

    // 3 关闭资源
    fs.close()
    println("上传成功~")

  }

2.3 下载文件

public void copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem)
public void copyToLocalFile(boolean delSrc, Path src, Path dst)
public void copyToLocalFile(Path src, Path dst)

delSrc – 是否删除hdfs的源文件(默认为false)
src – path  指定hdfs路径
dst – path  指定本地路径
useRawLocalFileSystem – 是否使用RawLocalFileSystem作为本地文件系统(默认为false),
                                              当为true时,会在本地生成  xxx.crc 校验文件

代码示例:

  test("下载文件") {

    // 1 获取文件系统
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 下载文件
    fs.copyToLocalFile(
      false,
      new Path("/dawang/4.txt"), // 指定hdfs路径
      new Path("src/main/resources/data/2.txt"), // 指定本地路径
      false
    )

    // 3 关闭资源
    fs.close()
    println("下载成功~")

  }

2.4 更名&移动文件

public boolean rename(Path src, Path dst)
tips:
     操作成功,返回true
     操作失败,返回false

代码示例:

  test("更名&移动文件") {

    // 1 获取文件系统
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 移动文件
    val bool = fs.rename(
      new Path("/dawang/3.txt"), // 指定hdfs路径
      new Path("/tmp/dawang_2.txt") // 指定hdfs路径
    )

    // 3 关闭资源
    fs.close()
    println(s"操作完成: $bool")

  }

2.5 删除文件或目录

public boolean delete(Path f, boolean recursive)

参数:
     recursive: 是否递归删除(true-递归,false-不递归)

结果:
     返回 false,删除失败
     返回 true, 删除成功

tips:
     生产环境慎用(尤其是递归删除)💀😱!!!!
代码示例:

  test("删除文件或目录") {

    // 1 获取文件系统
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 删除文件
    val bool = fs.delete(
      new Path("/001"), // 指定hdfs路径
      true // 递归删除
    )

    // 3 关闭资源
    fs.close()
    println(s"操作结果: $bool")

  }

2.6  查看文件详情

public RemoteIterator<LocatedFileStatus> listFiles(final Path f, final boolean recursive)

功能:
       返回 指定路径下 文件的信息(文件名称、权限、长度、块信息等)

参数:
       recursive – 是否递归遍历子目录(true-递归,false-不递归)

结果:
       返回 LocatedFileStatus的迭代器(LocatedFileStatus对象封装了文件的元数据信息)

代码示例:

  test("查看文件详情") {

    // 1 获取文件系统
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 获取文件详情
    val listFiles: RemoteIterator[LocatedFileStatus] = fs.listFiles(
      new Path("/dawang"), // 指定hdfs路径
      true // 递归子目录
    )

    while (listFiles.hasNext) {
      val fileStatus = listFiles.next

      // 获取文件路径信息
      println("getPath:" + fileStatus.getPath)
      // 获取文件权限信息
      println("getPermission:" + fileStatus.getPermission)
      // 获取文件所有者
      println("getOwner:" + fileStatus.getOwner)
      // 获取文件组
      println("getGroup:" + fileStatus.getGroup)
      // 获取文件大小(bytes)
      println("getLen:" + fileStatus.getLen)
      // 获取文件最近修改时间(时间戳)
      println("getModificationTime:" + fileStatus.getModificationTime)
      // 获取文件副本个数
      println("getReplication:" + fileStatus.getReplication)
      // 获取文件块的大小(bytes)
      println("getBlockSize:" + fileStatus.getBlockSize)
      // 获取文件名称
      println("getName:" + fileStatus.getPath.getName)

      // 获取块信息
      val blockLocations: Array[BlockLocation] = fileStatus.getBlockLocations
      blockLocations.foreach(println(_))

      println("")
      println("----------------------------------------------")

    }

    // 3 关闭资源
    fs.close()
    println("操作成功~")

  }

执行结果:


2.7 对 文件和目录的 判断

 代码示例:

  test("对 文件和目录的 判断") {

    // 1 获取文件系统
    val conf = new Configuration()

    val fs = FileSystem.get(
      new URI("hdfs://worker01:8020"),
      conf, "root"
    )

    // 2 对 文件和目录的 判断
    val fileStatuses: Array[FileStatus] = fs.listStatus(
      new Path("/dawang") // 指定hdfs路径
    )
    fileStatuses.foreach(
      file => {
        // 判断是否是文件
        if (file.isFile)
          println(file.getPath + " 是文件")
        else
          println(file.getPath + " 是目录")
      }
    )

    // 3 关闭资源
    fs.close()
    println("操作成功~")

  }

执行结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值