HDFS的读写流程(面试重点)
HDFS写数据流程
客服端把D://ss.avi文件传送到集群
1.首先需要创建一个Distributed FileSystem(分布式文件系统)客服端。向NameNode请求上传文件。上传到/user/atguigu/ss.avi路径。
2.NameNode 检查用户是否有权限,检查目标路径/user/atguigu是否可行,检测目标文件ss.avi是否存在。检查完毕后返回结果,是否可以上传文件。
3.客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。
4.NameNode根据选择策略返回 DataNode 节点。
5.客户端创建FSDataOutPutStream,请求 dn1建立Block传输通道,dn1 收到请求会继续传给dn2,然后 dn2 传给 dn3,将这个通信管道建立完成。
6.dn3、dn2、dn1应答客户端。
7.dn1在磁盘中写的过程中,同时把数据传给dn2。以Packet(64k)为单位,dn1收到一个 Packet就会传给dn2,dn2 传给 dn3。每个dn都有ACK队列,应答成功后,缓存的数据才会清空,如果失败,缓存数据用于重发。
(8)当一个 Block 传输完成之后, 客户端再次请求 NameNode 上传第二个 Block。(重复执行 3-7 步)
补充:选择策略
节点距离最近与负载均衡
4.1优先本地节点
4.2其他机架A一个节点
4.3其他机架A另一个节点
网络拓扑-节点距离计算
在HDFS写数据的过程中,NameNode会选择距 离待传上传数据最近距离 的DataNode接收。那么这个最近距离怎么计算?
节点距离:两个节点到达最近的共同祖先的距离总和。
例如,假设有数据中心 d1 机架 r1 中的节点 n1。该节点可以表示为/d1/r1/n1。以下给出了四种类型距离描述。
案例
计算节点5与节点9之间的节点距离是多少 -3
计算节点2与节点10之间的节点距离是多少 -3
机架感知(副本存储节点的选择)
第一个副本考虑的是节点距离最近,上传速度最快。
第二个副本保证数据可靠性。
第三个副本兼顾效率与速度。
查看源码
Crtl + n 查找 BlockPlacementPolicyDefault类,在该类中查找 chooseTargetInOrder 方法。
HDFS的读数据流程
把HDFS的数据读到本地
1.客户端通过 DistributedFileSystem 向 NameNode 请求下载文件。
2.NameNode先判断权限再通过查询元数据,找到文件块所在的 DataNode 地址,返回目标文件的元数据。
3.客户端创建FSDataInputStream流对象,挑选一台 DataNode服务器(就近原则与负载能力),请求读取数据。 假设DN1负载能力到了极限,串行读,先读第一块,再读第二块
(3)DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。
(4)客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。