HDFS 读写数据流程
- 组件模块说明
- HDFS的写数据流程
- HDFS的读数据流程
- 最近距离计算(就近原则)
组件模块说明
DistributedFileSystem:代码位于hadoop-hdfs-projecthadoop-hdfs-clientsrcmainjavaorgapachehadoophdfsDistributedFileSystem.java(hadoop3.2.1)
FSDataOutputStream:代码位于hadoop-common-projecthadoop-commonsrcmainjavaorgapachehadoopfsFSDataOutputStream.java
NameNode:存储文件的元数据。作用:管理HDFS的名称空间;配置副本策略;管理数据块(Block)映射信息;处理客户端读写请求
DataNode:在本地文件系统存储文件块数据,以及块数据的校验和。作用:存储实际的数据块;执行数据块的读/写操作。
Block:HDFS中的文件在物理上是分块存储 (Block) , 块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M
HDFS的写数据流程
- 客户端通过 DistributedFileSystem 模块向 NameNode 请求上传文件, NameNode 检查目标文件是否已存在,父目录是否存在。
- NameNode 返回是否可以上传。
- 客户端请求第一个 Block(包含0-128M的数据) ,询问NameNode可以上传到哪几个 DataNode 服务器上。
- NameNode 响应客户端请求,返回 3 个 DataNode 节点, 分别为 dn1、 dn2、 dn3。表现这些节点是可以存储。
- 客户端通过 FSDataOutputStream 模块请求 dn1 上传数据, dn1 收到请求会继续调用dn2,然后 dn2 调用 dn3,将这个通信管道建立完成。
- dn1、 dn2、 dn3 逐级应答客户端。
- 客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 Packet 为单位, dn1 收到一个 Packet 就会传给 dn2, dn2 传给 dn3; dn1 每传一个 packet会放入一个应答队列等待应答。这里要注意,是向其中一个节点写数据,然后由此节点把数据转发到其他节点。
- 当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复执行 3-7 步)。
HDFS的读数据流程
- 客户端通过 DistributedFileSystem 向 NameNode 请求下载文件, NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。
- 挑选一台 DataNode(就近原则)服务器,请求读取数据。
- DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。
- 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。
最近距离计算(就近原则)
节点距离:两个节点到达最近的共同祖先的距离总和。
例如,假设有数据中心 d1 机架 r1 中的节点 n1。 该节点可以表示为/d1/r1/n1。 利用这种标记,这里给出四种距离描述。