HDFS(hadoop分布式文件系统)是Hadoop的核心组成部分,HDFS采用master/slave架构,一个HDFS集群由一个NameNode(不考虑HA/Federation)和多个DataNode组成
HDFS架构图(via Apache Hadoop)
一、NameNode
- NameNode是HDFS的中心,也称作Master
- NameNode只保存HDFS的元数据,负责管理HDFS的命名空间(namespace)和控制文件的访问操作
- NameNode不保存任何实际的数据或数据集,真正的数据由DataNode负责存储
- NameNode拥有HDFS内所有文件的数据块(blocks)列表及其位置,因而NameNode能通过这些数据块信息来重构对应的文件
- NameNode是HDFS的核心,一旦NameNode挂了,整个集群将无法访问
- NameNode具有单点故障问题(Hadoop2之后可以通过High Available方案解决)
- NameNode需要配置相对较多的内存(相比DataNode而言),因为NameNode会把HDFS的命名空间和文件数据块映射(Blockmap)保存在内存中,这也意味着集群的横向扩展受到NameNode的限制,因为集群增长到一定的规模后NameNode需要的内存也会更大,另外由于所有的元数据操作都需要通过NameNode进行,这意味着集群的性能受到NameNode的限制(Hadoop2之后可以通过Federation方案解决)
- NameNode有两个核心的数据结构,FsImage和EditsLog,FsImage是HDFS命名空间、文件数据块映射、文件属性等信息的镜像,EditsLog相当于一个日志文件,它记录了对HDFS元数据进行修改的所有事务操作,当NameNode启动时会首先合并FsImage和EditsLog,得到HDFS的最新状态然后写入FsImage镜像文件中,并使用一个新的EditsLog文件进行记录
SecondaryNameNode
“SecondaryNamenode”这个名字具有误导性,它不能和DataNode交互,更不能替代NameNode,相反它是用来弥补NameNode的一些缺点,由于NameNode启动时会合并FsImage和EditsLog,但随着集群的运行时间变长,EditsLog会变得非常庞大,这意味着下一次启动需要花很长的时间来进行合并操作.
SecondaryNameNode负责解决以上的问题
- SecondaryNameNode会周期性地从NameNode下载最新的FsImage和EditsLog,然后进行合并,合并后的结果返回给NameNode,我们称之为checkpoint
- 周期性checkpoint受到以下两个参数的控制
dfs.namenode.checkpoint.period:指定连续两次checkpoint的最大时间间隔, 默认值是1小时
dfs.namenode.checkpoint.txns: 定义了EditsLog文件的事务数量,一旦超过这个值会导致强制执行checkpoint(即使没到checkpoint的最大时间间隔).默认值是1000000
- SecondaryNameNode的镜像文件可以在NameNode发生故障导致镜像丢失时拷贝到NameNode上使用,注意:SecondaryNameNode的镜像文件具有滞后性,它保存了最后一次checkpoint的状态,最后一次checkpoint之后产生的操作将会丢失.
二、DataNode
- DataNode又被称为Slave,它负责存储HDFS的实际数据
- 文件在HDFS上以数据块为单位存储(hadoop1默认blocksize为64MB ,hadoop2默认128MB),假设blocksize是128MB,那么一个300MB的文件由(128+128+44MB)三个数据块组成,blocksize过少会导致文件需要大量的数据块,这意味着请求一个文件需要进行大量的网络IO,因为每个block会占用一次request
- DataNode和NameNode会持续通讯,包括向NameNode发送心跳信号表示节点工作正常以及向NameNode发送块状态报告(Blockreport,包含DataNode上所有数据信息)
- DataNode启动后会告诉NameNode它所负责的文件数据块列表,当一个DataNode节点挂了,并不会影响数据和集群的可用性,NameNode会启用副本数据并安排创建一份全新的副本
- 通常DataNode需要配置较大的磁盘空间