hdfs 文件上传过程
-
向 namenode 请求上传文件
-
响应可以上传文件
-
向 namenode 请求, 上传到哪几台 dataNode
-
Namenode 返回,指定文件上传的 datanode 节点数据
-
通过获取到的 namenode 节点信息, 客户端向一个节点发送通信, 开通数据通信管道
-
确认建立通道
-
创建 FSDataOutputStream
-
客户端开始向 一个dataNode传递数据, 第一个 dataNode 将数据持久化到磁盘, 并通过内存, 向下一个 dataNode 传递副本, 直到传递最后一个指定 datanode
-
确认数据传输完成, 向前一个 namenode 或客户端返回确认
-
客户端将数据存储到那么datanode 节点的元数据信息传递给 namenode 存储
网络拓扑
namenode 向客户端返回元数据下载位置, 是需要计算网络节点距离的, 根据请求客户端的位置计算最短距离:
- 计算同节点距离 例如: 集群a-机架 1-node1, distance = 0
- 计算同机架距离 例如: 集群a-机架 1-node1—> 集群a-机架 1-node2, 机架相同, 各节点向上查找 1 distance=2
- 计算同集群距离 例如: 集群a-机架 1-node1—>集群a-机架 2-node2, 集群相同, 各节点向上查找 1 到机架, 再向上查找 1 到集群 distance = 4
- 计算不同集群距离 例如: 集群a-机架 1-node1—>集群b-机架 2-node2, 各节点向上查找 1 到机架, 再向上查找 1到集群, 再向上查找 1 distance=6
机架感知(副本存储节点选择)
选择存储副本的节点, 例如有三个副本
- 副本一:根据 client 所处的客户端, 找到相同节点, 存储一份副本
- 副本二:根据副本一所处节点, 找到相同机架任意节点, 存储一份副本
- 副本三:根据副本一所处节点, 找到不同机架任意节点, 存储一份副本
hdfs 文件读数据过程
- 客户端向 namenode 请求下载数据
- namenode 返回目标文件的元数据
- 客户端创建 FSDataInputStream 向获取到的 dataNode 节点发起blk1数据请求
- dataNode 返回 blk1 数据
- 如果整个文件数据大于指定限制, 会有多个 block 块, 向存储了 blk2 的 namenode 发起数据请求
- namenode 返回数据
- 客户端将获取到的整个数据存储到指定位置