HDFS文件操作流程
本文最后更新于:2 年前
读/下载流程
客户端向 NameNode 发起请求;
NamaNode 接收到请求后,会进行校验;
- 客户端是否有读取权限
- 是否存在指定文件
如果校验失败,则直接报错;如果校验成功,那么 NameNode 向客户端返回信号允许读取;
客户端接收到信号,会再次发起请求,请求获取第一个 block 的存储地址;
NameNode 接收到信号后,会查询元数据,这个 block 的存储地址会被放在队列中返回给客户端;
当客户端接收到队列后,将地址从队列中取出来,然后总地址中选举出较近的节点去读取 block;
读取完这个 blcok 后,客户端会对这个 block 进行 checksum 校验(防止读取的 block 损坏);
如果校验失败,那么客户端会向 NameNode 发送信号,同时从剩余地址中重新选取读取,重新校验;如果校验成功,客户端向 NameNode 发送请求获取下一个block的地址,重复 5-8,直到读取完毕;
当客户端读取完最后一个 block 后,向 NameNode 发送一个结束信号,NameNode 接收到信号后关闭资源/
写/上传流程
客户端向 NameNode 发起请求;
NamaNode接收到请求后,会进行校验;
- 客户端是否有写入权限
- 是否存在同名文件
如果校验失败,则直接报错;如果校验成功,那么NameNode向客户端返回信号允许读取;
客户端接收到信号,会再次发起请求,请求获取第一个 block 要存储的地址;
当 NameNode 接收到信号后,会将 block 的存储地址放到队列中返回给客户端;
客户端接收到队列后,选取最近的一个节点写入到 block;
这个 block 的第一个副本写完之后,此副本所在的节点通过 pipeline 机制将第二个副本写到指定节点,以此类推;
当最后一个副本写完后,最后副本所在的节点会向上一个副本所在节点发送 ACK 信号,依次往前,直到第一个副本节点收到信号后,向客户端发送 ACK 信号,表示第一个 block 写完了;
当客户端接收到 ACK 信号后,会向 NameNode 发送请求,获取下一个 block 要存的位置,重复 5-8;
所有 block 写完后,客户端会向 NameNode 发送一个结束信号,NameNode 收到后关流。文件关闭后,就不能更改。
删除文件
客户端向 NameNode 发起请求;
NamaNode 接收到请求后,会进行校验;
- 客户端是否有删除权限
- 文件是否存在
如果校验成功,NameNode 会将这个操作记录在 edits 文件中,然后修改元数据,修改完成后向客户端发送一个成功信号,表示文件已经删除(注意:此时文件并没有真正删除,只是元数据发生了改变);
NameNode 会等待 DataNode 的心跳,会在心跳响应中命令 DataNode 删除对应的 block;
DataNode 收到命令后,将 block 删除,此时,文件才真正被删除。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!