HDFS组成角色及其功能


1. Client:客户端

2. NameNode (NN):元数据节点

  管理文件系统的Namespace元数据

  处理客户端读写请求

3. DataNode (DN):数据节点

  数据存储节点,保存和检索Block

  执行数据读写操作

4. Secondary NameNode (SNN):从元数据节点

  合并NameNode的edits到fsimage文件中

  辅助NN将内存中元数据信息持久化


HDFS写流程

登录HDFS客户操作 hdfs用户_hdfs



1.client请求

  client通过DFS向NN请求(源文件已存在)

2.NN确认

  目录存在、用户无操作权限return false否则return true

3.client切分并请求第一个Block DN

  client将文件切成n个128M的Block

  client向NN请求第1个Block的存储DN列表

4.NN返回DN列表

  假如返回: dn1 dn2 dn3

5.client写入

  a. FSDOS向dnl请求写入

  b. dn1请求dn2 , dn2请求dn3,分别建立pipeline管道

  c. dn3响应dn2 ,dn2响应dn1 , dn1响应client

  d. Block传输

   d.1: client读取第一个Block并以Packet(64k)为单位传输, dn1每收到一个Packet会建立等待应答队列,并逐级传输给dn2 , dn3

   d.2: dn3 ,dn2 , dn1逐级应答,并将结果反馈给client

   d.3:重复d.1~2直至Block传输完成

6.client发送complete给NN

7.重复3~6直至所有Block传输完成

8.关闭FileSystemDataOutputStream

HDFS读流程

登录HDFS客户操作 hdfs用户_hdfs_02



1.client创建DFS

  DFS dfs = Filesystem. open ()

2.DFS向NN请求RPC获取【文件开始部分或全部】Block有序列表

  列表按距离client的距离升序排序

  每个Block包含DN地址,如果client就是DN,则本地读取

3.DFS向client返回支持文件定位的输入流对象FSDIS

  FSDIS中包含一个(DFSIS) DFSInputstream,用来管理DN和NN之间的IO

 如:

 DN中数据缺失或者下载一部分之后任务失败,则可以通过DFSInputstream联系NN求助

 NN借助YARN找到距离最近的另一个备份节点

 将未完成的下载任务迁移到该节点,并通过【支持文件定位】的输入流对象FSDIS进行【续传】

4.client调用FSDataInoutStream的read()找到离client最近的DN,并连接DN

5.DFSIS依次读取一个批次的Block

 a.读取包含文件第一个Block的最近DN地址

 b.重复调用read()方法,直至第一个Block读取完成

 c.关闭DN连接

 d.重复a~c直至第一个批次的Block全部读取完成

6.重复2~5,直至所有批次的Block读取完成

7.关闭DFSIS(distribute file system inputstream),FSDIS(file system datainput stream),DFS(distribute file system)