HDFS读写数据流程

 

HDFS写数据流程

  1、客户端跟NameNode通信请求上传文件,NameNode检查目标文件是否已经存在,父目录是否已经存在

  2、NameNode返回是否可以上传

  3、客户端先对文件进行切分,对NameNode请求第一个block上传

  4、NameNode返回DataNode服务器DataNode 1,DataNode 2,DataNode 3

  5、客户端请求3台中的一台DataNode 1(网络拓扑上的就近原则,如果都一样,则随机挑选一台DataNode)上传数据(本质上是一个RPC调用,建立pipeline),DataNode 1收到请求会继续调用DataNode 2,然后DataNode 2调用DataNode 3,将整个pipeline建立完成,然后逐级返回客户端

  6、客户端开始往DataNode 1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位。写入的时候DataNode会进行数据校验,它并不是通过一个packet进行一次校验而是以chunk为单位进行校验(512byte)。DataNode 1收到一个packet就会传给DataNode 2,DataNode 2传给DataNode 3,DataNode 1每传一个packet会放入一个应答队列等待应答

  7、当一个block传输完成之后,Client再次请求NameNode上传第二个block的服务器.

 

HDFS读数据流程

1、客户端跟NameNode建立通信请求下载文件

2、NameNode按照就近原则返回该文件的元数据信息

3、跟DataNode请求下载文件

4、DataNode开始发送数据,packet(一个packet为64kb)为单位)

5、客户端把下载下来的所有块合并为最终的文件

 

HDFS优缺点

1)优点

(1)高容错性

a)数据自动保存多个副本。它通过增加副本的形式,提高容错性;

b)某一个副本丢失以后,它可以自动恢复。

(2)适合大数据处理

a)数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据。

b)文件规模:能够处理百万规模以上的文件数量,数量相当之大。

(3)可构建在廉价机器上,通过多副本机制,提高可靠性。

2)缺点

(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

(2)无法高效的对大量小文件进行存储。  

a)存储大量小文件的话,它会占用NameNode大量的内存来存储文件、目录和块信息。每条

元数据大小都为150字节.但是内存是有限的

b)小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

寻址时间,目前技术水平在10ms左右

寻址时间/传输时间=1%,传输时间1000ms=1s,磁盘传输速度100M/S,计算机是2

的n次方,所以hadoop2.x默认块的大小为128M。 2^7

(3)不支持并发写入、文件随机修改。

a)一个文件只能有一个写,不允许多个线程同时写;

b)仅支持数据append(追加),不支持文件的随机修改。

 

HDFS组成架构

Client、NameNode、DataNode和SecondaryNameNode

 

1.Client 客户端

负责将文件切分为一个一个的块

与MameNode交互,获取文件位置信息

与DataNode交互,读取或写入文件

客户端提供一些命令来管理HDFS和访问HDFS

2.NameNode 就是一个管理者

管理HDFS的命名空间

管理块(block)的映射信息

配置副本策略

处理客户端请求

3.DataNode就是Slave,执行NameNode的命令

负责存储数据

执行数据块的读写操作

4.SecondaryNameNode 并非NameNode的热备,当NameNode出现问题时,并不能马上替换掉

NameNode并提供服务

辅助NameNode,分担工作量

定期合并fsimage和edits,并推送给NameNode

在紧急情况下可辅助恢复NameNode

 

SecondaryNameNode工作机制

 

Fsimage: NameNode内存中元数据序列化后形成的文件。

Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)

1.NameNode启动时,先生成一个空的Edits.inprogress,然后加载Edits和Fsimage到内存中

此时NameNode内存就有最新的元数据

2.Cilent对NameNode发送增加删除请求,这些才做首先会被记录到Edits.inprogress中,但

如果此时NameNode出现问题不能工作,重启后就会从Edits中读取元数据信息

3.但是由于记录操作会越来越多,Edits文件也越来越大,导致NameNode启动时加载会很

慢,SecondaryNameNode就是用来解决这个问题,它来帮助NameNode进行Edits和Fsimage

文件的合并 (checkpoint)

实际上就是定时或者当Edits文件到达一定大小时,把Edits里存储的操作步骤执行一遍并

存储到fsimage中

4.当执行Checkpoint操作时会让NameNode生成一个空的Edits,将之前的Edits文件与

Fsimage拷贝

到SecondaryNameNode本地然后进行合并生成fsimage.chkpoint,并拷贝给NameNode,重

命名为 fsimage替换掉原来的

5.这时NameNode启动后只需要加载之前未合并的Edits和新生成的fsimage文件即可

 

posted @ 2021-06-16 10:22  会飞的鹅  阅读(353)  评论(0)    收藏  举报