hdfs写入数据的流程

本文详细介绍了HDFS中数据写入的过程,包括客户端通过DistributedFileSystem调用create()创建文件,数据包的分解与存储,DataNode间的复制与确认,以及故障处理机制。还探讨了副本布局策略,旨在确保数据的可靠性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、客户端通过调用distributedFileSystem调用ceate()方法创建文件

2、distributedFileSystem对namenode创建一个PPC调用,去检查是否有这个文件,以及这个文件的权限,如果有这个文件,会返回IOException,如果没有就去创建这个文件。之后distributedFileSystem会返回给客户端DFSOutputStream对象,这个对象负责处理DataNode和namenode之间的通信。

3、客户端写入数据时,DFSOutputStream将这个数据分解成一个个的数据包,并写入内存数据队列中,称为“数据队列”

4、datastreamer来处理数据,是根据DataNode的大小来要求namenode分配DataNode适合的新内存来存储这些数据副本。首先将数据队列存储在第一DataNode中,之后一次存储在第二个DataNode中,然后再存储在第三个DataNode中。

5、等到DataNode存储完成之后,fileoutputstream等待DataNode去返回回执结果。等到DataNode将所有的结果都返回之后,该数据包才会从这个数据队列中删除。

6、客户端完成数据的写入后,调用close方法,该操作将所有的包写入DataNode管线。

7、distributedFileSystem等待确认信号,namenode已经知道文件由哪些块组成,所以他在返回前只需要等待数据块进行最小量的复制。

  1. 客户端通过在DistributedFileSystem中调用create()来创建文件。
  2. DistributedFileSystem 使用RPC去调用namenode,在文件系统的命名空间创一个新的文件,没有块与之相联系。namenode执行各种不同的检查以确保这个文件不会已经存在,并且在client有可以创建文件的适当的许可。如果检查通过,na
### HDFS 数据读写过程详解 #### 1. 写入数据HDFS 的详细流程 当客户端应用程序向 HDFS写入文件时,具体操作如下: - 客户端调用 `create()` 方法创建文件获得输流对象。此时会联系 NameNode 来确认目标文件是否存在以及获取分配 Block ID 和 DataNodes 列表的信息[^2]。 - 获取到允许后,客户端开始分片上传数据至指定的第一个 DataNode 节点,在传输过程中还会通知其他参与存储副本的 DataNodes 形成管道结构。 - 当第一个 DataNode 接收到部分数据包之后立即将其转发给下一个节点直到最后一个节点完成接收为止;与此同时每个接收到的数据块都会被临时保存于内存缓冲区等待持久化处理。 - 所有的 DataNode 都成功写入该片段后会给客户端返回 ACK 确认消息表示这一轮复制结束可以继续发送下一部分内容直至整个文件全部传完。 ```java // 创建文件向其中写入数据 FileSystem fs = FileSystem.get(conf); FSDataOutputStream out = fs.create(new Path("/user/test.txt")); out.writeBytes("This is test content."); out.close(); fs.close(); ``` #### 2. 从 HDFS 读取数据的过程 对于从 HDFS 文件系统中读取文件的操作而言,主要经历以下几个阶段: - 应用程序通过调用 `open()` 函数打开所需的目标文件得到输入流实例,请求 NameNode 提供有关此文件数据信息(比如 block 大小、block locations)以便规划最优读取策略。 - 根据所获知的位置列表按顺序连接各个拥有相应 fragment 的 DataNodes 进行实际的数据拉取工作。如果当前节点发生故障则尝试切换到备选位置重新建立链接关系来保障连续性。 - 在每次成功下载一段完整的 chunk 后即刻传递给应用层做进一步解析或展示而不必等到整份文档完全加载完毕再统一交付使用从而实现边读边用的效果提升效率。 ```java // 打开文件从中读取数据 FileSystem fs = FileSystem.get(conf); Path filePath = new Path("/user/test.txt"); FSDataInputStream in = fs.open(filePath); byte[] buffer = new byte[1024]; int bytesRead = in.read(buffer); // 尝试读取最多1KB的数据 String data = new String(buffer, 0, bytesRead); System.out.println(data); in.close(); fs.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值