hdfs 文件上传过程

  1. 向 namenode 请求上传文件

  2. 响应可以上传文件

  3. 向 namenode 请求, 上传到哪几台 dataNode

  4. Namenode 返回,指定文件上传的 datanode 节点数据

  5. 通过获取到的 namenode 节点信息, 客户端向一个节点发送通信, 开通数据通信管道

  6. 确认建立通道

  7. 创建 FSDataOutputStream

  8. 客户端开始向 一个dataNode传递数据, 第一个 dataNode 将数据持久化到磁盘, 并通过内存, 向下一个 dataNode 传递副本, 直到传递最后一个指定 datanode

  9. 确认数据传输完成, 向前一个 namenode 或客户端返回确认

  10. 客户端将数据存储到那么datanode 节点的元数据信息传递给 namenode 存储

    hadoop hdfs 数据读写

网络拓扑

hadoop hdfs 数据读写

namenode 向客户端返回元数据下载位置, 是需要计算网络节点距离的, 根据请求客户端的位置计算最短距离:

  1. 计算同节点距离 例如: 集群a-机架 1-node1, distance = 0
  2. 计算同机架距离 例如: 集群a-机架 1-node1—> 集群a-机架 1-node2, 机架相同, 各节点向上查找 1 distance=2
  3. 计算同集群距离 例如: 集群a-机架 1-node1—>集群a-机架 2-node2, 集群相同, 各节点向上查找 1 到机架, 再向上查找 1 到集群 distance = 4
  4. 计算不同集群距离 例如: 集群a-机架 1-node1—>集群b-机架 2-node2, 各节点向上查找 1 到机架, 再向上查找 1到集群, 再向上查找 1 distance=6

机架感知(副本存储节点选择)

hadoop hdfs 数据读写

选择存储副本的节点, 例如有三个副本

  1. 副本一:根据 client 所处的客户端, 找到相同节点, 存储一份副本
  2. 副本二:根据副本一所处节点, 找到相同机架任意节点, 存储一份副本
  3. 副本三:根据副本一所处节点, 找到不同机架任意节点, 存储一份副本

hdfs 文件读数据过程

hadoop hdfs 数据读写

  1. 客户端向 namenode 请求下载数据
  2. namenode 返回目标文件的元数据
  3. 客户端创建 FSDataInputStream 向获取到的 dataNode 节点发起blk1数据请求
  4. dataNode 返回 blk1 数据
  5. 如果整个文件数据大于指定限制, 会有多个 block 块, 向存储了 blk2 的 namenode 发起数据请求
  6. namenode 返回数据
  7. 客户端将获取到的整个数据存储到指定位置

相关文章: