HDFS中读写过程的示例分析

小编给大家分享一下HDFS中读写过程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

 读文件的过程

  1 客户端(client)用 FileSystem 的open() 函数打开文件

  2 DistributedFileSystem 用RPC 调用元数据节点,得到文件的数据块信息 。对于每一个数据块,元数据节点返回保存数据块的数据节点的地址 ,DistributedFileSystem 返回FSDataInputStream给客户端,用来读取数据。

 3 客户端调用stream的read() 函数开始读取数据 ,DFSInputSteam 连接保存此文件第一个数据块的最近的数据节点

 4 Data 从数据节点读到客户端(client) ,当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

 5 当客户端读取完毕数据的时候,调用FSDataInputStream 的close()函数 

    在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

失败的数据节点将被记录,以后不再连接。

HDFS中读写过程的示例分析

自简单总结 :  client 用FileSystem open  打开文件---> FileSystem从namenode 获取文件的bloc location位置 返回 FSDataInputStream 给client  ---->  client 利用 FSDataInputStream 读取数据 --->每读完一个数据块关闭与此 datanode的连接 ---->直到文件所有数据块 读完,关闭 FSDataInputStream 的close()

写文件的过程

 1、客户端调用create()来创建文件

 2、 DistributedFileSystem 用RPC 调用元数据元数据节点,在文件系统的命名空间创建一个新的文件。

       元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建文 件。  DistributedFileSystem 返回DFSOutputStream 客户端用于写数据  

 3、 客户端开始写入数据,DFSOutputStream 将数据分成块,写入 data queue 。

 4、 Data queue 由 Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块) 分配的数据节点放在一个pipeline里  。也即 (DFSOutputStream写入 data queue里的block 即将要写入pipeline 中的数据节点上 ,这块的读写数据工作是由Data Streamer来负责的)

     Data Streamer 将数据块写入pipeline中的 第一个数据节点。 第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。依次。。

5、DFSOutputStream 为发出去的数据块保存了 ack queue ,等待pipeline中的数据节点告知数据已经写入成功。

         如果数据节点在写入的过程中失败:

         关闭pipeline ,将ack queue 中的数据块放入 data queue的开始

         当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据时过期的,会被删除。

         失败的数据节点从pipeline 中移除,另外的数据块则写入pipeline中的另外两个数据节点。

        元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份

6、当客户端结束写入数据,则调用stream 的 close函数 。此操作将所有的数据块写入 pipeline中的数据节点,并等待ack queue 返回成功 。最后通知元数据节点写入完毕。

 HDFS中读写过程的示例分析

自总结

client create --> FileSystem create调用namnode 创建 fsimage文件 --> 返回DFSOutputStream给客户端 ---> 客户端利用DFSOutputStream 开始 将block(数据分块)写入data queue里
--->Data Streamer来负责从data queue取数据写入pipeline (数据节点列表)--->DFSOutputStream 等待pipeline 返回的ack queue -->最后通知元数据节点写入完毕

安全模式

1:Name 启动的时候首先将fsimage(镜像)载入内存,并执行(replay)编辑日志editlog的各项操作

2:一旦内存中建立文件系统元数据映射,则创建一个新的fsimage 文件(这个过程不需要secondaryNamenode)和一个空的editlog

3:在安全模式下 ,各个 datanode 会向namenode发送块列表的最新情况

4:此刻namenode 运行在安全模式 。即  namenode 的文件系统对于客户端来说是只读的(显示目录,显示文件内容等 ,写,删除 ,重命名都会失败)

5:NameNode 开始监听RPC 和HTTP请求

 解释RPC:RPC(Remote Procedure Call Protocol)——远程过程通过协议,它是一种通过网络从远程

   计算机程序上请求服务,而不需要了解底层网络技术的协议.

6: 系统中数据块的位置并不是由namenode  维护的,而是以列表形式存储在datanode 中

7: 在系统的正常操作期间,namenode 会在内存中保留所有块信息的映射信息(块在datanode什么位置)

8 : 进入和离开安全模式:

     查看namenode处于哪个状态

       hadoop dfsadmin -safemode get

进入安全模式(hadoop启动的时候是在安全模式)

             hadoop dfsadmin –safemode enter

        离开安全模式

             hadoop dfsadmin  -safemode leave

看完了这篇文章,相信你对“HDFS中读写过程的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!