【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!

简介: 【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。

Hadoop 分布式文件系统(HDFS)是 Hadoop 生态系统中的核心组件之一,旨在提供高吞吐量的数据访问能力,非常适合大规模数据集的分布式存储。本文将详细探讨 HDFS 中的数据读写流程,并通过示例代码展示具体的操作步骤。

HDFS 的设计目标是支持海量数据的存储和处理,因此其架构中包含 NameNode 和 DataNode。NameNode 负责元数据管理,包括文件系统的命名空间管理和客户端请求的处理。DataNode 则负责数据块的存储和检索,每个数据块默认大小为 128MB(在 Hadoop 2.x 版本中)。

写入流程

当客户端向 HDFS 写入数据时,流程如下:

  1. 客户端发起写入请求给 NameNode,请求创建一个新的文件。
  2. NameNode 根据文件系统的命名空间信息检查文件是否已存在,若不存在,则返回可以写入的响应,并指示客户端将数据发送给哪些 DataNode。
  3. 客户端接收到响应后,开始向第一个 DataNode 发送数据,并启动一个数据流管道。数据按照预设的副本策略被复制到其他 DataNode 上。
  4. 数据写入过程中,每个 DataNode 在接收到数据后会向发送方确认收到数据。最后一个 DataNode 向客户端发送确认消息。
  5. 当所有副本都被成功写入后,客户端通知 NameNode 文件写入完成。

示例代码

以下是一个简单的 Java 示例,展示如何使用 Hadoop API 向 HDFS 写入数据:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.nio.ByteBuffer;

public class HDFSWriter {
   
    public static void main(String[] args) throws IOException {
   
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);

        Path filePath = new Path("/hdfs/input.txt");

        // 创建文件
        fs.create(filePath).close();

        // 写入数据
        try (FileSystem fileSystem = FileSystem.get(conf)) {
   
            fileSystem.append(filePath).write(ByteBuffer.wrap("Hello, HDFS!".getBytes()));
        }

        // 关闭文件系统
        fs.close();
    }
}

读取流程

当客户端从 HDFS 读取数据时,流程如下:

  1. 客户端向 NameNode 请求读取文件。
  2. NameNode 返回文件的元数据信息,包括文件块的位置信息。
  3. 客户端直接与 DataNode 通信,获取数据块。
  4. 如果客户端与 DataNode 之间的网络连接速度较慢,NameNode 可能会选择离客户端最近的 DataNode 提供数据服务。
  5. 客户端从 DataNode 读取数据块,并进行拼接以恢复原始文件。

示例代码

以下是一个简单的 Java 示例,展示如何使用 Hadoop API 从 HDFS 读取数据:

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

public class HDFSReader {
   
    public static void main(String[] args) throws IOException {
   
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);

        Path filePath = new Path("/hdfs/input.txt");

        // 读取文件
        try (FileSystem fileSystem = FileSystem.get(conf);
             BufferedReader reader = new BufferedReader(new InputStreamReader(fileSystem.open(filePath)))) {
   
            String line;
            while ((line = reader.readLine()) != null) {
   
                System.out.println(line);
            }
        }

        // 关闭文件系统
        fs.close();
    }
}

总结

通过上述示例,可以看出 HDFS 的读写操作是高度分布式的,它通过 NameNode 和 DataNode 的协同工作来实现数据的可靠存储和快速访问。了解这些底层机制对于优化 Hadoop 应用程序的性能至关重要。随着大数据技术的发展,HDFS 仍然是处理大规模数据集的重要工具之一。

相关文章
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
167 6
|
2月前
|
SQL 分布式计算 监控
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
63 3
|
2月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
66 4
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
47 4
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
48 2
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
90 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
41 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
50 0
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
4月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
116 2
基于Redis的高可用分布式锁——RedLock