HDFS是一种分布式文件系统,可提供对应用程序数据的高吞吐量访问。
HDFS是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错性、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储。
HDFS优点/为什么选择HDFS存储数据?
1、高容错性
1)数据自动保存多个副本。它通过增加副本的形式,提高容错性;
2)某一个副本丢失以后,可以自动恢复,这是由HDFS内部机制实现的
2、适合批处理
1)它是通过移动计算而不是移动数据
2)它把数据位置暴露给计算框架
3、适合大数据处理
1)处理数据达到GB、TB、甚至PB级别的数据
2)处理百万规模以上的文件数量
3)处理10K节点的规模
4、流式数据访问
1)一次写入,多次读取,文件一旦写入不能修改,只能追加
2)保证数据的一致性
5、可构建在廉价机器上
1)通过多副本机制,提高可靠性
2)提供了容错和恢复机制
HDFS缺点/HDFS并不适合所有的场所:
1、低延时数据访问
比如毫秒级的来存储数据、低延迟的高吞吐率
2、小文件存储
1)存储大量小文件的话,它会占用NameNode大量的内存来存储文件、目录和块信息,而NameNode的内存是有限的
2)小文件存储的寻道时间会超过读取时间
3、并发写入、文件随机修改
1)一个文件只能有一个写,不允许多个线程同时写
2)仅支持数据append(追加),不支持文件的随机修改
HDFS如何存储数据?
HDFS采用Master/Slave架构来存储数据,这种架构主要由HDFS Client、NameNode、DataNode、SecondaryNameNode
Client客户端:
1、文件切分(物理切分)。文件上传HDFS的时候,Client将文件切分成一个个的block,然后进行存储
2、与NameNode交互,获取文件的位置信息
3、与DataNode交互,读取或者写入数据
4、Client提供一些命令来管理HDFS,比如启动/关闭HDFS
5、Client可以通过一些命令来访问HDFS
NameNode:就是Master
1、管理HDFS命名空间,
维护着文件系统树及整颗树内所有的文件和目录,这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件fsimage和编辑日志fsedits
fsimage:元数据镜像文件(文件系统的目录树,比如说有哪些目录,每个目录有哪些文件,这些信息都保存在fsimage文件中)
fsedits:元数据操作日志(针对目录树的修改操作,比如删除了某个文件或者增加了某个文件,它都会把这些操作保存在edits中)
2、管理数据块block映射信息
3、配置副本策略
4、处理客户端读写请求
1)HDFS默认的最基本的存储单位是128M的数据块
2)和普通文件系统相同的是,HDFS中的文件是被分成每块为128M的数据块进行存储的
3)不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
副本策略:
HDFS中的数据块block会有多个副本,默认为3个(可配置),副本存放策略如下:
第一块:在本地机器的HDFS目录下存储一个block
第二块:与第一个不同且随机另外选择的机架上的节点上
第三块:与第二个副本放在同一个机架上,且随机选择另一个节点
DataNode:就是Slave,NameNode下达命令,DataNode执行实际的操作
1)存储实际的数据块
2)执行数据块的读写操作
SecondaryNameNode:
并非NameNode的热备(热备从广义上讲,就是服务器高可用应用的另一种说法,从狭义上讲,双机热备特指基于高可用系统中的两台服务器的热备)。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务
1、辅助NameNode,分担其工作量
2、定期合并fsimage和fsedits,并推送给NameNode
3、在紧急情况下,可辅助恢复NameNode
基本概念:
机架:HDFS集群,由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。
数据块(block):HDFS最基本的存储单元,默认为128M,用户可以自行设置大小。
元数据:指HDFS文件系统中,文件和目录的属性信息。HDFS实现时,采用了 镜像文件(Fsimage) + 日志文件(EditLog)的备份机制。文件的镜像文件中内容包括:修改时间、访问时间、数据块大小、组成文件的数据块的存储位置信息。目录的镜像文件内容包括:修改时间、访问控制权限等信息。日志文件记录的是:HDFS的更新操作。
NameNode启动的时候,会将镜像文件和日志文件的内容在内存中合并。把内存中的元数据更新到最新状态。
在HDFS中,NameNode 和 DataNode之间使用TCP协议进行通信。DataNode每3s向NameNode发送一个心跳。每10次心跳后,向NameNode发送一个数据块报告自己的信息,通过这些信息,NameNode能够重建元数据,并确保每个数据块有足够的副本。