HDFS文件操作流程

本文最后更新于:2 年前

读/下载流程

  1. 客户端向 NameNode 发起请求;

  2. NamaNode 接收到请求后,会进行校验;

    • 客户端是否有读取权限
    • 是否存在指定文件
  3. 如果校验失败,则直接报错;如果校验成功,那么 NameNode 向客户端返回信号允许读取;

  4. 客户端接收到信号,会再次发起请求,请求获取第一个 block 的存储地址;

  5. NameNode 接收到信号后,会查询元数据,这个 block 的存储地址会被放在队列中返回给客户端;

  6. 当客户端接收到队列后,将地址从队列中取出来,然后总地址中选举出较近的节点去读取 block;

  7. 读取完这个 blcok 后,客户端会对这个 block 进行 checksum 校验(防止读取的 block 损坏);

  8. 如果校验失败,那么客户端会向 NameNode 发送信号,同时从剩余地址中重新选取读取,重新校验;如果校验成功,客户端向 NameNode 发送请求获取下一个block的地址,重复 5-8,直到读取完毕;

  9. 当客户端读取完最后一个 block 后,向 NameNode 发送一个结束信号,NameNode 接收到信号后关闭资源/

写/上传流程

  1. 客户端向 NameNode 发起请求;

  2. NamaNode接收到请求后,会进行校验;

    • 客户端是否有写入权限
    • 是否存在同名文件
  3. 如果校验失败,则直接报错;如果校验成功,那么NameNode向客户端返回信号允许读取;

  4. 客户端接收到信号,会再次发起请求,请求获取第一个 block 要存储的地址;

  5. 当 NameNode 接收到信号后,会将 block 的存储地址放到队列中返回给客户端;

  6. 客户端接收到队列后,选取最近的一个节点写入到 block;

  7. 这个 block 的第一个副本写完之后,此副本所在的节点通过 pipeline 机制将第二个副本写到指定节点,以此类推;

  8. 当最后一个副本写完后,最后副本所在的节点会向上一个副本所在节点发送 ACK 信号,依次往前,直到第一个副本节点收到信号后,向客户端发送 ACK 信号,表示第一个 block 写完了;

  9. 当客户端接收到 ACK 信号后,会向 NameNode 发送请求,获取下一个 block 要存的位置,重复 5-8;

  10. 所有 block 写完后,客户端会向 NameNode 发送一个结束信号,NameNode 收到后关流。文件关闭后,就不能更改。

删除文件

  1. 客户端向 NameNode 发起请求;

  2. NamaNode 接收到请求后,会进行校验;

    • 客户端是否有删除权限
    • 文件是否存在
  3. 如果校验成功,NameNode 会将这个操作记录在 edits 文件中,然后修改元数据,修改完成后向客户端发送一个成功信号,表示文件已经删除(注意:此时文件并没有真正删除,只是元数据发生了改变);

  4. NameNode 会等待 DataNode 的心跳,会在心跳响应中命令 DataNode 删除对应的 block;

  5. DataNode 收到命令后,将 block 删除,此时,文件才真正被删除。