写数据:
1.hdfs 向 Namenode 请求上传文件;😀
2.NameNode 检查目标文件是否已存在,父目录是否存在,没问题响应可以上传文件
3. 客户端 hdfs 请求上传第一个 bloke,请求返回 DataNode
4.NameNode 返回 dn1,dn2,dn3, 表示采用这三个节点存储数据
优化 Tip: 副本存储节点时优先选择本地节点,其次选择一个机架上的节点,(追求节点距离最近);除此之外,还要考虑负载均衡的问题,当检测到节点数据过多时,会将数据传输到另外一个节点距离较近的 DataNode.
5.hdfs 请求建立 Bloke 传输通道,先通过 dn1,dn1 接受到请求会调用 dn2,然后 dn2 调用 dn3. 搭建完成数据传输通道。
6.dn3,dn2,dn1 逐级应答
7.hdfs 开始传输 bloke 到 dn1,dn1 接受到后,一份数据在磁盘写入,一份数据传输给 dn2
bloke 传输的最小单位 packet (64K):hdfs 写到数据流中时,会先创建一个缓冲队列 chunk512byte+chunksum (校验位) 4byte 缓冲队列攒到 64k 形成 Packet
packet 形成后会被发送到一个个的 DataNode
8.packet 被 dataNode 接受成功后,dn 会给出应答成功,返回给 hdfs,
tip:packet 在发送时,还会有一个缓冲队列 ACK, 在 hdfs 接受到 dn 的应答成功信号后,缓冲队列才会被删除回收。
读流程
1.hdfs 请求下载文件向 NameNode
2.NameNode 查询是否有数据,有则返回目标文件的元数据
3.hdfs 向 dataNode1 发送读数据请求 blk_1,
发送第二个读数据请求时如果发现 dataNode1 处理的数据量已经足够大,hdfs 就会向 dataNode2 发送 blk_2。(负载问题的考虑,不止节点距离的考虑)
4.hdfs 获取到 dataNode 发送过来的数据后,进行串行读入数据
dn3 |
dn2 |
dn1 |