Hadoop学习(二):HDFS的核心工作流程

1. HDFS读流程架构图

Hadoop学习(二):HDFS的核心工作流程

2. HDFS读流程解析

1)客户端获取文件系统的一个实例DistributedFileSystem,通过DistributedFileSystem打开文件;

2)DistributedFileSystem通过RPC远程调用NameNode决定文件Block的位置信息。对于每一个数据块,NameNode返回Block所在的DataNode(包括副本)的地址。DistributedFileSystem返回 FSDataInputStream给client用来读数据。FSDataInputStream封装了DFSInputStream用于管理 NameNode和DataNode的IO;

3)client调用FSDataInputStream的read方法;

4)DFSInputStream保存了Block块所在的DataNode的地址信息。DFSInputStream连接第一个Block的DataNode,read Block数据,传回给client;

5)当第一个Block读完,DFSInputStream关掉与这个DataNode的连接。然后开始第二个block;

6)当client读结束,调用FSDataInputStream的close方法。

3. HDFS读流程异常处理

•出错处理

在读的过程中,如果client和一个DataNode通讯时出错,它会连接下一个最近的副本所在的DataNode。并且将出错的数据节点报告给名称节点,避免以后做无谓的尝试。并且当客户端在校验Block校验码出错时,也会将出错的数据节点报告给名称节点。这种client直接连接DataNode读取数据的设计方法使HDFS可以同时相应很多client的同时并发。因为数据流量均匀的分布在所有的DataNode上,NameNode只负责Block的位置信息请求。

4. HDFS写流程架构图

Hadoop学习(二):HDFS的核心工作流程

5. HDFS写流程解析

1)client通过调用DistributedFileSystem的create方法来创建文件;

2)DistributedFileSystem通过RPC调用NameNode在文 件系统的名字空间里创建一个文件,这个时候还没有任何Block信息。DistributedFileSystem返回FSDataOutputStream给client。FSDataOutputStream封装了一个DFSOutputStream来处理与datanodes和namenode之间的通讯;

3)当client写一个Block数据的时候,DFSOutputStream把数据分成很多packet。FSDataOutputStream询问NameNode挑选存储这个Block以及它的副本的DataNode列表。这个datanode列表组成了一个管道,在上图管道由三个datanode组成;

4)FSDataOutputStream把packet写进管道的第一个DataNode,然后管道把packet转发给第二个DataNode,这样一直转发到最后一个DataNode。

5)只有当管道里所有DataNode都返回写入成功,这个packet才算写成功,发送应答给FSDataOutputStream。开始下一个packet;

6)当client完成了写所有Block的数据后,调用FSDataOutputStream的close方法关闭文件;

7) FSDataOutputStream通知NameNode写文件结束。

6. HDFS写流程异常处理

•出错处理,如果某个DataNode写失败了,会产生如下步骤,但是这些对client是透明的。

1)管道关闭;

2)正常的DataNode上正在写的Block会有一个新ID(需要和namenode通信)。这样失败的DataNode上的那个不完整的Block在发送心跳的时候会被删掉;

3)失败的DataNode会被移出管道。Block中剩余的packet继续写入管道的其他两个DataNode;

4)NameNode会标记这个Block的副本个数少于指定值。Block的副本会稍后在另一个DataNode创建;

5)有些时候多个DataNode会失败。只要dfs.replication.min(默认是1)个DataNode成功了,整个写入过程就算成功。缺少的副本会异步的恢复。

相关推荐