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

分布式文件系统 HDFS 编程实践与常用命令详解

HDFS 编程实践涵盖 Shell 命令、Web 界面及 Java API 操作。通过 hadoop fs 可管理文件,Web 页面监控集群状态。Java API 提供 FileSystem 等核心类,支持上传下载及自定义逻辑如文件合并。示例演示了从项目配置、依赖引入到打包部署的完整流程,帮助开发者高效集成 Hadoop 文件系统功能。

ApiHolic发布于 2026/3/27更新于 2026/7/2736 浏览
分布式文件系统 HDFS 编程实践与常用命令详解

HDFS 编程实践主要涉及三种方式:Shell 命令、Web 界面以及 Java API。通过 Shell 可以快速管理文件,Web 页面适合监控集群状态,而 Java API 则提供了更灵活的开发能力。本文以 Hadoop 3.x 版本为例,介绍这些操作的核心用法及实战流程。

HDFS 常用 Shell 命令

hadoop fs 是 HDFS 最常用的命令工具,适用于本地和分布式文件系统。相比 hadoop dfs 或 hdfs dfs(仅支持 HDFS),hadoop fs 的通用性更强。基本语法如下:

hadoop fs [genericOptions][commandOptions]

以下是一些高频使用的命令,实际开发中建议熟记:

  • hadoop fs -ls <path>:查看指定路径的文件详情。
  • hadoop fs -ls -R <path>:递归列出目录内容。
  • hadoop fs -cat <path>:输出文件内容到标准输出。
  • hadoop fs -mkdir [-p] <paths>:创建文件夹,-p 支持递归创建。
  • hadoop fs -copyFromLocal <localsrc> <dst>:上传本地文件到 HDFS。
  • hadoop fs -put <localsrc> <dst>:功能同上传,也支持从 stdin 读取。
  • hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>:下载 HDFS 文件到本地。
  • hadoop fs -rm -r <path>:递归删除文件或目录。
  • hadoop fs -setrep [-R] <path>:修改文件副本系数。
  • hadoop fs -test -ezd <path>:测试文件属性(存在、大小、是否为目录)。

HDFS Web 管理界面

配置好集群后,可以通过浏览器访问 NameNode 的 Web UI(默认端口 9870)。例如在伪分布式模式下,访问 http://localhost:9870 即可查看文件系统信息。

查看文件系统信息

该界面能直观展示节点分布、存储日志及文件浏览情况。虽然大部分功能可通过 Shell 命令实现,但 Web 界面在排查问题时更为便捷。例如,通过'Browse the filesystem'查看目录结构,等价于执行 hadoop fs -ls /。

HDFS Java API 实战

Hadoop 核心基于 Java 构建,Java API 是进行复杂业务逻辑开发的首选。下面介绍核心类及一个完整的文件合并示例。

核心 API 类
  • FileSystem:通用文件系统抽象基类,所有 HDFS 操作的基础。
  • FileStatus:获取文件和目录的元数据(大小、权限、所有者等)。
  • FSDataInputStream / FSDataOutputStream:用于读写 HDFS 文件。
  • Configuration:加载配置文件(如 core-site.xml)中的参数。
  • Path:表示 HDFS 中的文件路径。
  • PathFilter:自定义过滤器,用于筛选特定路径的文件。
实例:合并 HDFS 文件

假设我们需要将 HDFS 目录下符合特定规则的文件合并为一个新文件。以下是完整实现步骤。

1. 项目初始化

在 Eclipse 中创建 Java 工程,命名为 HDFSExample。确保 JDK 版本与 Hadoop 兼容(推荐 JDK 1.8+)。

2. 引入依赖

Hadoop 的 JAR 包通常位于安装目录下的 share/hadoop 子目录中。需要手动添加以下依赖到项目 Build Path:

  • hadoop-common 相关 JAR 包
  • hadoop-hdfs 相关 JAR 包
  • 对应的 lib 子目录下的依赖

具体路径参考你的实际安装位置,例如 /usr/local/hadoop/share/hadoop/common。

3. 编写代码

创建一个名为 MergeFile 的主类。这里我们自定义了一个 MyPathFilter 来过滤掉不需要的后缀文件(如 .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 集群已启动,且目标目录下存在测试文件。在 Eclipse 中选择 Run As -> Java Application 即可执行。

控制台会输出处理日志,若成功,可在终端验证结果:

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

5. 打包部署

生产环境中,通常需要将应用打包成 JAR 提交到集群运行。

  1. 在 Eclipse 中选择 Export -> Runnable JAR file。
  2. 设置主类为 MergeFile-HDFSExample。
  3. 勾选 Extract required libraries into generated JAR 以包含依赖。
  4. 导出为 HDFSExample.jar。

使用 hadoop jar 命令提交任务:

./bin/hadoop jar ./myapp/HDFSExample.jar

总结

HDFS 的编程接口丰富且实用。对于简单的文件管理,Shell 命令效率最高;对于需要监控的场景,Web 界面一目了然;而对于复杂的业务逻辑,Java API 提供了足够的灵活性。掌握 FileSystem 类的使用、理解流式读写机制,并结合 PathFilter 等工具,就能高效地构建基于 Hadoop 的数据处理应用。

目录

  1. HDFS 常用 Shell 命令
  2. HDFS Web 管理界面
  3. HDFS Java API 实战
  4. 核心 API 类
  5. 实例:合并 HDFS 文件
  6. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型微调经验总结:SFT 技术要点与局限性分析
  • 工业级存储芯片 CSNP32GCR01-AOW 在无人机飞控系统中的应用实践
  • Python 非官方 Google 搜索 API 使用指南
  • 算法入门:双指针算法(一)
  • MyLesson 小程序前台前端开发(一)
  • AI 大模型 Token 收费机制与技术原理详解
  • C++ 哈希表原理与线性探测、哈希桶模拟实现
  • Llama-3.2V-11B-cot 读胸片实测:推理过程、准确率与落地取舍
  • 普通程序员实现财富自由的职业路径分析
  • 2026年最新全球AI大模型深度研究报告
  • SpringBoot 项目集成 WebSSH 连接服务器实现指南
  • Code Llama 代码生成模型快速上手与实用技巧
  • Windows 资源管理器标签化增强:QTTabBar 实战指南
  • Neo4j Desktop 2.0 安装教程:自定义安装路径
  • 阶跃 AI 桌面伙伴实操:MCP 协议配置与 16 款工具集成自动化
  • Claude Code 完全精通指南:实现产品与研发协同提效
  • JavaScript 流程控制与数组实战
  • Gemini 图片无损去水印:基于反向 Alpha 混合的前端方案
  • GitHub Copilot 学生认证实战指南:流程与避坑要点
  • 自然语言处理在客户服务领域的应用与实战

相关免费在线工具

  • 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