Hadoop学习(二):HDFS的核心工作流程
1. 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写流程架构图
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成功了,整个写入过程就算成功。缺少的副本会异步的恢复。