Hadoop HDFS文件系统介绍

hadoop介绍当中我们知道了HDFS文件系统是为hadoop生态圈提供基础存储服务的一个分布式文件系统,HDFS全称Hadoop Distributed File System。它是一个基于Java开发的分布式文件系统,用于在hadoop集群的多个节点上存储大数据量文件。

HDFS是一个主-从(master-slave)架构,一个hadoop集群中HDFS只能有一个Namenode和多个Datanode组成,这两类节点分工明确:

1、NameNode(名字节点):HDFS系统中只有一个,是一个中心服务器角色,负责管理构建HDFS的名字空间(namespace),比如打开、关闭、重命名文件或目录;管理和检索多个DataNode的实际数据所需的所有元数据。

2、DataNode(数据节点):HDFS集群中一般是一个集群节点有一个Datanode,负责管理它所在节点上的存储。在Namenode的统一调度下进行数据块的创建、删除和复制。

HDFS当做一个整体对外暴露文件系统的名字空间,用户可以以文件的形式在上面存储数据。但是从HDFS集群内部把一个文件分解成一个或者多个数据块,存储在一组的Datanode节点上。

下面是Hadoop官方提供的HDFS框架图:

Hadoop HDFS文件系统介绍


HDFS文件的读写过程

hdfs读过程,如下图:

Hadoop HDFS文件系统介绍

1、客户端发送读取文件请求,首先要用HDFS API的open方法,发送请求到Namenode节点,通过Namenode节点获取到文件的块存储的位置(在哪几个datanode上面)。

2、Namenode返回所有block的位置信息,并将这些信息返回给客户端。这里为啥先访问Namenode,虽然Datanode存放文件的块信息,但是文件块的具体位置信息是存放在Namenode上。

3、客户端拿到block的位置信息后调用HDFS API的read方法并行的读取block信息,图中4和5流程是并发的,HDFS默认block存储在三个DataNode节点上,所以每一个block只需要从一个副本读取即可。

4、datanode把结果数据返回给客户端。

hdfs写过程,如下图:

Hadoop HDFS文件系统介绍

1、客户端发送请求,调用HDFS API的create方法到Namenode,create的入参有上传的文件名,文件大小,文件拥有者。

2、然后Namenode根据上传的文件大小切成多个block块,存储复制到多个Datanode上,并将存储的信息和位置信息返回给客户端。

3、然后客户端调用 HDFS的 write方法将block块写入对应的Datanode上,这里要注意的是hdfs的块是有副本的,默认是3个副本,并不是由客户端一次写入到3个副本当中,而是有block块所在的Datanode产生新的线层进行副本的复制。

4、写完后返回给客户端一个信息,然后客户端再将信息反馈给namenode。


HDFS设计原则

HDFS设计之初就有非常明确的应用场景,适用于什么类型的应用,不适用于什么情景,有一个相对明确的指导的设计原则。

适用:

1、高容错性环境:数据会自动保存多个副本,副本就算丢失,也能够自动回复。

2、适合批处理:可以进行快速的分布式计算,移动计算。

3、适合大数据量的处理:GB/TB级别的数据或百万规模以上文件数量。

4、流式文件的访问:一致性写入,多次读取。

5、可搭建在廉价的机器上,通过分布式集群提高性能,通过高容错性和可靠性的模型框架提供恢复机制。

不适用:

1、数据访问实时性较高的应用场景,对延时要求在毫秒级的应用,不适合采用HDFS进行存储。

2、大量小文件,因为HDFS整个文件系统的文件数量受限于Namenode的内存大小。如果文件过多,比如100万个文件,每个文件占用一个文件块(大小150字节),则最少需要300M的内存。因此上亿级别的文件数量在现有的服务器上难以支持。

3、多方写入,需要在任意的文件上进行修改的应用场景,HDFS采用的是追加方式写入数据,是不支持修改操作的。