这是我参与「第四届青训营 」笔记创作活动的的第10天
[第四届青训营笔记创作活动]
一、写流程
1. 详细步骤
- 客户端向 NameNode 发出写文件请求
- 检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象(副本目标 DataNode 列表)
- Client 将 NameNode 返回的分配的可写的 DataNode 列表和 Data 数据一同发送给最近的第一个 DataNode 节点,此后 Client端和 NameNode 分配的多个 DataNode 构成 pipeline 管道,Client 端向输出流对象中写数据。Client 每向第一个 DataNode 写入一个 packet(DataNode的PipLine之间传数据的基本单位,默认64KB),这个 packet 便会直接在 pipeline 里传给下一个 DataNode
- 每个 DataNode 写完一个块后,会返回确认信息
- 写完数据,关闭输输出流
- Client 发送完成信号给 NameNode
2. 异常处理
-
Lease Recovery
HDFS 的租约保证 HDFS 的一写多读机制,即当一个客户端希望打开(Open)HDFS 中的某个文件进行 append 或者 truncate 操作时,它必须向 NameNode 申请 Lease(租约)。Lease 相当于一把写锁,只有拥有 Lease 的客户端才能对文件进行写操作,其他客户端只能对该文件进行读操作。当客户端关闭(Close)文件是,NameNode 将释放租约给其他客户端使用。
但有时客户端拿到租约以后可能出现在文件未正常关闭时进程退出等意外情况,从而导致租约无法及时释放。为了解决这个问题,NameNode 要求客户端在规定时间内对租约续租(Renew Lease),才能继续写文件。如果客户端没有在规定时间内续租,NameNode 将把这个租约恢复成无人使用状态,这个过程叫做 Lease Recovery。
-
Pipeline Recovery
文件写入过程中,DataNode 侧出现异常,有以下几种情况:
-
创建连接发生错误,有以下两种情况:
- 新写文件:Client 重新请求 NameNode 分配 block 和 DataNodes,重新设置 pipeline
- 追加文件:Client 从 pipeline 中移除出错的 DataNode,然后继续
-
数据传输时发生错误,有以下三个步骤
- 当 pipeline 中的某个 DataNode 检测到写入磁盘出错,将它移出 pipeline,关闭相关的 TCP 连接
- 当 Client 检测到 pipeline 有 DataNode 出错,先停止发送数据,并基于剩下正常的 DataNode 重新构建 pipeline 再继续发送数据
- Client 恢复发送数据后,从没有收到确认的 packet 开始重发,其中有些 packet 前面的 DataNode 可能已经收过了,则忽略存储过程直接传递到下游节点
-
complete 阶段发生错误:
- Client 依然根据剩下正常的 DataNode 重建 pipeline,让剩下的 DataNode 继续完成 close 阶段需要做的工作
-
二、读流程
1. 详细步骤
- Client 访问 NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象
- 就近挑选一台 DataNode 服务器,请求建立输入流
- DataNode 向输入流中中写数据
- 关闭输入流
2. 异常处理
对于出现异常或读取缓慢的节点,自动将节点 failover,并与其它节点建立连接读取数据