由三个组件构成:Namenode、SecondaryNamenode、Datanode
Namenode
管理着文件系统的命名空间,维护着文件系统树,及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(fsimage)和编辑日志文件(edits)。NameNode也记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息在系统启动时由数据节点重建。
注:Hadoop的块为什么如此大?
HDFS的块比磁盘块大,目的是为了最小化寻址开销。如果块设置的足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。
Hadoop为什么更倾向存储大文件?
因为文件越小,存储同样大小文件所需的元信息就越多, Namenode存储压力越大。
Datanode
存储并检索数据块(受客户端和Namenode调度);定期向Namenode发送它们所存储块的列表;Datanode之间进行通信,实现块的副本处理。
SecondaryNamenode
SecondaryNamenode所做的不过是在文件系统中设置一个检查点来帮助Namenode更好工作,不是取代namenode,也不是namenode的备份。
首先来看看namenode怎么工作的:
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。
上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的。这里有两个不同的文件:
1)fsimage - 它是在NameNode启动时对整个文件系统的快照
2)edit logs - 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:
1)edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
2)NameNode的重启会花费很长时间,因为有很多改动要合并到fsimage文件上。
3)如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。
而SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。
上面的图片展示了Secondary NameNode是怎么工作的:
1)首先,它定时到NameNode去获取edit logs,并更新到fsimage上。[Secondary NameNode自己的fsimage]
2)一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
3)NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
所以,Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点,大型集群中Secondary NameNode需要运行在一台专用机器上。
创建检查点的触发条件受两个配置参数控制:
1)每隔一小时(fs.checkpoint.period,单位秒)创建检查点;
2)编辑日志文件达到64MB(fs.checkpoint.size,单位字节),即使未满一小时也会创建,系统每隔五分钟检查一次编辑日志的大小。
机架感知策略:
HDFS写流程:
HDFS读流程:
HDFS-2.0新特性:
安全模式
Namenode启动时,首先会把镜像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作,一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志,此时,namenode开始监听RPC和HTTP请求,但是,此时namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。
在安全模式下,各个datanode会向namenode发送最新的块列表信息,namenode了解到足够多的块位置信息后,即课高效运行文件系统,注意:系统中数据块的位置并不是由namenode维护的,而是以块列表的形势存储在datanode中。
如果满足最小副本条件(默认是1,由dfs.replication.min属性设置),namenode会在30秒后退出安全模式。在启动一个刚刚格式化的集群时,因为系统中还没有任何块,所以namenode不会进入安全模式。
查看属否处于安全模式:hadoop dfsadmin –safemode get
运行某条命令之前先退出安全模式:hadoop dfsadmin –safemode wait
进入安全模式:hadoop dfsadmin –safemode enter
离开安全模式:hadoop dfsadmin –safemode leave