为了解决海量数据存储问题,Google开发了分布式文件系统GFSo HDFS是GFS的开源实现, 它是Hadoop的核心组件之一。HDFS提供了在通用硬件集群中进行分布式文件存储的能力,是一 个高容错性和高吞吐量的海量数据存储解决方案。
HDFS 简介
HDFS (Hadoop Distributed Filesystem, Hadoop分布式文件系统)以流式数据访问模式来存储 超大文件,运行在由廉价普通机器组成的集群上,是管理网络中跨多台计算机存储的文件系统。它 的基本原理是将文件切分成同等大小的数据块,存储到多台机器上,将数据切分、容错、负载均衡 等功能透明化。
HDFS上的文件被划分为相同大小的多个block块,以块作为独立的存储单位(称为数据块)。 为什么要弄成块来存储?第一,大文件用一个节点是存不下来的,势必分成块;第二,网络传输时 万一宕掉,可以小部分重传;第三,简化了存储管理,同时元数据就不需要和块一同存储了,用一 个单独的系统就可以管理这些块的元数据。所以block块是HDFS中最基本的存储单位。一个文件 Hadoop 2.x版本的HDFS块默认大小是128MB (Hadoop 1.X版本默认块大小是64MB)。默认块 大小是可以修改的,可以通过dfs.block.size设置。
除了将文件分块,每个块文件也有副本,这是为了容错性。当一个机器挂了,想要恢复里面 的文件,就可以去其他机器找文件的副本。默认是三个副本,也可通过hdfs-site.xml中的replication 属性修改副本数量。
HDFS的副本放置策略是将第一个副本放在本地节点,将第二个副本放到本地机架上的另外一 个节点,而将第三个副本放到不同机架上的节点。这种方式减少了机架间的写流量,从而提高了写 的性能。机架故障的概率远小于节点故障。将第三个副本放置在不同的机架上,这也防止了机架故障时数据的丢失。
总之,HDFS在设计之初就是针对超大文件存储的,小文件不会提高访问和存储速度,反而会 降低。其次它釆用了流式数据访问,特点是一次写入多次读取。再有就是它运行在普通的标准硬件 (如PC服务器)之上,即使硬件故障,也可以通过副本冗余容错机制来保证数据的高可用。
HDFS架构概述
HDFS 釆用主从(Master/Slave)架构模型,分为 NameNode (名称节点)、SecondaryNameNode (第二名称节点)、DataNode (数据节点)这几个角色
—个典型的HDFS集群是由一个NameNode个SecondaryNameNode和若干个DataNode(通 常大于3个)组成的,通常是一个节点一个机器,它来管理对应节点的存储。
(1) NameNode:主要负责文件系统命名空间的管理、存储文件目录的Metadata元数据信息, 主要包括文件目录、block块和文件对应关系,以及block块和DataNode数据节点的对耳关系。
(2) SecondaryNameNode:是NameNode的冷备份,用来减少NameNode的工作量。
(3) DataNode:负责存储客户端(Client)发来的Block数据块,执行数据块的读写操作。
HDFS命名空间管理
HDFS的命名空间包含目录、文件和块。在HDFS1.0架构中,在整个HDFS集群中只有一个 命名空间,并且只有唯一一个NameNode,负责对这个命名空间进行管理。HDFS使用的是传统的分级文件体系,因此用户可以像使用普通文件系统一样创建、删除目录和文件以及在目录间移动文 件、重命名文件等。HDFS2.0新特性federation联邦功能支持多个命名空间,并且允许在HDFS中 同时存在多个NameNode
NameNode
HDFS集群的命名空间是由NameNode来存储的。NameNode使用Fslmage和EditLog两个核 心的数据结构,如图所示。EditLog事务日志文件记录每一个对文件系统元数据的改变,如在 HDFS中创建一个新的文件,名称节点将会在EditLog中插入一条记录来记录这个改变。整个命名 空间的信息包括文件块的映射表等都存放在Fslmage文件中。
名称节点启动时,它将从磁盘中读取Fslmage和EditLog,将EditLog中的所有事务应用到 Fslmage,然后将新的Fslmage刷新到本地磁盘中,因为事务已经被处理并已经持久化到Fslmage 中,然后就可以截去旧的EditLog。这个过程叫作检査点。
Fslmage和Editlog是HDFS的重要数据结构,如果这些文件损坏,就会导致整个集群的失效。 因此可以配置成复制多个Fslmage和EditLog的副本,一般会在本地磁盘和网络文件系统NFS中 分别存放。
SecondaryNameNode
SecondaryNameNode是HDFS架构中的一个组成部分,它用来保存名称节点中对HDFS元数 据信息的备份,减小Editlog文件大小,从而缩短名称节点重启的时间。它一般是单独运行在一台 机器上。
(1) SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将 新的写操作写到一个新的文件edit.new中,这个操作是瞬间完成的,上层写日志的函数完全感觉不到差别。
(2) SecondaryNameNode 通过 HTTP GET 方式从 NameNode 上获取到 Fslmage 和 EditLog 文 件,并下载到本地的相应目录下。
(3) SecondaryNameNode将下载下来的Fslmage载入到内存,然后一条一条地执行EditLog 文件中的各项更新操作,使内存中的Fslmage保持最新。这个过程就是EditLog和Fslmage文件合 并。
(4) SecondaryNameNode执行完(3)操作之后,会通过post方式将新的Fslmage文件发送 到NameNode节点上。
(5) NameNode将从SecondaryNameNode接收到的新的Fslmage替换旧的Fslmage文件,同 时将Edit.new替换EditLog文件,从而减小EditLog文件大小。
第二名称节点相当于为名称节点设置一个“检査点”,周期性备份 名称节点中的元数据信息,但第二名称节点在HDFS设计中只是一个冷备份,并不能起到“热备 份”的作用。HDFS设计并不支持当名称节点故障时直接切换到第二名称节点。