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将文件标识为已完成。