互联网技术 / 互联网资讯 · 2023年12月2日 0

HDFS架构设计原理

前言

自Hadoop问世以来,已经历时超过十年,版本也经过了多次更新。目前,业界普遍将Hadoop分为三个主要版本:Hadoop 1.0、Hadoop 2.0和Hadoop 3.0。

一、Hadoop 概述

Hadoop最初的设计目的是为了解决两个关键问题:一是如何存储海量数据,二是如何处理海量数据。Hadoop的核心组件包括HDFS和MapReduce。其中,HDFS负责数据的存储,而MapReduce则处理数据的计算。HDFS的全称是Hadoop分布式文件系统。

二、分布式文件系统

HDFS是如何设计架构的?

HDFS可以被看作一个分布式文件系统。如图1所示,四台服务器各自拥有自己的文件系统,可以存储数据。假设每台服务器的存储空间为10G,当数据量较小的时候,存储10G的数据是可行的。然而,一旦数据量超过单台服务器的存储能力,我们就需要在这些服务器上部署Hadoop,从而构建一个集群。这样,四台服务器的总存储容量将达到40G,用户在访问时将看到一个统一的、强大的分布式文件系统。

HDFS采用主从架构,主节点为NameNode,多个从节点为DataNode。

三、HDFS架构

HDFS是如何设计架构的?

假设我们有五台服务器,每台服务器上都部署了Hadoop。我们可以选择其中一台作为NameNode,其余服务器作为DataNode。

在客户端上传文件时,假设文件大小为129M,HDFS默认的切分大小为128M,因此将会生成两个块。NameNode负责通知DataNode进行文件上传(此过程遵循一定的策略)。假设这几个文件分别存储在四台服务器上,这样即便某个DataNode服务器发生故障,数据仍可通过其他DataNode进行访问,从而避免数据丢失。

NameNode

负责管理元数据信息,包括文件目录树、文件与块之间的关系以及块与DataNode主机的关系。为了快速响应用户请求,NameNode将元数据信息加载到内存中。

DataNode

用于存储数据,将上传的数据划分为固定大小的文件块(Block)。在Hadoop 2.7之前,块大小为64M,之后更改为128M。为了确保数据安全,每个文件默认为存储三个副本。

SecondaryNameNode

定期从NameNode拉取Edit和fsimage文件,并将这两个文件合并生成新的fsimage,然后发送给NameNode。

四、HDFS写入数据流程

客户端会携带文件路径向NameNode发送写入请求,并通过RPC与NameNode建立通信。NameNode检查目标文件后,返回上传的可行性;客户端请求第一个块的存储DataNode;NameNode根据副本数量和存储策略分配节点,并返回DataNode节点,如A、B、C。客户端请求A节点建立管道,A节点将请求转发给B,B再转发给C,从而形成完整的管道,逐级返回消息给客户端。客户端在收到A的确认后开始向A上传第一个块,块被分割成64K的包,通过管道传递到B和C进行存储。当一个块传输完成后,客户端继续请求NameNode上传下一个块,重复此过程。所有块传输完成后,客户端调用FSDataOutputStream的close方法关闭输出流,并最终调用filesystem的complete方法告知NameNode数据写入成功。

五、HDFS读取数据流程

客户端首先带着读取路径向NameNode发送请求,并通过RPC与NameNode建立通信。NameNode检查目标文件,以确定请求的块位置信息。根据情况,NameNode会返回文件的部分或全部块列表,并为每个块返回包含该块副本的DataNode地址。这些DataNode地址会根据集群拓扑结构进行排序,排序规则为:网络拓扑结构中距离客户端较近的排在前面;心跳机制中超时报告状态为过时的DataNode排在后面。客户端选取排序靠前的DataNode,调用FSDataInputStream的Read方法读取块数据。如果客户端本身也是DataNode,则会直接从本地获取数据。当读取完一批块后,如果文件尚未读取完,客户端将继续向NameNode请求下一批块列表,直至所有块读取完成。最后,客户端调用FSDataInputStream.close()方法关闭输入流,并将读取的所有块合并为完整的最终文件。

六、HDFS的缺陷

注意:早期版本存在单点问题,且内存受限。

总结