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

HDFS 分布式文件系统数据读写流程解析

HDFS 读写流程依赖 NameNode 与 DataNode 协同。读操作通过 DFSInputStream 获取块位置并就近读取,支持故障节点自动切换;写操作构建数据流管道,分包传输并经确认包回传验证。代码示例展示了基于 FileSystem 接口的标准 IO 实现方式,涉及配置默认文件系统地址及异常处理逻辑。

WenxuanMa发布于 2026/3/26更新于 2026/10/382 浏览
HDFS 分布式文件系统数据读写流程解析

理解 HDFS 的读写机制前,先理清几个核心类。FileSystem 是通用文件系统的抽象基类,所有使用 Hadoop 文件系统的代码都依赖它;在 HDFS 中,DistributedFileSystem 是其具体实现。open() 方法返回输入流 FSDataInputStream(HDFS 中为 DFSInputStream),create() 方法返回输出流 FSDataOutputStream(HDFS 中为 DFSOutputStream)。

一、读数据的过程

当客户端发起读取请求时,底层交互大致遵循以下流程。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Chapter3 {
    public static void main(String[] args) {
        try {
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            Path file = new Path("test");
            FSDataInputStream getIt = fs.open(file);
            BufferedReader    ( (getIt));
               d.readLine(); 
            System.out.println(content);
            d.close();
            fs.close();
        }  (Exception e) {
            e.printStackTrace();
        }
    }
}
d
=
new
BufferedReader
new
InputStreamReader
String
content
=
// 读取文件一行
catch

实际运行时,HDFS 内部执行过程如下:

  1. 打开文件:客户端调用 FileSystem.open(),DistributedFileSystem 创建 FSDataInputStream(即 DFSInputStream)。
  2. 获取块位置:DFSInputStream 构造函数中通过 RPC 远程调用名称节点,获取文件起始数据块的保存位置。名称节点返回该块所有数据节点的地址,并按距离客户端远近排序。
  3. 建立连接:客户端根据排序结果,选择最近的数据节点建立连接并读取数据。
  4. 读取与切换:数据从数据节点传输到客户端。当前数据块读完,关闭与该节点的连接。若还有后续块,通过 getBlockLocations() 查找下一个块的位置(若缓存命中则跳过此步),重复上述读取流程。
  5. 异常处理:读取过程中若通信出错,客户端会自动尝试连接包含此数据块的下一个数据节点,确保数据完整性。
  6. 关闭流:数据读取完毕后,调用 close() 关闭输入流。

图 1 HDFS 读数据的过程

二、写数据的过程

写入数据是一个构建管道并确认反馈的复杂过程。以下是无异常情况下,连续调用 create()、write() 和 close() 的内部流程。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Chapter3 {
    public static void main(String[] args) {
        try {
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            byte[] buff = "Hello world".getBytes();
            String filename = "test";
            FSDataOutputStream os = fs.create(new Path(filename));
            os.write(buff, 0, buff.length);
            System.out.println("Create:" + filename);
            os.close();
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

具体步骤如下:

  1. 创建文件:客户端调用 FileSystem.create(),DistributedFileSystem 创建 FSDataOutputStream(即 DFSOutputStream)。
  2. 命名空间检查:通过 RPC 远程调用名称节点,在命名空间中创建新文件。名称节点检查文件是否存在及客户端权限,通过后构造文件信息并返回输出流给客户端。
  3. 构建管道:客户端向输出流写入数据,数据被切分为分包放入队列。输出流向名称节点申请若干个数据节点形成数据流管道。
  4. 数据传输:分包打包成数据包发往管道第一个数据节点,依次向后传递。由于节点位于不同机器,需通过网络发送。
  5. 确认机制:为保证数据准确,接收数据的节点需向发送者发送'确认包'(ACK Packet)。确认包沿管道逆流而上,最终发回客户端。收到应答后,客户端从队列移除对应分包。
  6. 完成写入:调用 close() 关闭输出流。待队列中分包全部收到应答,通过 ClientProtocol.complete() 通知名称节点关闭文件,完成写入。

图 2 HDFS 写数据的过程

小结

HDFS 读写数据的核心在于 NameNode 与 DataNode 的协同。读操作通过 DFSInputStream 获取块位置并就近读取,支持故障节点自动切换;写操作通过 DFSOutputStream 构建数据流管道,分包传输并经确认包回传验证。代码示例展示了基于 FileSystem 接口的标准 IO 实现方式,实际开发中需注意配置 fs.defaultFS 及异常处理。

目录

  1. 一、读数据的过程
  2. 二、写数据的过程
  3. 小结

更多推荐文章

查看全部
  • npm 安装 OpenClaw 遇到 Git 错误及权限问题处理
  • 告别 Vibe Coding:BMAD 方法论与全能 AI 团队入门
  • 2026 年主流 AI 编程工具深度评测与选型指南
  • Python 分析 A 股基础入门
  • Claude Code 规则配置与最佳实践
  • LLaMA 3.1 模型部署与实战:构建智能聊天机器人
  • Linux 下 GCC 编译入门与基础用法
  • 常见时间复杂度与空间复杂度解析
  • 微信小程序跳转外部链接:WebView 与复制链接方案
  • C++ 类与对象进阶:初始化列表、静态成员与编译器优化
  • 用闲置Mac Mini部署OpenClaw实现金融AI分析
  • 多云混合云架构下的 WebSQL 统一访问平面设计
  • 基于腾讯云 CVM 部署 Clawdbot 并对接 Telegram 机器人
  • OpenClaw 飞书机器人搭建指南
  • Android 应用启动白屏问题解决方案
  • MySQL 表操作及查询
  • C++ 从零实现 TCP Socket 网络通信工具
  • C 语言指针与数组的深度关联及实战应用
  • Gemini 图片无损去水印:基于数学算法的纯前端方案
  • VSCode + AI Agent 实现 C/C++ 编译调试,告别 Visual Studio

相关免费在线工具

  • 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

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online