HDFS的读写流程及故障恢复机制
HDFS的读流程
- 客户端向NameNode请求元数据信息
- NameNode返回数据块位置列表,并返回一个输入流对象
- 客户端根据namenode返回的datanode列表,就进选择一个datanode建立输入流连接
- datanode向输入流中写数据,以packet为单位进行校验
- 关闭输入流
HDFS的写流程
- 客户端向namenode发送一个写的请求
- namenode检查写的权限,若通过检查,将操作写入EditLog,返回datanode列表,和一个输出流对象
- client对文件按照128MB进行切片
- client与datanode建立一个pipeline连接
- client向pipeline中发送第一个packet,这个packet在管道中由第一个datanode传送到最后一个,在管道的反方向上,会发送一个ack,直到第一个datanode收到ACK,并将ack发送给客户端
- 关闭管道
- 客户端向namenode发送完成信号
HDFS的故障恢复机制
- 首先关闭pipeline连接
- 将确认队列中没有收到ack的数据包写回到数据队列中
- 所有正常的datanode进行版本升级,根据namenode租约信息,获取最新的时间戳版本
- 正常的DataNode中选出一个主节点,与其他节点建立连接,获取每个datanode的当前数据块大小,选择最小值,将每个datanode都同步该大小
- 重新建立管道连接
- 管线中删除故障节点,并把数据写入正常的节点
- 文件关闭后,namenode会发现副本不足,会在另一个节点上创建一个新的副本
- namenode发现少了一个