HDFS(Hadoop Distributed File System)是Apache Hadoop项目的核心组件,专为大规模数据集存储设计。其读写流程相对复杂,这里简单概述:
HDFS 写流程:
-
客户端发起请求:
- 客户端调用
FileSystem.create()
接口创建新文件或追加到现有文件。
- 客户端调用
-
连接NameNode:
- 客户端通过RPC与NameNode通信,提交写操作请求,包括文件名、副本数等信息。
-
NameNode处理请求:
- NameNode检查文件是否已存在以及客户端是否有写权限。
- 如果文件不存在,则NameNode分配新的Block ID,并选择合适的DataNode列表作为第一块的初始副本位置(一般会根据策略选择多个DataNode)。
-
客户端与DataNode交互:
- 客户端收到NameNode返回的信息后,直接与所选的第一个DataNode建立连接,并开始传输数据,这个DataNode被称为“管道首节点”(Pipeline’s first node, 或称为Primary DataNode)。
- 数据在第一个DataNode上被接收并写入本地磁盘的同时,也会通过流水线复制方式传给后续的DataNode。
-
副本同步:
- 后续每个DataNode接收到数据后都会存储到本地,并将确认消息回传给前一个DataNode,直至整个数据块的所有副本都成功写入各DataNode。
-
完成确认与关闭:
- 当所有副本都写完并且确认无误后,最后一个DataNode会通知客户端写操作完成。
- 客户端随后向NameNode发送一个完成信号,NameNode更新元数据信息,记录下文件的新状态和块的位置信息。
HDFS 读流程:
-
客户端请求读取:
- 客户端调用
FileSystem.open()
接口打开并读取文件。
- 客户端调用
-
联系NameNode:
- 客户端通过RPC询问NameNode获取文件的元数据信息,包括文件的各个块所在DataNode列表及其偏移量。
-
NameNode响应元数据:
- NameNode根据文件名返回该文件所有块的元数据信息,包括块ID、DataNode地址列表等。
-
客户端与DataNode建立连接:
- 客户端根据NameNode提供的信息,按照块顺序依次与包含相应块的DataNode建立TCP连接。
-
读取数据:
- 客户端从离它最近或者网络状况最好的DataNode开始读取数据块,其他DataNode上的数据块作为备份源,用于数据完整性校验或故障转移时的数据读取。
-
合并数据:
- 客户端将从不同DataNode读取的数据进行拼接,最终获得完整的文件内容。
-
流式读取优化:
- 在实际应用中,HDFS通常支持高效的流式读取,即数据可以一边读取一边传递给下游的MapReduce任务或其他处理程序,无需等待全部数据加载完毕。