HDFS核心概念、优缺点及其执行原理

大数据技术 潘老师 3年前 (2021-02-24) 1700 ℃ (0) 扫码查看

1.HDFS 的概念及体系结构

HDFS 是 Hadoop 自带的分布式文件系统,即 Hadoop Distributed File System。HDFS 是一个使用 Java 语言实现的分布式、可横向扩展的文件系统。

HDFS 包括一个名称节点(NameNode)和若干个数据节点(DataNode),属于主/从(Master/Slave)关系的结构模型。其中,名称节点负责管理文件系统的命名空间及客户端对文件的访问,也就是中心服务器

而集群中的数据节点一般是一个节点运行一个数据节点进程,其中每个数据节点上的数据实际上是保存在本地的 Linux 文件系统中,并在名称节点的统一调动下,负责处理文件系统客户端的读/写请求,或删除、创建和复制数据块等操作。

2.HDFS 的设计

HDFS 的设计主要是为了实现存储大量数据、成本低廉和容错率高、数据一致性,以及顺序访问数据这 4 个目标。

2.1.大数据

HDFS 适合存储大量文件,总存储量可以达到 PB/EB,单个文件一般在几百兆。

2. 2.基于廉价硬件,容错率高

Hadoop 并不需要运行在昂贵且高可靠的硬件上,其设计运行在商用廉价硬件的集群上,因此对于庞大的集群来说,节点发生故障的几率还是非常高的。HDFS 遇到上述故障时被设计成能够继续运行且可以不让用户察觉到明显的中断。

2.3.流式数据访问(一致性模型)

HDFS 的构建思路是这样的:一次写入、多次读取是最高效的访问模式。数据集通常由数据源生成或从数据源复制而来,接着长时间在此数据集上进行各种分析。 每次分析都将涉及该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。

2.4.顺序访问数据

HDFS 适用于处理批量数据,而不适合随机定位访问。

3.HDFS 的优点和缺点

3.1.HDFS 的优点

·高容错性:数据自动保存多个副本,副本丢失后自动恢复。
·适合批处理:移动计算而非数据,数据位置暴露给计算机框架。
·适合大数据处理:GB、TB,甚至 PB 级数据,百万规模以上的文件数量,10k+ 节点。
·可构建在廉价机器上:通过副本提高可靠性,提供了容错和恢复机制。

3.2.HDFS 的缺点

·不适合低延时数据访问:寻址时间长,适合读取大文件,低延迟与高吞吐率。
·不适合小文件存取:占用 NameNode 大量内存,寻找时间超过读取时间。
·并发写入、文件随机修改:一个文件只能有一个写入者,仅支持 append(日志),不允许修改文件。

4.HDFS 的执行原理

从客户端传入文件读写请求时,NameNode(HDFS 的集群管理节点)首先接受客户端的读写服务请求,并根据它保存的 Metadata 元数据,包括元数据的镜像文件(fsimage 和操作日志 edits 信息)和 DataNode(数据存储)通信并进行资源协调,Secondary NameNode 进行 edits 和 fsimage 的合并,同时 DataNode 之间进行数据复制。

如果要存储一个大文件,首先要将文件分割成块,分别放到不同的节点,每块文件都有 3 个副本备份,并且有一个专门记录文件块存放情况的元数据文件以备查询,如图 3.2 和图 3.3 所示。
HDFS核心概念、优缺点及其执行原理

5.HDFS 的核心概念

关于 HDFS 有以下核心概念,理解这些概念对于更好地了解 HDFS 的原理有很大帮助。

5.1.数据块(block)

每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位。HDFS 也有块的概念,在 HDFS 1.x 中默认数据块大小为 64MB,在 HDFS 2.x 中默认数据块大小为 128MB。 与单一磁盘上的文件系统相似,HDFS 上的文件也被划分成块大小的多个分块(chunk),作为独立的存储单元。但与面向单一的文件磁盘系统不同的是,HDFS 中小于一个块大小的文件不会占据整个块的空间(例如一个 1MB 的文件存储在一个 128MB 的块中时,文件只会使用 1MB 的磁盘空间,而不是 128MB)。

5.2.NameNode

NameNode 为 HDFS 集群的管理节点,一个集群通常只有一台活动的 NameNode,它存放了 HDFS 的元数据且一个集群只有一份元数据。NameNode 的主要功能是接受客户端的读写服务,NameNode 保存的 Metadata 信息包括文件 ownership、文件的 permissions,以及文件包括哪些 Block、Block 保存在哪个 DataNode 等信息。这些信息在启动后会加载到内存中。

5.3.DataNode

DataNode 中文件的储存方式是按大小分成若干个 Block,存储到不同的节点上,Block 大小和副本数通过 Client 端上传文件时设置,文件上传成功后副本数可以变更,BlockSize 不可变更。默认情况下每个 Block 都有 3 个副本。

5.4.SecondaryNameNode

SecondaryNameNode(简称 SNN),它的主要工作是帮助 NameNode 合并 edits,减少 NameNode 启动时间。SNN 执行合并时机如下:

·根据配置文件设置的时间间隔 fs.checkpoint.period,默认 3600 秒。 ·
·根据配置文件设置 edits log 大小 fs.checkpoint.size,规定 edits 文件的最大值默认是 64MB,如图 3.4 所示。
HDFS核心概念、优缺点及其执行原理

5.5. 元数据

元数据保存在 NameNode 的内存中,以便快速查询,主要包括 fsimage 和 edits。
fsimage:元数据镜像文件(保存文件系统的目录树)。
edits:元数据操作日志(针对目录树的修改操作)被写入共享存储系统中,比如 NFS、JournalNode,内存中保存一份最新的元数据镜像(fsimage+edits)。

查看fsimage和edits:

cd /usr/hadoop/hadoopdata/dfs/name/current
ls

HDFS核心概念、优缺点及其执行原理

6.HDFS 读文件流程

前面介绍了 HDFS 的核心概念,接下来介绍 HDFS 读写文件的流程。对于存储在 HDFS 上的文件,我们可以通过客户端发送读文件请求,主要步骤如下:

(1)客户端通过调用 FileSystem 对象的 open()方法打开要读取的文件,对于 HDFS 来说,这个对象是 DistributedFileSystem 的一个实例。

(2)DistributedFileSystem 通过使用远程过程调用(RPC)来调用 NameNode,以确定文件起始块的位置。

(3)对于每个块,NameNode 返回到存有该块副本的 DataNode 地址。此外,这些 DataNode 根据它们与客户端的距离来排序。如果该客户端本身就是一个 DataNode,那么该客户端将会从包含有相应数据块副本的本地 DataNode 读取数据。DistributedFileSystem 类返回一个 FSDataInputStream 对象给客户端并读取数据,FSDataInputStream 转而封装 DFSInputStream 对象,该对象管理着 DataNode 和 NameNode 的 I/O。接着,客户端对这个输入流调用 read()方法。

(4)存储着文件起始几个块的 DataNode 地址的 DFSInputStream,接着会连接距离最近的文件中第一个块所在的 DataNode。通过对数据流的反复调用 read()方法,实现将数据从 DataNode 传输到客户端。

(5)当快到达块的末端时,DFSInputStream 会关闭与该 DataNode 的连接,然后寻找下一个块最佳的 DataNode。

(6)当客户端从流中读取数据时,块是按照打开的 DFSInputStream 与 DataNode 新建连接的顺序进行读取的。它也会根据需要询问 NameNode 从而检索下一批数据块的 DataNode 的位置。一旦客户端完成读取,就对 FSDataInputStream 调用 close()方法,如图 3.5 所示。
HDFS核心概念、优缺点及其执行原理

7.HDFS 写文件流程

对于存储在 HDFS 上的文件也可以写入内容,可以通过客户端发送写文件的请求,主要步骤如下:

(1)客户端调用 DistributedFileSystem 对象的 create()方法新建文件。

(2)DistributedFileSystem 会对 NameNode 创建一个 RPC 调用,在文件系统的命名空间中创建一个新文件,需要注意的是,此刻该文件中还没有相应的数据块。

(3)NameNode 通过执行不同的检查来确保这个文件不存在而且客户端有新建该文件的权限。如果这些检查都通过了,NameNode 就会为创建新文件写下一条记录;反之,如果文件创建失败,则向客户端抛出一个 IOException 异常。

(4)随后 DistributedFileSystem 向客户端返回一个 FSDataOutputStream 对象,这样客户端就可以写入数据了。和读取事件类似,FSDataOutputStream 封装一个 DFSOutputStream 对象,该对象会负责处理 DataNode 和 NameNode 之间的通信。在客户端写入数据的时候,DFSOutputStream 将它分成一个个的数据包,并且写入内部队列,被称之为「数据队列」(data queue)。

(5)DataStream 处理数据队列,它的任务是选出适合用来存储数据副本的一组 DataNode,并据此要求 NameNode 分配新的数据块。这一组 DataNode 会构成一条管线,DataStream 会将数据包流式传输到管线中的第一个 DataNode,然后依次存储并发送给下一个 DataNode。

(6)DFSOutPutStream 也维护着一个内部数据包队列来等待 DataNode 的收到确认回执,称为「确认队列」(ask queue)。收到管道中所有 DataNode 确认信息后,该数据包才会从确认队列删除。

(7)客户端完成数据的写入后,会对数据流调用 close()方法,如图 3.6 所示。
HDFS核心概念、优缺点及其执行原理

8.Block 的副本放置策略

HDFS 中的文件作为独立的存储单元,被划分为块(block)大小的多个分块(chunk),在 Hadoop 2.x 中默认值为 128MB。当 HDFS 中存储小于一个块大小的文件时不会占据整个块的空间,也就是说,1MB 的文件存储时只占用 1MB 的空间而不是 128MB。HDFS 的容错性也要求数据自动保存多个副本,副本的放置策略如图 3.7 所示。
HDFS核心概念、优缺点及其执行原理

第 1 个副本:放置在上传文件的 DN;如果是集群外提交,则随机挑选一台磁盘不太满、CPU 不太忙的节点。

·第 2 个副本:放置在与第 1 个副本不同机架的节点上。

·第 3 个副本:放置在与第 2 个副本相同机架的节点上。

·更多副本:随机节点。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/bigdata/1927.html
喜欢 (3)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】