HDFS(Hadoop Distributed File System):
分布式文件系统(为文件组织位置,格式化硬盘,简而言之就是让数据能对号一一入座的一种方法,作为Hadoop的基础存储系统,实现了一个分布式,高容错,可线性扩展的文件系统
为什么需要引进HDFS?
因为传统的网络文件系统(NFS)虽然也称为分布式文件系统,但是其存在一些限制。由于NFS中,文件是存储在单机上,因此无法提供可靠性保证,当很多客户端同时访问NFS Server时,很容易造成服务器压力,造成性能瓶颈。另外如果要对NFS中的文件进行操作,需要首先同步到本地,这些修改在同步到服务端之前,其他客户端是不可见的。
HDFS支持大文件存储
为什么不能支持小文件存储?
小文件存储会影响内存(小文件存储会产生大量元数据,元数据都会存在内存中,导致占用过多的内存空间)
采用流式的数据访问方式
一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 ,分析工作经常读取其中的大部分数据
HDFS结构图
Namenode负责构建命名空间,管理文件的元数据等
Datanode负责实际存储数据,负责读写工作
HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。
在HDFS中,Namenode可能成为集群的单点故障,Namenode不可用时,整个文件系统是不可用的。HDFS针对单点故障提供了2种解决机制:
1)备份持久化元数据
将文件系统的元数据同时写到多个文件系统, 例如同时将元数据写到本地文件系统及NFS。 2)Secondary Namenode
Secondary节点定期合并主Namenode的namespace image和edit log, 避免edit log过大,通过创建检查点checkpoint来合并。它会维护一个合并后的namespace image副本, 可用于在Namenode完全崩溃时恢复数据。
HDFS数据写入流程
HDFS数据写入流程如下:
-
业务应用调用HDFS Client提供的API,请求写入文件。
-
HDFS Client联系NameNode,NameNode在元数据中创建文件节点。
-
业务应用调用write API写入文件。
-
HDFS Client收到业务数据后,从NameNode获取到数据块编号、位置信息后,联系DataNode,并将需要写入数据的DataNode建立起流水线。完成后,客户端再通过自有协议写入数据到DataNode1,再由DataNode1复制到DataNode2, DataNode3。
-
写完的数据,将返回确认信息给HDFS Client。
-
所有数据确认完成后,业务调用HDFS Client关闭文件。
-
业务调用close, flush(刷写client的缓冲区,让其他client立即可以看到写入的内容)后HDFS Client联系NameNode,确认数据写完成,NameNode持久化元数据。
(1.客户端向namenode申请写入数据,告知其文件属性 2.namenode判断有无写入权限,给数据分配合适节点(datanode) 3.客户端根据分配节点照道相应datanode写入数据,写入三次(第一次写入,后两次为第一次的复制) 4.判断写入是否完成,发送ack回应 5.全部写入成功后关闭写入,namenode会对元数据进行持久化操作)
HDFS读取数据
HDFS数据读取流程如下:
-
业务应用调用HDFS Client提供的API打开文件。
-
HDFS Client联系NameNode,获取到文件信息(数据块、DataNode位置信息)。
-
业务应用调用read API读取文件。
-
HDFS Client根据从NameNode获取到的信息,联系DataNode,获取相应的数据块。(Client采用就近原则读取数据)。
-
HDFS Client会与多个DataNode通讯获取数据块。
-
数据读取完成后,业务调用close关闭连接。
HDFS中的HA
-
HDFS的高可靠性(HA)主要体现在利用zookeeper实现主备NameNode,以解决单点NameNode故障问题。
-
ZooKeeper主要用来存储HA下的状态文件,主备信息。ZK个数建议3个及以上且为奇数个。
-
NameNode主备模式,主提供服务,备同步主元数据并作为主的热备。
-
ZKFC(ZooKeeper Failover Controller)用于监控NameNode节点的主备状态。
-
JN(JournalNode)用于存储Active NameNode生成的Editlog。Standby NameNode加载JN上Editlog,同步元数据。
-
editlog(日志):记录namenode日常操作,排错
-
fsimage(镜像):快照的作用(一段时间内会对namenode当中元数据进行快照,形成文件)
-
元数据同步
-
主NameNode对外提供服务。生成的Editlog同时写入本地和JN,同时更新主NameNode内存中的元数据。
-
备NameNode监控到JN上Editlog变化时,加载Editlog进内存,生成新的与主NameNode一样的元数据。元数据同步完成。
-
主备的FSImage仍保存在各自的磁盘中,不发生交互。FSImage是内存中元数据定时写到本地磁盘的副本,也叫元数据镜像。
-
1.主namenode会更新内存 2.操作日志,生成新的日志(日志是滚动的) 3.当两个标准:日志更新超过1h或者日志当中的数据超过64M,standby从active下载日志,第一次会同时去下载的fsimage,进行合并生成fsckpt(fscheckpoint)在自己内存中去进行保存 4.standby会将fsckpt上传到active中主namenode会对原fsimage 进行更行替换并将fsckpt重名为fsimage 5.再次到达标准时,第二次只需要下载日志,不需要在下载fsimage了