3.1 HDFS简介

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

3.1.1 HDFS的概念

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变

3.1.2 HDFS数据的存储和读取方式

对于大文件的存储,HDFS采用分割的方式。HDFS将大文件分割到既定的存储块(Block)中存储,并通过本地设定的任务节点进行预处理。

对于大量小文件的存储,HDFS采用普通的编码与压缩方式。在实际工作中,更多时候需要存储大量小文件。

对于普通文件的读取,HDFS通常采用分批次的方式。

对于大量数据的读取,HDFS采用集中式。存储时的优化使得读取能够在一个连续的区域内进行,节省读取数据的时间。

对于少量数据的随机读取,HDFS一般采用按序读取的方式,即先把少量的随机读取操作合并,然后按顺序读取数据。

3.1.3 HDFS的特点

HDFS优点

成本低。HDFS可以部署在价格低廉的硬件上,成本较低。只要有台式机或笔记本电脑就可以部署HDFS。

高容错。HDFS利用众多服务器实现分布式存储,每个数据文件都有2个冗余备份,也就是每个数据文件被存储3份。如果存储数据的某个服务器发生了故障,数据还有2个备份,因此,HDFS具有高容错的特性,允许服务器发生故障。

高吞吐量。吞吐量是指单位时间内完成的工作量。HDFS实现了并行处理海量数据,大大缩短了处理时间,从而实现了高吞吐量。

存储数据种类多。HDFS可以存储任何类型的数据,如结构化的数据、非结构化数据、半结构化的数据。

可移植。HDFS可以实现不同平台之间的移植。

HDFS的缺点

高延时。HDFS不适用于延时敏感的数据访问。

不适合小文件存取场景。对Hadoop系统而言,小文件通常指远小于HDFS的数据块大小(128M)的文件,由于每个文件都会产生各自的元数据,Hadoop通过NameNode来存储这些信息,若小文件过多,容易导致NameNode存储出现瓶颈。

不适合并发写入。HDFS目前不支持并发多用户的写操作,写操作只能在文件末尾追加数据,

3.2 HDFS组成架构

对于HDFS架构来说,一个HDFS基本集群的节点主要包括:NameNode、DataNode、SecondaryNameNode。NameNode是名称节点,Master;DataNode是数据节点;SecondaryNameNode是辅助名称节点;Client是客户端。各部分的详细功能:

3.2.1 Client

Client:主要负责切分文件,与各节点进行交互。切分文件是把文件分割成数据块(Block)。数据块默认大小是128MB,每个数据块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认有3个副本)。交互包括与NameNode和DataNode进行交互,Client从NameNode获取文件的元数据,从DataNode读取数据并向DataNode写入数据。元数据是描述数据属性的数据。数据属性包括存储的位置、格式、权限、大小、历史版本等。

3.2.2 NameNode

NameNode:是HDFS架构中的主节点,管理节点(Master)。HDFS架构中只有一个NameNode。NameNode用于存储元数据以及处理客户端(client)发出的请求。元数据不是具体的文件内容,它包含3类重要信息。第1类是文件和目录自身的属性信息,如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等;第2类是文件内容存储的相关信息,如文件分块情况、副本个数、每个副本所在的DataNode信息等;第3类是HDFS中所有DataNode的信息,用于管理DataNode。

在NameNode中存放元数据的文件是fsimage(文件系统镜像)文件。在系统运行期间,所有对元数据的操作均保存在内存中,并被持久化到另一个文件edits(编辑日志文件)中。当NameNode启动时,fsimage文件将被加载至内存,再对内存里的数据执行edits文件中所记录的操作,以确保内存所保留的数据处于最新的状态。

主要负责:

  1. 管理HDFS的元数据;
  2. 配置副本策略;
  3. 管理数据快(Block)映射信息;
  4. 处理Client请求。
  5. 3.2.3 DataNode

DataNode是HDFS架构中的从节点(Slave)。是真正存储数据的地方,在DataNode中,文件以数据块的形式进行存储。数据文件在上传至HDFS时将根据系统默认的文件块大小被划分成一个个数据块,Hadoop3.x中一个数据块的大小为128MB,如果存储一个大小为129MB的文件,那么文件将被分为两个数据块进行存储。再将每个数据快存储至不同的或相同的DataNode中,并且备份副本,一般默认备份3个副本,NameNode负责记录文件的分块信息,确保在读取该文件时可以找到并整合所有该文件的数据块。

主要负责:

存储Client发来的数据块,执行数据块的读写操作;

定期汇报存储信息给NameNode(发送心跳信息)。

3.2.4 SecondaryNameNode

SecondaryNameNode:定期与NameNode通信,主要用来进行镜像备份,对NameNode中的edits文件与fsimage文件进行定期合并。镜像文件是指备份fsimage文件。

fsimage和edits:fsimage(镜像文件)和edits(日志文件)是NameNode中两个很重要的文件。fsimage是元数据镜像文件,内容是NameNode启动时对整个文件系统的快照(备份)。edits元数据操作日志,内容是每次保存fsimage之后至下次保存fsimage之前进行的所有HDFS操作。

随着HDFS操作的次数越来越多,edits文件也会越来越多,所占存储空间越来越大。如果NameNode出现故障,NameNode重启时,会先把fsimage文件加载到内存中,然后合并edits文件,edits文件占空间大会导致NameNode重启很耗时。对于实际操作来说,这是一个比较麻烦的问题。SecondaryNameNode对NameNode中的edits文件与fsimage文件进行定期合并,很好解决了这个问题,这也是HDFS高容错特点的一个表现。

合并edits文件和fsimage文件,SecondaryNameNode每隔1小时执行1次,可能会出现数据丢失问题。目前大部分企业采用Hadoop的HA(High Available,高可用)模式下备用的NameNode,对NameNode中的edits文件与fsimage文件进行实时合并。