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

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

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

WenxuanMa发布于 2026/3/26更新于 2026/6/1224 浏览
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. 小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Python 数学可视化:显函数、隐函数及复杂曲线的交互式绘图
  • Windows 本地大模型工具链安装指南:Ollama + llama.cpp + LLaMA Factory
  • 自然语言处理(NLP)在客户服务中的应用与实战
  • Python 爬虫接单指南:技能要求、法律边界与实战建议
  • 老款 NUC 部署 Ubuntu 运行 OpenClaw 本地 AI 服务
  • 从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然
  • C++11 核心新特性详解:初始化、声明与移动语义
  • 利用 AI 智能体快速完成 C 语言与前端实训项目
  • IntelliJ IDEA 入门指南:从零创建并运行 Java 项目
  • 专科生自学 Python 转行爬虫开发实战经历与面试复盘
  • 本地搭建 Stable Diffusion AI 绘画工具完整指南
  • Gemma-3-12B-IT WebUI 安全加固:HTTPS、IP 白名单与限流配置
  • Vue 3 开发实战:10 个提升效率的核心技巧
  • OSCP 实战笔记:获取并破解 Net-NTLMv2 哈希
  • ComfyUI-Manager 管理 AI 绘画工作流节点与模型指南
  • Home Assistant 界面美化与个性化定制指南
  • OpenClaw 集成本地 Llama.cpp 后端
  • C++ string 类详解:构造、遍历与常用操作
  • 大模型 Token 概念与上下文窗口管理
  • 深入理解 IDE 中 AI 编程助手的 Session 机制与管理策略

相关免费在线工具

  • 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