写文件(create) 过程

  1. hdfs客户端通过DistributedFileSystem模块调用create() 来新建文件,对namenode创建一个RPC调用,请求在系统的命名空间中新建一个文件。
  2. namenode检查是否有此目录,以及是否客户有权限,通过则创建新文件,并向客户端返回一个FSDataOutPutStream对象
  3. 客户端请求上传第一个block到哪几个DataNode上,namenode返回三个节点
  4. 客户端通过FSDataOutPutStream对象请求dn1上传数据,然后逐级调用,逐级应答,建立完成通信管道
  5. 客户端开始上传第一个block,以Packet(64k)形式传输数据,datanode1收到一个就会传给下一个,每传一个就会放入一个应答队列等待应答
  6. 当一个block传输完成后,再传输其他的,重复执行3-5步

读文件过程

  1. hdfs客户端通过DistributedFileSystem,通过rpc调用namenode确定文件起始块位置,NameNode通过查询元数据,找到文件块所在的datanode地址,按照与客户端距离来排序。
  2. 客户端对于每一个块都选择一个距离最近的datanode来读数据
  3. datanode以packet为单位来传输数据
  4. 客户端通过FSInputStream模块以packet形式接受,先在本地做缓存,然后写入目标文件

说明

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

原因:为了平衡数据的可靠性和写操作的花费

方法:默认副本数为3;

  1. 第一个副本在Client所处的节点上,若客户端在集群外,随机选一个;
  2. 第二个副本在另一个机架的随机一个节点
  3. 第三个副本在第二个副本所在机架的随机节点

注:NameNode不允许DataNode有两个相同的块,所以最大副本数量可根据DataNode数量决定。

2. 网络拓扑(节点距离计算)

背景:

读数据过程中,NameNode会将排序后的datanode地址发送给客户端,那么是如何排序的呢?

计算机制

两个节点的距离是他们到最近共同祖先的距离总和

hdfs怎么查看副本数是多少 hdfs 副本数_客户端

参考

  1. 尚硅谷大数据视频
  2. Hadoop权威指南