HDFS读写数据流程

本文详细解析了HDFS的数据写入与读取流程。写入流程包括客户端发起请求、NameNode分配DataNode、建立管道并传输Block。读取流程则是客户端向NameNode请求元数据,随后直接从DataNode读取数据,以Packet为单位进行校验。

HDFS写数据流程:

写

1.客户端向nd发送文件上传请求 nd检查目录文件是否存在 检查父目录是否存在

2.nd向客户端返回是否上传响应

3.客户端向nd请求 上传到那个节点(dn)

4.nd响应 dn1 dn2 dn3可以上传

5.客户端向dn1发送请求 dn1–>dn2–>dn3 建立文件传输管道

6.dn1 dn2 dn3 向客户端逐级应答

7.客户端将block文件以packet形式传输给dn1 dn1–>dn2–>dn3

dn1每传一个packet会放入一个应答队列等待应答

8.当一个block文件传输完成以后 客户端再次向nd发送请求 传输block2

HDFS读数据流程:

读

1.客户端向nd发送下载请求 nd检查元数据 查找文件所在dn

2.挑选最近的dn服务器 发送读取请求

3.dn向客户端传输数据 以packet为单位做校验

4.客户端以packet为单位接收 先在本地缓存 然后写入目标文件

### 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、付费专栏及课程。

余额充值