hdfs读写数据流程
时间: 2025-05-28 22:05:54 浏览: 30
### 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();
```
阅读全文
相关推荐


















