2013年,谷歌发布了三篇影响大数据领域格局的文章,也称作三驾马车,分别是GFS、MapReduce和BigTable。后来Doug Cutting根据GFS的论文创建了分布式文件系统HDFS,他也被称为Hadoop之父。
单个机器的容量往往无法满足包含大量数据文件的存储,需要跨机器存储,分布在集群上统一管理,这样的文件系统称为分布式文件系统。HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 用户像是访问一个普通文件系统一样使用分布式文件系统。
HDFS的应用场景
HDFS适用于以下场景:
存储非常大的文件,M、G、TB级别,需要高吞吐量,对时延没有要求;
采用流式的数据访问方式,即一次写入、多次读取,不顾延迟的代价,一次把数据读完;
Hadoop可运行于普通廉价机器,节约成本,高容错性,为数据存储提供了所需的扩展能力。
HDFS不适用于以下场景:
低延时的数据访问,对延时要求在毫秒级别的应用,不适合采用HDFS;
大量的小文件,文件的元数据保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小;
多方读写,需要任意的文件修改HDFS采用追加的方式写入数据,不支持文件任意的修改,不支持多个写入器。
HDFS架构
工作流程:
HDFS是一个主从架构,主要由Client、NameNode、DataNode和Secondary NameNode四部分组成。
Client(客户端):
文件上传至HDFS时,Client 将文件切分成若干的Block块,然后进行存储。
与NameNode交互,获取文件的位置信息。
与DataNode交互,读取或者写入数据。Client 提供一些命令来管理和访问HDFS,如启动或者关闭HDFS。
NameNode(Master):主要负责文件元数据的操作、管理 HDFS 的名称空间管理数据块(Block)、映射信息、配置副本策略、处理客户端读写请求。
NameNode在内存中保存着整个文件系统的名称空间和文件数据块的地址映射。根据名称空间可以获取文件的所有真正数据,通过地址映射可以获取每个Block切片的位置信息。
元数据信息:文件的文件名,目录结构,属性(生成时间,副本数,权限)、文件的块列表,以及列表中的块与块所在的DataNode之间的地址映射关系,在内存中加载文件系统中每个文件和每个数据块的引用关系(文件、Block、DataNode之间的映射信息)。
持久化机制:由于元数据信息保存在NameNode的内存中,内存中数据是临时存储的,当NameNode重启后原来的数据会丢失,因此元数据信息会定期保存到本地磁盘fsImage文件(镜像文件)和edits文件(日志文件)中,重启后读取这些文件即可恢复数据。
心跳机制:一段时间内NameNode若接受到DataNode的心跳信息,则认为DataNode工作正常,若在一定时间内未接受到DataNode的心跳,则认为DataNode已经宕机 ,NameNode会把DataNode上的数据块重新复制。
NameNode具有副本机制,根据全局情况做出放置副本的策略,决定副本文件数据块到底存放到哪些DataNode上。
DataNode(Slave):DataNode根据NameNode下达的命令执行实际的操作,存储实际的数据块或执行数据块的读/写操作。
数据流不经过NameNode,会询问它跟那个DataNode联系,DataNode负责处理文件内容的读写请求。Data Node周期性向NameNode汇报数据块信息、缓存数据块信息。对于经常访问的信息放在缓存中读取速度远远快于磁盘,可以有效提高效率。
Secondary NameNode:它不是NameNode的热备,只能辅助 NameNode,由于NameNode内存中存放了大量的元数据信息,Secondary NameNode可以分担它的工作量,定期合并fsimage和fsedits文件,并发送给NameNode。在紧急情况下,可辅助恢复 NameNode。
HDFS的文件副本机制
所有的文件都是以 Block 块的方式存放在HDFS文件系统当中, 一个文件有可能大于集群中任意一个磁盘,引入块机制,可以很好的解决这个问题。
使用块作为文件存储的逻辑单位可以简化存储子系统,块非常适合用于数据备份进而提供数据容错能力。
在2.x版本的Hadoop中,Block块大小默认为128M,在之前搭建Hadoop集群中的配置文件hdfs-site.xml中,dfs.blocksize用于设置Block的大小,单位为字节:
HDFS的副本策略,默认的副本数为3:
HDFS的机架感知策略
机架就是存放服务器的架子:
以默认的副本数为例,第一个副本会存放在和客户端同一个机器,第二个副本采用随机的方式或者考虑机器容量,放在和客户端同机架不同的机器上,第三个副本采用随机的方式或者考虑机器容量,放在和客户端不同机架的机器上。
关于HDFS的理论知识是非常重要的。后面后继续介绍HDFS的命令行操作,文件读写以及API操作。