hadoop(3)---HDFS分布式文件系统

本文详细介绍了HDFS(Hadoop Distributed File System)的优缺点,包括高容错性、适合大数据处理、流式访问等优点,以及小文件存储、并发写入、文件随机修改等缺点。深入解析了HDFS的架构,包括Client、NameNode、DataNode和SecondaryNameNode的角色和功能,以及读写文件的具体步骤。

HDFS(Hadoop Distributed File System):分布式文件系统

HDFS的优缺点如下:

优点:

1)、高容错性:数据自动保存为多个副本,可以动态的增加副本数,提高容错性。

                           如果某一个副本丢失以后,它可以自动恢复,这是由HDFS内部机制实现的,我们无需关系

2)、适合大数据处理:处理数据可以达到GB、TB甚至PB级别的数据

                                      能够处理百万规模以上的文件数量,数量相当巨大,能够处理10k节点的规模

3)、流式访问:一次写入、多次读取、文件一旦写入就不能修改了,只能追加;它能保证数据的一致性

4)、适合批量处理数据

5)、可构建在廉价的机器上:通过副本机制可以提高可靠性,还提供了容错性和恢复机制

缺点:

1)、小文件存储:

如果存储大量小文件时,它会占用NameNode大量的内存来存储文件、目录和块信息,这样是不可取的,因为NameNode的内存总是有限的。小文件的寻址时间会超过读取时间,这样也违背了HDFS的设计目标

2)、并发写入

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

3)、文件随机修改

HDFS仅支持数据追加,而不支持文件的随机修改

4)、低延时数据访问

不能存储毫秒级的数据

它适合高吞吐量的场景,就是在某一时间内写入大量的数据,但是它是在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。

 

1、什么是文件系统?

如:c盘下的hello文件夹,hello文件夹的hello.txt就是一个文件

windows文件有如下格式:FAT16、FAT32、NTFS

linux文件有如下格式:ext2/3/4、VFS

注:不同文件处理速度不一样。

2、什么是分布式文件系统

交给多个服务器对文件进行存储的

 

3、下面通过一张图来看一下HDFS存储数据的架构图,来深入了解一下HDFS的相关概念

è¿éåå¾çæè¿°

1)、HDFS采用的是主从复制Master/Slave的架构来存储数据的,这种架构主要由如下4个部分组成:Client、NameNode、DateNode和Secondary NameNode

Client:就是客户端

a.文件切片。文件上传到HDFS时,Client将文件切分成一个个的block块,然后进行存储

b.与NameNode进行交互,用于获取文件的元数据(元数据:即文件的名称、大小、存储时间,文件与block块的映射关系、block块与DataNode的映射关系等相关信息)

c.与DataNode交互,用于读取或者写入数据

d.Client提供了一些命令用来管理HDFS,比如启动或关闭HDFS

e.Client可以通过一些命令来访问HDFS

NameNode:就是master,它是一个主管或管理者

a、管理HDFS的名称和空间

b.管理数据块的映射关系

c.管理配置副本策略

d.处理客户端读写请求

DataNode:就是slave,nameNode下达命令,DateNode就是执行的实际操作者

a.存储实际的数据块

b.执行数据库的读写操作

Secondary NameNode:并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务

a.它相当于管理者的助理,分担其工作量

b.定期合并fsimage和fsedits,并推送给NameNode

c.在紧急情况下,可以辅助恢复NameNode

 

4、HDFS读取文件的步骤

è¿éåå¾çæè¿°

原理如下:

1)、首先调用FileSystem对象的open()方法,其实获取的是一个DistributedFileSystem的实例

2)、DistributedFileSystem通过RPC获取文件的第一批block的locations,同一个block按照重复数会返回多个locations

这些locations会按照hadoop的拓扑结构排序,距离客户端近的排在前面

3)、前两个步骤会返回一个FsDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理dataNode和nameNode数据流,客户端调用read()方法,DFSInputStream就会根据距离找出最近的dataNode并连接dataNode

4)、数据从dataNode源源不断的流向客户端

5)、如果第一个block块的数据读完了,就会关闭指向第一个block块的dataNode的连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读取了一个持续不断的流。

6)、如果第一批block都读取完了,DFSInputStream就会去nameNode拿下一批block的location,然后继续读。

          如果所有的block块都读取完了,这时就会关闭掉所有的流。

 

5、HDFS如何写入文件

è¿éåå¾çæè¿°

步骤如下:

1、客户端通过调用DistributedFileSystem的create方法,创建一个新的文件

2、DistributedFileSystem通过RPC调用NameNode,去创建一个没有blocks关联的新文件。

      创建前,NameNode会做各种校验,比如文件是否存在,客户端有无权限创建等,

      如果校验通过,NameNode就会记录下新文件,否则就会抛出IO异常

3)、前两个步骤结束后,就会返回FSDataOutputStream的对象,和读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream,DFSOutputStream可以协调NameNode和DateNode。

       客户端开始写数据到DFSOutputStream,DFSOutputStream会将数据切成一个个小packet,然后排成队列data queue.

4)、DataStreamer会去处理接受data queue,它向询问NameNode这个新的block块最适合存储在那几个DataNode里面。比如重复数是3,那么就会找到3个最适合的DataNode,把他们排成一个pipeLine.DataStreamer将packet按照队列输出到管道的第一个DateNode中,第一个DataNode又将packet输出到第二个DateNode中,依次类推。

5)、DFSOutputStream还有一个队列叫做ack queue,也是由packet组成,等待DataNode的收到响应,当pipeLine中所有dataNode都表示已经接受到时,这时ack queue才会将对应的packet包删除掉。

6)、客户端完成写数据后,调用close方法关闭写入流

7)、dataStreamer将剩余的包都刷到pipeline里面,然后等待ack信息,收到最后一个ack后,通知dataNode将文件标识为已完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值