网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

HDFS中文件读取与写入的过程解析

更新时间:2026年03月27日   作者:spoto   标签(Tag):

大数据本质上就是一系列庞大、复杂的数据集,这些数据集很难通过现有的数据管理工具或传统的数据处理应用程序来存储和处理。Hadoop则是一种开源框架,用于以并行和分布式的方式来处理、存储和分析这些大数据集。它是一种能够解决大数据带来的挑战的解决方案。
Hadoop包含两个部分: 
 

  • HDFS(Hadoop分布式文件系统)
  • YARN(Yet Another Resource Negotiator)


在本文中,我们重点介绍了Hadoop中的一个核心组件——HDFS,以及HDFS中文件读取和文件写入的过程。HDFS是一种用于存储大型文件的文件系统,这些文件的大小可达数百兆字节、吉字节或太字节级别。HDFS运行在由普通硬件构成的集群上,这些硬件可以从各种供应商处获得。简单来说,Hadoop的存储单元就是HDFS。
HDFS的一些特点包括: 
 

  • 容错性
  • 可扩展性
  • 分布式存储
  • 可靠性
  • 高可用性
  • 具有成本效益
  • 高吞吐量


Hadoop的构建基础: 
 

  1. 名称节点
  2. 数据节点
  3. 辅助名称节点(SNN)
  4. 工作跟踪工具
  5. 任务跟踪器

HDFS中文件读取过程的详细解析


让我们通过图表来了解一下数据在客户端与HDFS、名称节点以及数据节点之间的流动方式。请看这个图表:
 


步骤1:客户通过调用文件系统对象的 open() 方法来打开想要读取的文件。在 HDFS 中,文件系统对象实际上是一个分布式文件系统的实例。
步骤2:分布式文件系统(DFS)通过调用名称节点,并利用远程过程调用技术,来确定文件中前几个数据块的位置。对于每个数据块,名称节点会返回包含该数据块副本的数据节点的地址。之后,DFS会向客户端返回一个FSDataInputStream对象,以便客户端可以从中读取数据。而FSDataInputStream则封装了DFSInputStream,后者负责处理与数据节点和名称节点相关的I/O操作。
步骤3:然后,客户端调用了流对象的read()方法。DFSInputStream会存储文件中前几个数据块的信息节点地址,接着它会连接到文件中第一个数据节点,也就是距离文件开头最近的数据节点。
步骤4:数据从数据节点传输回客户端,客户端会不断调用 read() 函数来读取这些数据。
步骤5:当到达块的末尾时,DFSInputStream会关闭与数据节点的连接,然后找到下一个块的最佳数据节点。这一过程对客户端来说是完全透明的,因为从客户端的视角来看,他们只是持续地读取数据而已。数据块被逐个读取,而DFSInputStream会继续与数据节点建立新的连接。此外,DFSInputStream还会根据需要调用名称节点,以获取下一批数据块的数据节点位置信息。
步骤6:当客户端读完文件后,会调用一个函数来关闭 FSDataInputStream。
 

HDFS中文件写入过程的详细机制


接下来,我们将了解文件是如何被写入HDFS中的。为了更好地理解这个概念,请参考图1.2。

注意:HDFS遵循“一次写入、多次读取”的模式。在HDFS中,我们无法编辑已经存储的文件内容,但可以通过重新打开这些文件来添加数据。
 


步骤1:客户通过调用 DistributedFileSystem(DFS) 的 create() 方法来创建文件。
步骤2:DFS向名称节点发送了一个RPC调用,目的是在文件系统的命名空间中创建一个新文件。该新文件没有相关联的块数据。 该节点会执行各种检查,以确保该文件不存在,同时确保客户端拥有创建该文件的必要权限。 如果这些检查都通过的话,那么名称节点就会准备一份关于新文件的记录;否则,文件就无法创建,此时客户端将会收到一个错误提示。 IOException。 DFS会返回一个FSDataOutputStream,客户端可以使用该对象来开始将数据写入其中。
步骤3:因为数据是由客户端生成的,所以 DFSOutputStream 会将这些数据拆分成多个数据包,然后将这些数据包写入到一个名为“信息队列”的队列中。 数据队列会被DataStreamer所占用。DataStreamer会负责向名称节点请求分配新的数据块,从而选择合适的节点来存储副本数据。 这些数据节点的列表构成了一个流水线结构。在这里,我们假设复制级别为3,因此这个流水线中有三个节点。 DataStreamer将这些数据包传输到管道中的主数据节点。主数据节点会存储每个数据包,然后将其转发到管道中的第二个数据节点。
步骤4:同样,第二个数据节点负责存储该数据包,并将其传递给管道中的第三个(也是最后一个)数据节点。
步骤5:DFSOutputStream维护着一个内部队列,其中存储着那些等待被数据节点确认的数据包。这个队列被称为“确认队列”。
步骤6:此操作会将所有剩余的数据包发送到数据节点管道中,然后等待确认后再连接到名称节点,以判断文件是否已完成。
HDFS遵循“一次写入、多次读取”的模式。因此,我们无法编辑已经存储在HDFS中的文件,但可以通过重新打开这些文件来再次访问它们。这种设计使得HDFS能够支持大量并发客户端的访问,因为数据流量被分散到了集群中的所有数据节点上。这样一来,系统的可用性、可扩展性和吞吐量都得到了提升。
 

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料