写文件(create) 过程
- hdfs客户端通过DistributedFileSystem模块调用create() 来新建文件,对namenode创建一个RPC调用,请求在系统的命名空间中新建一个文件。
- namenode检查是否有此目录,以及是否客户有权限,通过则创建新文件,并向客户端返回一个FSDataOutPutStream对象
- 客户端请求上传第一个block到哪几个DataNode上,namenode返回三个节点
- 客户端通过FSDataOutPutStream对象请求dn1上传数据,然后逐级调用,逐级应答,建立完成通信管道
- 客户端开始上传第一个block,以Packet(64k)形式传输数据,datanode1收到一个就会传给下一个,每传一个就会放入一个应答队列等待应答
- 当一个block传输完成后,再传输其他的,重复执行3-5步
读文件过程
- hdfs客户端通过DistributedFileSystem,通过rpc调用namenode确定文件起始块位置,NameNode通过查询元数据,找到文件块所在的datanode地址,按照与客户端距离来排序。
- 客户端对于每一个块都选择一个距离最近的datanode来读数据
- datanode以packet为单位来传输数据
- 客户端通过FSInputStream模块以packet形式接受,先在本地做缓存,然后写入目标文件
说明
1. 机架感知(副本存储节点选择)
原因:为了平衡数据的可靠性和写操作的花费
方法:默认副本数为3;
- 第一个副本在Client所处的节点上,若客户端在集群外,随机选一个;
- 第二个副本在另一个机架的随机一个节点
- 第三个副本在第二个副本所在机架的随机节点
注:NameNode不允许DataNode有两个相同的块,所以最大副本数量可根据DataNode数量决定。
2. 网络拓扑(节点距离计算)
背景:
读数据过程中,NameNode会将排序后的datanode地址发送给客户端,那么是如何排序的呢?
计算机制
两个节点的距离是他们到最近共同祖先的距离总和
参考
- 尚硅谷大数据视频
- Hadoop权威指南