跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

分布式文件系统 HDFS:编程实践与 Java API 详解

HDFS 编程实践涵盖 Shell 命令操作、Web 界面监控以及 Java API 开发。通过 hadoop fs 等命令可快速管理文件,Web 页面提供可视化监控。核心在于 Java API 的使用,包括 FileSystem、Path 等类。本文以文件合并为例,演示了从 Eclipse 项目创建、依赖配置、代码编写到 JAR 包部署运行的完整流程,帮助开发者掌握 HDFS 的编程接口与最佳实践。

星辰大海发布于 2026/3/23更新于 2026/10/2080 浏览
分布式文件系统 HDFS:编程实践与 Java API 详解

HDFS 提供了多种访问方式,除了命令行操作和 Web 界面监控外,Java API 是进行自动化开发和集成最核心的手段。本文将介绍 Linux 下常用的 Shell 命令、Web 页面查看方法,并重点通过实例演示如何利用 Java API 完成文件上传、合并等操作。

一、HDFS 常用命令

在 Linux 环境中,hadoop fs 是最通用的命令,适用于本地文件和 HDFS。此外还有 hadoop dfs 和 hdfs dfs,后两者仅针对 HDFS。基本用法如下:

hadoop fs [genericOptions][commandOptions]

以下是一些高频使用的命令:

  • hadoop fs -ls <path>:显示指定路径的文件详细信息。
  • hadoop fs -cat <path>:将文件内容输出到标准输出。
  • hadoop fs -mkdir [-p] <paths>:创建文件夹,-p 支持递归创建。
  • hadoop fs -copyFromLocal <localsrc> <dst>:从本地复制文件到 HDFS。
  • hadoop fs -put <localsrc> <dst>:功能同 copyFromLocal,也支持从 stdin 读取。
  • hadoop fs -rm -r <path>:递归删除目录及其内容。
  • hadoop fs -setrep [-R] <path>:修改文件副本系数。
  • hadoop fs -getmerge [-nl] <src> <localdst>:合并源目录下的文件到本地。

二、HDFS 的 Web 页面

配置好集群后,可以通过浏览器访问 NameNode 的 Web UI(默认端口 9870)。例如伪分布式模式下访问 http://localhost:9870。这里可以直观地浏览文件系统结构、查看节点日志以及下载特定数据块。虽然 Web 界面方便查看,但日常运维和开发中更推荐使用 Shell 命令或 API 来实现自动化管理。

三、HDFS 常用 Java API 及应用实例

Hadoop 基于 Java 实现,通过调用 Java API 可以灵活地与 HDFS 交互。以下是核心类说明:

  • org.apache.hadoop.fs.FileSystem:通用文件系统抽象基类,所有 HDFS 操作的基础。
  • org.apache.hadoop.fs.FileStatus:展示文件和目录的元数据,如大小、权限、所有者等。
  • org.apache.hadoop.fs.FSDataInputStream/OutputStream:用于读写 HDFS 文件的流。
  • org.apache.hadoop.conf.Configuration:管理配置项,优先读取 core-site.xml。
  • org.apache.hadoop.fs.Path:表示文件系统路径。
应用实例:文件合并

下面通过一个实际案例,演示如何编写 Java 程序合并 HDFS 中的多个文件,并过滤掉特定后缀的文件。

1. 项目准备

在 Eclipse 中创建一个名为 HDFSExample 的 Java 工程。确保 JDK 版本与 Hadoop 环境兼容(推荐 JDK 1.8)。

2. 添加依赖库

进入项目属性设置,在 Libraries 选项卡中添加外部 JAR 包。需要包含以下目录下的所有 jar 文件(注意排除 jdiff、lib、sources 等目录):

  • /usr/local/hadoop/share/hadoop/common
  • /usr/local/hadoop/share/hadoop/common/lib
  • /usr/local/hadoop/share/hadoop/hdfs
  • /usr/local/hadoop/share/hadoop/hdfs/lib

这确保了程序能正确识别 HDFS 协议和配置。

3. 编写代码

新建类 MergeFile,主要逻辑包括初始化 Configuration、获取 FileSystem 实例、遍历文件列表并写入目标文件。代码如下:

import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

/**
 * 过滤掉文件名满足特定条件的文件
 */
class MyPathFilter implements PathFilter {
    String reg = null;

    MyPathFilter(String reg) {
        this.reg = reg;
    }

    public boolean accept(Path path) {
        if (!(path.toString().matches(reg))) return true;
        return false;
    }
}

/**
 * 利用 FSDataOutputStream 和 FSDataInputStream 合并 HDFS 中的文件
 */
public class MergeFile {
    Path inputPath = null; // 待合并的文件所在的目录的路径
    Path outputPath = null; // 输出文件的路径

    public MergeFile(String input, String output) {
        this.inputPath = new Path(input);
        this.outputPath = new Path(output);
    }

    public void doMerge() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        
        FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
        FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);

        // 过滤掉输入目录中后缀为 .abc 的文件
        FileStatus[] sourceStatus = fsSource.listStatus(inputPath, new MyPathFilter(".*\\.abc"));
        FSDataOutputStream fsdos = fsDst.create(outputPath);
        PrintStream ps = new PrintStream(System.out);

        for (FileStatus sta : sourceStatus) {
            System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen() + " 权限:" + sta.getPermission() + " 内容:");
            FSDataInputStream fsdis = fsSource.open(sta.getPath());
            byte[] data = new byte[1024];
            int read = -1;
            while ((read = fsdis.read(data)) > 0) {
                ps.write(data, 0, read);
                fsdos.write(data, 0, read);
            }
            fsdis.close();
        }
        ps.close();
        fsdos.close();
    }

    public static void main(String[] args) throws IOException {
        MergeFile merge = new MergeFile("hdfs://localhost:9000/user/hadoop/", "hdfs://localhost:9000/user/hadoop/merge.txt");
        merge.doMerge();
    }
}

4. 运行与验证

确保 Hadoop 集群已启动,且 HDFS 中存在测试文件(如 file1.txt, file2.txt 等)。在 Eclipse 中直接运行 main 方法。控制台会输出处理过程信息。运行结束后,可通过终端命令验证结果:

hdfs dfs -cat /user/hadoop/merge.txt

5. 部署到集群

若需在集群上独立运行,需将项目打包为 JAR 文件。在 Eclipse 中选择 Export -> Runnable JAR file,选择主类 MergeFile,勾选 "Extract required libraries into generated JAR",导出为 HDFSExample.jar。

将 JAR 包上传至服务器后,使用 hadoop jar 命令提交任务:

hadoop jar ./myapp/HDFSExample.jar

总结

本文梳理了 HDFS 的三种主要操作方式。Shell 命令适合快速运维,Web 界面适合状态监控,而 Java API 则是构建大数据应用的基础。通过上述合并文件的实例,展示了从环境配置、依赖引入到代码编写及部署的全流程。掌握这些 API 细节,能帮助开发者更高效地处理分布式存储中的数据流转问题。

目录

  1. 一、HDFS 常用命令
  2. 二、HDFS 的 Web 页面
  3. 三、HDFS 常用 Java API 及应用实例
  4. 应用实例:文件合并
  5. 总结

更多推荐文章

查看全部
  • 宜搭低代码高级认证:待办列表自定义页面实战指南
  • DFS 算法详解:求解数组子集问题
  • 基于 Python+Flask 的超市会员管理系统设计与实现
  • Stable Diffusion 插件 StyleSelectorXL 七十七种绘画风格使用指南
  • 从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案
  • Git SSH 密钥配置与多账号管理实战指南
  • 安卓手机使用 Termux 部署 AstrBot 与 NapCat QQ 机器人
  • 从零实现 FPGA 256 点 FFT:Verilog 手写蝶形运算与资源优化实战
  • 昆仑万维开源 Skywork-R1V3:38B 多模态推理模型,高考数学 142 分刷新 SOTA
  • 十大 AI 副业赛道:普通人如何利用 AI 工具实现额外收入
  • Flutter 集成 google_generative_language_api 适配鸿蒙 HarmonyOS
  • 新版 IntelliJ IDEA 恢复右上角 Git 更新和提交按钮设置
  • Spring AI Alibaba 快速入门指南
  • 文心一言开源模型部署与多维性能测评实战
  • Linux 进程控制:深入理解进程程序替换与 exec 系列函数
  • Jetson Orin NX 部署 Ollama 与 Llama 3.2
  • Python 中 GraphQL 的实战指南:从 Schema 设计到性能优化
  • C#属性与C++成员变量:封装哲学与性能权衡的深度对比
  • 网络安全入门与职业发展学习路线指南
  • Redis 创始人谈大模型:通晓古今的队友与编程未来

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online