2.3.1 HDFS相关概念
1.存储块
HDFS使用Block(存储块)对文件的存储进行操作,Block是HDFS的基本存储单元,在Hadoop 1.x中默认大小是64MB,Hadoop 2.x中默认大小为128MB,一个文件被分成多个块,以块作为存储单位,块的大小远远大于普通文件系统,可以最小化寻址开销。
HDFS采用抽象的块概念可以带来以下几个明显的好处:
(1)支持大规模文件存储:文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量。
(2)简化系统设计:首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据。
(3)适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性。
2.NameNode、SecondaryNameNode和DataNode
NameNode管理文件系统的命名空间。NameNode维护两套数据:一套是文件目录与数据块之间的映射关系,另一套是数据块与节点间的关系。前一套是静态的,是存放在磁盘上的,通过命名空间镜像文件(FsImage)和编辑日志文件(EditLog)来维护;后一套数据是动态的,不持久化到磁盘,每当集群启动的时候,会自动建立这些信息。 NameNode管理文件系统的元数据,多个DataNode存储实际的数据。客户端通过同NameNode和DataNode的交互访问文件系统(客户端联系NameNode以获取文件的元数据,而真正的I/O操作是直接和DataNode进行交互的)。
SecondaryNameNode第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上。为什么要引入SecondaryNameNode?因为在NameNode名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大,虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。
DataNode数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表。每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中。
3.心跳机制
所谓“心跳”是一种形象化描述,指的是持续的按照一定频率在运行,类似于心脏在永无休止地跳动。这里指的是DataNode向NameNode发送心跳的周期是3s,NameNode周期性地从集群中的每个DataNode接收心跳包和块报告,NameNode可以根据这个报告验证块映射和其他文件系统元数据。收到心跳包说明DataNode工作正常。如果DataNode不能发生心跳信息,NameNode会标记没有心跳的DataNode为宕机,不会给其任何新的I/O请求。
4.机架感知
Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其他某一节点上一份,不同机架的某一节点上一份。这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上取数据要快;同时,如果整个机架的网络出现异常,也能保证在其他机架的节点上找到数据。为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。那么Hadoop是如何确定任意两个节点是位于同一机架,还是跨机架的呢?答案就是机架感知。