HDFS 客户端操作教程

本教程基于提供的 hdfsClient 类代码,详细说明 HDFS 文件系统常见操作。代码通过 Hadoop 的 FileSystem API 实现文件上传、下载、元数据查看等功能。


一、核心配置与连接

1. 创建 Configuration 对象
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2"); // 设置上传文件副本数为2(默认3)

作用

  • Configuration 加载 Hadoop 核心配置(如 core-site.xml, hdfs-site.xml
  • dfs.replication 指定文件在 HDFS 中的副本数量

2. 获取 FileSystem 实例
FileSystem fs = FileSystem.get(
    new URI("hdfs://bigdata01:8020"), // NameNode地址
    configuration,
    "root" // 操作HDFS的用户名
);

参数说明

  • URI:HDFS 集群地址(格式 hdfs://主机名:端口
  • user:执行操作的系统用户(需有HDFS权限)

二、文件操作详解

1. 文件上传
fs.copyFromLocalFile(
    new Path("c:/Users/admin/Desktop/Test.txt"), // 本地文件路径
    new Path("/xiyou/huaguoshan/sunwukong.txt") // HDFS目标路径
);

特点

  • 自动创建父目录(如 /xiyou/huaguoshan
  • 上传后本地文件保留

2. 文件下载
fs.copyToLocalFile(
    false, // 不删除源文件(true会删除HDFS文件)
    new Path("/xiyou/huaguoshan.txt"), // HDFS源路径
    new Path("c:/Users/admin/Desktop/Test2.txt"), // 本地目标路径
    true // 使用原生本地文件系统校验
);

典型错误
路径权限不足或本地目录不存在时会抛出 IOException


3. 文件重命名与移动
fs.rename(
    new Path("/xiyou/huaguoshan/sunwukong.txt"),
    new Path("/xiyou/huaguoshan/meihouwang.txt")
);

功能扩展

  • 跨目录重命名可实现文件移动
  • 目标路径必须不存在

4. 删除文件/目录
fs.delete(new Path("/xiyou"), true); // 递归删除目录

参数说明

  • boolean recursive:是否递归删除(目录非空时必须为 true

5. 查看文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
    LocatedFileStatus status = listFiles.next();
    System.out.println("文件名:" + status.getPath().getName());
    System.out.println("块大小:" + status.getBlockSize()); // 默认128MB
    BlockLocation[] blocks = status.getBlockLocations(); // 获取块分布信息
}

关键元数据

方法返回值示例说明
getPermission()rw-r--r--文件权限
getReplication()3副本数
getModificationTime()1625097600000最后修改时间(毫秒时间戳)

6. 判断文件/目录类型
FileStatus[] statusList = fs.listStatus(new Path("/"));
for (FileStatus status : statusList) {
    if (status.isFile()) {
        System.out.println(status.getPath() + " 是文件");
    } else {
        System.out.println(status.getPath() + " 是目录");
    }
}

三、注意事项

1. 资源关闭

所有操作后必须调用 fs.close() 释放连接资源,推荐使用 try-with-resources 自动关闭:

try (FileSystem fs = FileSystem.get(...)) {
    // 操作代码
} // 自动关闭
2. 路径规范
  • 本地路径:Windows 使用 C:/path/file.txt,Linux 使用 /home/user/file.txt
  • HDFS 路径:必须以 / 开头(如 /data/file.txt
3. 异常处理

方法声明中需抛出 IOException, URISyntaxException 等异常,或使用 try-catch 捕获:

try {
    fs.copyFromLocalFile(...);
} catch (AccessControlException e) {
    System.err.println("权限不足:" + e.getMessage());
}

四、操作示例总结

操作类型核心方法示例调用
上传文件copyFromLocalFile()fs.copyFromLocalFile(localPath, hdfsPath)
下载文件copyToLocalFile()fs.copyToLocalFile(false, hdfsPath, localPath, true)
重命名文件rename()fs.rename(oldPath, newPath)
删除目录delete()fs.delete(path, true)
查看块分布getBlockLocations()BlockLocation[] blocks = fileStatus.getBlockLocations()
判断文件类型isFile() / isDirectory()if (status.isFile()) { ... }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是少爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值