写数据流程
- 客户端向NameNode请求上传文件
- NameNode首先检查是否可以上传文件:检查权限和目录结构,即文件是否存在。
- 然后NameNode响应可以上传文件
- 客户端请求上传block,请求NameNode返回DataNode。
- NameNode返回DataNode的节点,表示用这几个节点存储数据。
- 客户端和第一个DataNode请求建立传输通道,然后第一个DataNode同第二个建立通道,第二个和第三个建立通道。
- 客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 Packet 为单位(64k),dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;
- dn1 每传一个 packet会放入一个应答队列等待应答。
节点距离计算
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据,所以需要知道最近距离的计算方式。
定义
两个节点到达最近的共同祖先的距离总和。
图解
机架感知
NN返回DN的选择优先级为:
(为了兼顾安全和效率)
- 本地节点
- 其他机架一个节点
- 其他机架另一个节点
源码地址
查找 BlockPlacementPolicyDefault,在该类中查找 chooseTargetInOrder 方法。
读数据流程
- 客户端请求下载文件
- NN判断权限和文件目录,然后返回目标文件的元数据(存储各个块的DN信息)
- 客户端创建流获取数据,选择离节点最近的DN开始读取(仍以packet为单位),然后再读DN2,再读DN3,是串行式读取。