跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

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

HDFS 读写涉及客户端与 NameNode、DataNode 交互。读时通过 DFSInputStream 获取块位置,就近读取;写时通过 DFSOutputStream 构建管道,分包传输并接收 ACK 确认。核心类为 FileSystem、DistributedFileSystem 及对应的输入输出流。

LinuxPan发布于 2026/3/24更新于 2026/5/46 浏览
HDFS 分布式文件系统数据读写流程详解

在深入 HDFS 数据读写之前,先理清几个核心类。FileSystem 是通用文件系统的抽象基类,所有操作 Hadoop 文件系统的代码都依赖它。在 HDFS 中,DistributedFileSystem 是其具体实现。FileSystem.open() 返回 FSDataInputStream,对应 HDFS 的 DFSInputStream;create() 返回 FSDataOutputStream,对应 DFSOutputStream。

一、读数据的过程

客户端调用 open() 打开文件时,DistributedFileSystem 会创建 DFSInputStream。构造函数中,输入流通过 ClientProtocol.getBlockLocations() 远程调用名称节点,获取文件起始数据块的位置信息。名称节点返回保存该块的所有数据节点地址,并按距离客户端远近排序。随后,DistributedFileSystem 实例化 FSDataInputStream 返回给客户端。

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
=
// 读取文件一行
// 关闭文件
// 关闭 hdfs
catch

拿到输入流后,客户端调用 read() 开始读取。流根据排序结果选择最近的数据节点建立连接并拉取数据。当一块数据读完,FSDataInputStream 关闭与该节点的连接,并通过 getBlockLocations() 查找下一个块(若缓存命中则跳过)。找到最佳节点后继续读取。读取结束时调用 close() 关闭流。过程中若通信出错,会自动尝试连接同一块的下一个数据节点。

二、写数据的过程

客户端通过 create() 创建文件,DistributedFileSystem 创建 DFSOutputStream。接着通过 RPC 远程调用名称节点,在命名空间中检查并新建文件。名称节点验证权限和存在性后,构造新文件信息,返回输出流供客户端写入。

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();
        }
    }
}

写入时,数据被切分为分包放入内部队列。输出流向名称节点申请数据节点形成管道。分包打包成数据包发往管道第一个节点,依次向后传递。由于节点在不同机器上,需网络传输。为确保一致性,每个节点收到数据后发送确认包(ACK Packet),沿管道逆流回客户端。客户端收到应答后移除队列中的分包。重复此过程直到写完。最后调用 close(),通知名称节点完成文件写入。

图 1 HDFS 读数据的过程

图 2 HDFS 写数据的过程

小结

HDFS 读写核心在于客户端与 NameNode、DataNode 的协作。读数据通过 DFSInputStream 获取块位置,就近读取;写数据通过 DFSOutputStream 构建管道,分包传输并接收 ACK 确认。关键类包括 FileSystem、DistributedFileSystem 及对应的输入输出流。

目录

  1. 一、读数据的过程
  2. 二、写数据的过程
  3. 小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 构建 AI 鸿蒙应用:架构逻辑的转变
  • Prompt 驱动的结构化抽取:从文本中提取表格
  • 招商银行信用卡 AI 客服系统:从 0 到 1 实战
  • Linux 远程服务器直接下载 HuggingFace 模型与数据集
  • 二叉树深度计算与先序序列重构算法解析
  • Python 数学可视化:显函数、隐函数及复杂曲线交互绘图
  • 自然语言处理在金融领域的应用与实战
  • 大疆无人机如何导出日志并解析
  • Consistency Model 重塑图像生成范式:100 倍提速技术解析
  • ResponsibleRobotBench:多模态大模型驱动的负责任机器人操作基准
  • AI 绘图硬件指南:如何为 Stable Diffusion 选配与优化电脑配置
  • VS Code Python 扩展提示无环境安装 uv 后的终端输出解读与配置
  • SpringAI 结合 Ollama 本地部署 Deepseek 实现对话机器人
  • SpringAI 基于 Ollama 本地部署 Deepseek 模型实现对话机器人
  • 前端大数据渲染性能优化:Web Worker 分片与渐进式渲染
  • Python 工程师必学工具:Jupyter Notebook 简介与核心优势
  • 无人机视觉任务主流数据集汇总:检测与分割资源整理
  • Python 自动化测试入门:编写与运行测试用例
  • FLUX.1-dev FP8 模型部署与低显存优化指南
  • NeRF技术在AR视场角畸变校正中的验证与测试方法

相关免费在线工具

  • 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