首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HDFS 读写流程

HDFS 读写流程

原创
作者头像
代码小李
发布2024-12-29 19:57:47
发布2024-12-29 19:57:47
5810
举报

HDFS(Hadoop Distributed File System)是 Hadoop 生态系统中的分布式文件系统,用于存储大规模的数据。HDFS 的读写流程涉及多个组件,包括 NameNode、DataNode 和客户端。以下是详细的读写流程:

写流程

  1. 客户端发起写请求
    • 客户端通过 FileSystem API 发起写请求,请求创建一个新文件。
  2. NameNode 分配块
    • NameNode 收到请求后,会为文件分配一个或多个数据块(block),并返回这些块的标识符和目标 DataNode 列表。
  3. 客户端写数据
    • 客户端开始将数据写入第一个 DataNode。
    • 第一个 DataNode 接收到数据后,将其写入本地磁盘,并将数据传递给第二个 DataNode。
    • 第二个 DataNode 重复上述过程,将数据传递给第三个 DataNode,依此类推,直到所有副本都写入完成。
  4. 确认写操作
    • 每个 DataNode 在成功写入数据后,会向其前一个 DataNode 发送确认消息。
    • 最终,第一个 DataNode 收到所有确认消息后,会向客户端发送确认消息,表示数据已成功写入。
  5. NameNode 更新元数据
    • 客户端收到确认消息后,会通知 NameNode 数据已成功写入。
    • NameNode 更新其元数据信息,记录文件的块位置和状态。

读流程

  1. 客户端发起读请求
    • 客户端通过 FileSystem API 发起读请求,请求读取文件。
  2. NameNode 返回块信息
    • NameNode 收到请求后,会返回文件的块信息,包括每个块的位置和对应的 DataNode 列表。
  3. 客户端读数据
    • 客户端根据 NameNode 返回的块信息,直接与 DataNode 通信,读取数据。
    • 客户端可以选择从最近的 DataNode 读取数据,以提高读取效率。
  4. 数据传输
    • DataNode 将数据分块传输给客户端。
    • 客户端接收到数据后,进行合并,形成完整的文件内容。
  5. 确认读操作
    • 客户端在读取完所有数据后,会向 DataNode 发送确认消息。
    • DataNode 收到确认消息后,表示数据已成功读取。
代码语言:java
复制
示例代码
以下是一个简单的 Java 代码示例,展示了如何使用 Hadoop API 进行文件的读写操作:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;

public class HdfsExample {
    public static void main(String[] args) throws Exception {
        // 配置 Hadoop
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");

        // 创建 FileSystem 对象
        FileSystem fs = FileSystem.get(conf);

        // 写文件
        Path writePath = new Path("/user/test/write.txt");
        FSDataOutputStream outputStream = fs.create(writePath);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
        writer.write("Hello, HDFS!");
        writer.close();

        // 读文件
        Path readPath = new Path("/user/test/write.txt");
        FSDataInputStream inputStream = fs.open(readPath);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();

        // 关闭 FileSystem
        fs.close();
    }
}

代码解释

  1. 配置 Hadoop
    • Configuration conf = new Configuration();:创建 Hadoop 配置对象。
    • conf.set("fs.defaultFS", "hdfs://localhost:9000");:设置 HDFS 的地址。
  2. 创建 FileSystem 对象
    • FileSystem fs = FileSystem.get(conf);:获取 HDFS 文件系统对象。
  3. 写文件
    • Path writePath = new Path("/user/test/write.txt");:指定要写入的文件路径。
    • FSDataOutputStream outputStream = fs.create(writePath);:创建输出流。
    • BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));:创建缓冲写入器。
    • writer.write("Hello, HDFS!");:写入数据。
    • writer.close();:关闭写入器。
  4. 读文件
    • Path readPath = new Path("/user/test/write.txt");:指定要读取的文件路径。
    • FSDataInputStream inputStream = fs.open(readPath);:打开输入流。
    • BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));:创建缓冲读取器。
    • while ((line = reader.readLine()) != null) { System.out.println(line); }:逐行读取并输出数据。
    • reader.close();:关闭读取器。
  5. 关闭 FileSystem
    • fs.close();:关闭文件系统对象。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 写流程
  • 读流程
  • 代码解释
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档