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

HDFS 编程实践:Shell 命令、Web 界面与 Java API 详解

HDFS 编程实践涵盖 Shell 命令、Web 界面与 Java API 三大操作维度。Shell 命令提供基础文件管理能力,Web 页面支持可视化监控与日志查看。Java API 作为核心开发接口,通过 FileSystem 类实现文件读写与元数据操作。实战案例演示了如何在 Eclipse 中配置 Hadoop 依赖,编写文件合并逻辑,并完成本地调试与 JAR 包部署。掌握这些技能有助于高效构建基于 Hadoop 的大数据存储解决方案。

魔法巫师发布于 2026/3/29更新于 2026/9/861 浏览
HDFS 编程实践:Shell 命令、Web 界面与 Java API 详解

HDFS 提供了丰富的操作接口,包括 Linux Shell 命令、Web 管理页面以及 Java API。本文将基于 Hadoop 3.1.3 版本,梳理常用命令用法,展示 Web 监控面板,并通过实战案例讲解 Java API 的文件操作与部署流程。

一、HDFS 常用 Shell 命令

hadoop fs 是操作 HDFS 最通用的入口,适用于本地及分布式文件系统。相比之下,hadoop dfs 和 hdfs dfs 仅针对 HDFS。基本语法如下:

hadoop fs [genericOptions][commandOptions]

常用指令包括查看目录结构、上传下载、修改权限等。例如使用 -ls 列出文件详情,-cat 查看内容,-mkdir 创建目录。对于批量操作,-copyFromLocal 和 -put 用于上传,-get 和 -copyToLocal 用于下载。权限管理可使用 -chmod 和 -chown,递归操作需加上 -R 参数。此外,-rm -r 可删除目录及其内容,-setrep 调整副本系数。若需检查文件状态,-test 配合 -e(存在)、-z(空文件)、-d(目录)选项非常实用。

二、HDFS Web 管理界面

配置完成后,可通过浏览器访问 NameNode 的 Web 端口(默认 9870)。地址格式通常为 http://[NameNodeIP]:9870。伪分布式环境下可直接访问 http://localhost:9870。

该界面直观展示了节点分布、存储日志及文件浏览功能。虽然大部分操作可通过 Shell 完成,但 Web 端更适合快速排查问题。例如,点击 "Browse the filesystem" 即可查看根目录,这与执行 hadoop fs -ls / 效果一致。

三、HDFS Java API 实战

Hadoop 核心基于 Java,API 交互是开发集成方案的基础。主要涉及 FileSystem、FileStatus、FSDataInputStream 等类。下面通过一个合并文件的实例,演示从环境搭建到部署的全过程。

1. 项目初始化

在 Eclipse 中新建 Java 工程,命名为 HDFSExample。选择 JDK 1.8 及以上版本,保持默认工作空间即可。

2. 添加依赖库

HDFS 交互需要引入 Hadoop 的 JAR 包。定位到 Hadoop 安装目录下的 share/hadoop 文件夹,将以下目录中的 JAR 包添加到项目构建路径:

  • common 目录下的所有 JAR 包(排除 jdiff、lib 等子目录)
  • common/lib 目录下的所有 JAR 包
  • hdfs 目录下的所有 JAR 包
  • hdfs/lib 目录下的所有 JAR 包

全选时注意避开非编译资源目录。添加完毕后,工程即可识别相关类。

3. 编写业务逻辑

新建类 MergeFile,实现文件过滤与合并功能。核心思路是利用 FileSystem 获取对象,通过 listStatus 遍历文件,结合自定义 PathFilter 排除特定后缀(如 .abc),最后将剩余文件内容写入目标文件。

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 集群已启动,且 /user/hadoop 目录下存在测试文件(如 file1.txt 至 file5.txt)。在 Eclipse 中选择 Run As -> Java Application 执行主方法。控制台会输出处理日志,同时生成 merge.txt。

验证结果可在终端执行 hdfs dfs -cat /user/hadoop/merge.txt,确认内容是否按预期合并。

5. 打包部署

生产环境中通常将应用打包为 JAR 提交给 YARN 或本地运行。在 Eclipse 中选择 Export -> Runnable JAR file。

  • Launch configuration 选择 MergeFile 类。
  • Export destination 指定输出路径,如 /usr/local/hadoop/myapp/HDFSExample.jar。
  • Library handling 选择 Extract required libraries into generated JAR,以便包含所有依赖。

导出成功后,使用 hadoop jar ./myapp/HDFSExample.jar 命令即可在集群上运行。

总结

本文涵盖了 HDFS 操作的三种主要方式:Shell 命令适合运维管理,Web 界面便于可视化监控,而 Java API 则是开发集成应用的核心。通过上述实例,我们掌握了从依赖配置、代码编写到打包部署的完整链路。在实际开发中,注意配置文件路径的正确性及异常处理,能有效提升程序的稳定性。

目录

  1. 一、HDFS 常用 Shell 命令
  2. 二、HDFS Web 管理界面
  3. 三、HDFS Java API 实战
  4. 1. 项目初始化
  5. 2. 添加依赖库
  6. 3. 编写业务逻辑
  7. 4. 编译与运行
  8. 5. 打包部署
  9. 总结

更多推荐文章

查看全部
  • RabbitMQ 入门:架构解析、环境搭建与 Java 实战
  • Rust 复合类型高级用法——结构体、枚举与模式匹配进阶
  • Java 入门教程
  • SenseVoice-Small ONNX 量化版快速部署及 Gradio 使用指南
  • 2026 年 3 月全球大模型全景:国产登顶、百万上下文与智能体爆发
  • 扣子(Coze)Skills+OpenClaw 实战:零基础构建 AI 智能体
  • 深入解析 C++ 轻量级 WebServer 实现
  • 让 Llama-Factory 真正跑在 Flash Attention 上:环境、配置与性能一探
  • Flutter 组件 sse_stream 在鸿蒙系统的适配与高并发背压处理方案
  • 自然语言处理在客户服务领域的应用与实战
  • Google AI Studio 使用指南:界面与参数配置详解
  • LeetCode 124 二叉树中的最大路径和解题详解
  • Python 网络爬虫基础与通用模板实现
  • 执行式 AI 核心:API 调用与网络请求基础
  • Unreal Engine 4.27 + AirSim 无人机仿真环境搭建:澳大利亚农村场景配置
  • FPGA 入门:基于 Verilog 的 2 选 1 数据选择器设计
  • 2026 年 3 月 GESP C++ 一级真题解析:数字替换
  • C++ 多态机制详解
  • OpenClaw 与核心 AI 组件关系详解
  • 前端交互体验中的消息提示组件设计

相关免费在线工具

  • 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