HDFS介绍

85 阅读6分钟

一、定义

一个高可靠、高吞吐量的分布式文件系统。对于HDFS而言,他具有数据切割、制作副本、分散存储数据的能力。

相关概念

  1. HDFS数据块

  1. MapReduce基本原理

通过 HDFS 我们解决了分布式存储的问题,下面我们再来看一下 Hadoop 的另一个重要组成部分 MapReduce。

MapReduce 主要用来解决分布式计算的问题,它的第一个核心思想是 分治法,就是将一个大的任务分成若干个相同的小任务,完成这些小的任务就相当于完成了这个大的任务。

第二个思想是 移动计算 而不是移动数据,这个思想我们在前边介绍 HDFS 的设计思想时也提过,目的是为了尽量让计算本地化。

第三个思想就是容忍部分 节点故障,这个我们在 HDFS 部分也介绍过,在大规模集群在下硬件故障是非常普遍的事情,所以我们的计算框架层面一定要能够容忍这种部分节点的故障。

基于这三个基本思想我们可以看一下这面这个具体的例子:假如我们想要统计一篇文章中各个单词出现的频率,我们要怎么来实现呢?在不考虑大数据量的情况下,我们可以写一个简单的脚本就能实现,现在我们假设想要按照下面示例的伪代码

的方法分布两个步骤来实现。




二、组成

HDFS 的整体架构如图所示。HDFS 内部分为了两种角色:一种角色叫做 NameNode,另一种角色叫做 DataNode。在一个典型的 HDFS 集群当中,一般会有一个工作的 NameNode 和多个工作的 DataNode,所以它是一个典型的主从架构

NameNode 会维护所有的元数据,这些元数据主要是指的是 HDFS 文件名、目录结构以及每个 HDFS 文件对应的文件块的真实存储位置等信息。

DataNode 节点一般在每台存储服务器上都会部署一个,主要负责管理存储在这台服务器上的文件的读写。比如说当我们去读取一个文件的时候,我们先去 NameNode 上请求文件的位置,再去对应的 DataNode 节点上读取实际的文件数据。写文件的时候也是类似,我们先请求 NameNode 分配对应的 DataNode 节点和位置信息,然后再去 DataNode 节点上写入数据。

这里还有一个概念是机架,在一个大的 HDFS 集群中,读写数据都会考虑机架的影响,因为同一个机架往往对应着同一个交换机,如果读文件的时候,在同机架的机器上进行读取就会减少中间的网络传输。

HDFS读文件的过程

如图所示,当我们使用 HDFS 读取文件的时候,我们的客户端要做 1、3、6 这三个步骤。第 1 步,我们使用 open 操作打开一个文件;然后第 3 步使用 read 操作读取文件的内容;等我们读取完文件的内容之后,我们在第 6 步使用 close 操作关闭文件。从使用者的角度来看,这和读取一个本地文件几乎没有任何区别,但是背后的执行过程是完全不同的。当第 1 步 open 操作执行之后,HDFS 客户端就会向 NameNode 发起一个请求去获取指定文件的实际存储位置信息,当 read 操作发起之后,HDFS 就会直接去访问对应的 DataNode 的数据,这时候就不再需要和 NameNode 打交道了,读取文件的时候,因为数据可能存储在多个 DataNode 上,客户端会依次从多个 DataNode 节点上读取数据。读取完成之后我们会将文件管道 close 掉,这时候一个完整的 HDFS 文件读取过程就完成了。

HDFS写文件的过程

我们再来看一下 HDFS 写文件的过程,和读文件比较类似,写文件的时候从操作者的角度看也是分成 3 步。第 1 步,我们执行 create 操作创建一个文件。然后第 2 步,我们执行 write 操作不停的写入文件内容。第 3 步,在我们写入完成之后执行 close 操作将整个管道关闭。

后面实际发生了哪些事情呢?

首先客户端会向 NameNode 发起一个请求,NameNode 会检查客户端是否拥有相应的权限,检查通过后会分配相应的 DataNode 以及对应的位置信息,告诉客户端去哪里存储文件,客户端获取到这些信息之后,就会去对应的 DataNode 节点上写文件,在第一个 DataNode 节点上写完一个文件块之后,第一个 DataNode 节点还会把数据同步给第二个 DataNode 节点,同样的第二个节点还会把数据同步给第三个 DataNode 节点。

等数据写完之后,第三个节点会将确认消息回传给第二个节点,第二个节点回传给第一个节点,第一个节点将最终的确认消息回传给客户端确认数据写入完成。客户端会再向 NameNode 发送一个消息,告诉 NameNode 去更新相应的元数据信息。

这里为了保证数据的高可用,HDFS 也做了很多的容错机制,核心机制是副本机制。副本机制会保证默认情况下所有的数据都会按照 3 副本的方式进行存储,而且副本的存储位置也很有讲究,第一个节点一般会选择在客户端所在的机器存储第一个副本;然后选择和第一个节点在同一个机架上的另外一个节点上面存储第二个副本;最后选择和前两个节点在不同机架上的节点存储第三个副本。

这种选择一方面是考虑了存储数据的效率,另一方面也是为了尽可能的兼顾不同副本的可用性。另外 HDFS 在写文件的时候还会在本地提供 checksum 校验码机制,只有当所有节点上的数据的校验码一致才会认为数据被写入成功了,从而保证写入过程中的可用性。




三、特点

  1. 数据高可用性

  2. HA能力

  3. 错误检测和自动恢复机制




四、部署