Apache Hadoop HDFS体系结构

Apache Hadoop HDFS体系结构

介绍:

在这个博客中,我将讨论Apache Hadoop HDFS体系结构。从我之前的博客中,您已经知道HDFS是一个分布式文件系统,部署在低成本的商品硬件上。所以,这是我们应该采取深入了解的Apache Hadoop的HDFS架构和解开它的美丽的时候了。

Apache Hadoop HDFS体系结构的这个博客将涉及的主题如下:

HDFS架构:

Apache Hadoop HDFS体系结构

Apache HDFS  或  Hadoop分布式文件系统  是一个块结构的文件系统,其中每个文件被划分为预定大小的块。这些块存储在一个或多个机器的集群中。Apache Hadoop HDFS体系结构遵循  主/从体系结构,其中一个群集由单个NameNode(主节点)组成,其他所有节点都是DataNode(从节点)。HDFS可以部署在广泛的支持Java的机器上。尽管可以在单台机器上运行多个DataNode,但在实际应用中,这些DataNode分布在各种机器上。

的NameNode:

Apache Hadoop HDFS体系结构

NameNode是Apache Hadoop HDFS体系结构中的主节点,用于维护和管理DataNode(从节点)上存在的块。NameNode是一个高度可用的服务器,用于管理文件系统名称空间并控制客户端对文件的访问。我将在下一篇博客中讨论Apache Hadoop HDFS的高可用性功能。HDFS体系结构的构建方式是,用户数据永远不会驻留在NameNode上。数据仅驻留在DataNode上。  

NameNode的功能:

  • 它是维护和管理DataNode(从节点)的主守护进程,
  • 它记录存储在集群中的所有文件的元数据,例如存储块的位置,文件的大小,权限,层次结构等。有两个文件与元数据相关联:
    • FsImage:  它包含自NameNode开始以来文件系统名称空间的完整状态。
    • EditLogs:  它包含了最近对文件系统进行的所有关于最近的FsImage的修改。
  • 它记录对文件系统元数据发生的每个更改。例如,如果一个文件在HDFS中被删除,NameNode会立即在EditLog中记录这个文件。
  • 它定期收到来自集群中所有DataNode的Heartbeat和Block报告,以确保DataNode处于活动状态。
  • 它保留了HDFS中所有块的记录以及这些块所在的节点。
  • 名称节点还负责采取照顾  复制因子 所有这些,我们将较详细的HDFS教程博客后面讨论的块。
  • 在  DataNode失败的情况下,NameNode为新副本选择新的DataNode, 平衡 磁盘使用并管理到DataNode的通信流量。

数据节点:

DataNode是HDFS中的从节点。与NameNode不同的是,DataNode是一种商品硬件,也就是一个不昂贵的系统,它不具有高质量或高可用​​性。DataNode是将数据存储在本地文件ext3或ext4中的块服务器。

DataNode的功能:

  • 这些是从属守护进程或在每个从属机器上运行的进程。
  • 实际的数据存储在DataNode上。
  • DataNode执行文件系统客户端的低级读写请求。
  • 他们定期发送心跳到NameNode来报告HDFS的总体健康状况,默认情况下,这个频率设置为3秒。

到目前为止,您一定意识到NameNode对我们来说非常重要。如果失败了,我们就注定了。但是别担心,我们将讨论Hadoop如何解决下一个Apache Hadoop HDFS体系结构博客中的单点故障问题。所以,现在就放松一下,让我们一步一个脚印吧。

次要名称节点:

除了这两个守护进程之外,还有第三个守护进程或称为第二个NameNode的进程。Secondary NameNode与主NameNode同时作为助手守护进程工作。不要混淆Secondary NameNode作为备份NameNode,因为它不是。

Apache Hadoop HDFS体系结构

Secondary NameNode的功能:

  • Secondary NameNode是一个不断读取NameNode的RAM中的所有文件系统和元数据并将其写入硬盘或文件系统的节点。
  • 它负责将EditLogs  和NameNode中的FsImage结合起来。 
  • 它会定期从NameNode下载EditLogs并应用于FsImage。新的FsImage被复制回NameNode,NameNode在下次启动时使用。

因此,Secondary NameNode在HDFS中执行常规检查点。因此,它也被称为CheckpointNode。

成为HDFS专家!

块:

现在, 因为我们知道,在HDFS的数据被分散在作为的DataNodes块。让我们看看什么是块,它是如何形成的?

块是硬盘上存储数据的最小连续位置。通常,在任何文件系统中,都将数据存储为块的集合。同样,HDFS将每个文件存储为遍布Apache Hadoop集群的块。Apache Hadoop 2中每个块的默认大小为128 MBx(Apache Hadoop 1.x中为64 MB ),您可以按照您的要求进行配置。

Apache Hadoop HDFS体系结构

HDFS中没有必要将每个文件存储在配置块大小(128 MB,256 MB等)的确切倍数中。我们举一个例子,其中有一个大小为514 MB的文件“example.txt”,如上图所示。假设我们使用块大小的默认配置,即128 MB。那么,多少块会被创建?5,对。所述˚F IRST 四个块将是128 MB。但是,最后一个块将只有2 MB大小。

现在,你一定在想为什么我们需要有这么大的块大小,即128 MB?

那么,每当我们谈论HDFS的时候,我们都会谈论巨大的数据集,即TB级和PB级的数据。所以,如果我们有4 KB的块大小,就像在Linux文件系统中一样,我们会有太多的块,因此太多的元数据。所以,管理这些没有。块和元数据,将创造巨大的开销这是一件好事,我们不想要的。 

复制管理:

HDFS提供了一种可靠的方式来将大数据作为数据块存储在分布式环境中。块也复制提供容错。默认的复制因子是3,可以再次配置。因此,如下图所示,每个块被复制三次并存储在不同的DataNode中(考虑默认的复制因子): Apache Hadoop HDFS体系结构

因此,如果使用默认配置在HDFS中存储128 MB的文件,则最终将占用384 MB(3 * 128 MB)的空间,因为块将被复制三次,每个副本将驻留在不同的DataNode。 

注意: NameNode定期从DataNode收集块报告以维护复制因子。因此,每当块被过度复制或被复制时,NameNode会根据需要删除或添加副本。 

机架意识:

Apache Hadoop HDFS体系结构

总而言之,让我们来进一步讨论HDFS如何放置副本以及什么是机架感知?同样,NameNode也确保所有副本不存储在同一个机架或单个机架上。它遵循内置的机架感知算法来减少延迟并提供容错功能。考虑到复制因子是3,机架感知算法认为块的第一个副本将被存储在本地机架上,接下来的两个副本将被存储在不同的(远程)机架上,但是在不同的DataNode中(远程)机架,如上图所示。如果有更多的副本,其余的副本将放置在随机的DataNode上,如果可能的话,提供不超过两个副本驻留在同一个机架上。

这就是实际的Hadoop生产集群的外观。在这里,你有多个机架填充DataNode:

 Apache Hadoop HDFS体系结构

机架感知的优势:

那么,现在你会想到为什么我们需要Rack Awareness算法?原因是:

  • 提高网络性能:驻留在不同机架上的节点之间的通信是通过交换机进行的。一般情况下,在同一机架中的机器之间的网络带宽要比驻留在不同机架的机器之间的带宽要大。因此,机架感知可以帮助您减少不同机架之间的写入流量,从而提供更好的写入性能。而且,由于您使用多个机架的带宽,您将获得更高的读取性能。
  • 为了防止数据丢失:即使由于交换机故障或电源故障导致整个机架出现故障,我们也不必担心数据。如果你仔细想一想,那就是说,不要把所有的鸡蛋都放在同一个篮子里。

查看我们的Hadoop课程

HDFS读/写架构:

现在让我们来讨论如何在HDFS上执行数据读/写操作。HDFS遵循“一次写入 - 读许多哲学”。所以,你不能编辑已经存储在HDFS中的文件。但是,您可以通过重新打开文件来附加新的数据。

HDFS写入架构:

假设一个HDFS客户端想写一个名为“example.txt”的文件,大小为248 MB。

Apache Hadoop HDFS体系结构

假定系统块大小配置为128 MB(默认)。因此,客户端将文件“example.txt”分成两个块 - 128MB(块A)和120MB(块B)中的一个。 

现在,每当将数据写入HDFS时,将遵循以下协议:

  • 首先,HDFS客户端将与NameNode进行联系,以获得针对两个块(例如,块A和块B)的写入请求。
  • 然后,NameNode将授予客户端写入权限,并将提供将最终复制文件块的DataNode的IP地址。
  • DataNode的IP地址的选择是基于我们前面讨论的可用性,复制因素和机架感知的纯粹随机化。
  • 假设复制因子被设置为默认值,即3.因此,对于每个块,NameNode将向客户端提供(3)DataNode的IP地址的列表。该列表对于每个块将是唯一的。
  • 假设NameNode为客户端提供了以下IP地址列表: 
    • 对于数据块A,列表A = {数据节点1的IP,数据节点4的IP,数据节点6的IP}
    • 对于Block B,设置B = {DataNode 3的IP,DataNode 7的IP,DataNode 9的IP}
  • 每个块将被复制到三个不同的DataNode中,以保持复制因子在整个群集中保持一致。
  • 现在整个数据复制过程将分三个阶段进行:

Apache Hadoop HDFS体系结构

  1. 管道的设置
  2. 数据流和复制
  3. 管道关闭(确认阶段) 

1.管道设置:

在写入块之前, 客户端确认每个IP列表中的DataNode是否准备好接收数据。 这样做时,客户端通过连接该块的各个列表中的各个DataNode来为每个块创建一个管道。让我们考虑块A.由NameNode提供的DataNode的列表是

对于块A,列表A = {数据节点1的IP,数据节点4的IP,数据节点6的IP}。 

Apache Hadoop HDFS体系结构

因此,对于块A,客户端将执行以下步骤来创建管道:

  • 客户端将选择DataNode 1的列表中的第一个DataNode(数据节点A的数据节点IP),并建立TCP / IP连接。
  • 客户端将通知DataNode 1准备好接收该块。它还将提供接下来两个DataNode(4和6)的IP给应该被复制块的DataNode 1。
  • 数据节点1将连接到数据节点4.数据节点1将通知数据节点4准备好接收数据块,并将其给予数据节点6的IP。然后,数据节点4将告诉数据节点6准备好接收数据。
  • 接下来,准备就绪的确认将遵循相反的顺序,即从DataNode 6到4,然后到1。
  • DataNode 1最后会通知客户端所有的DataNode已经准备就绪,并且在客户端DataNode 1,4和6之间将形成一个流水线。
  • 现在流水线设置完成,客户端将最终开始数据复制或流式处理。

2.数据流:

由于管道已经创建,客户端将把数据推送到管道中。现在,不要忘记,在HDFS中,数据是基于复制因子进行复制的。所以,这里假设复制因子是3,块A将被存储到三个DataNode中。向前移动,客户端将只将块(A)复制到DataNode 1。复制总是由DataNode按顺序完成。

Apache Hadoop HDFS体系结构

因此,在复制过程中将执行以下步骤:

  • 一旦块被客户端写入数据节点1,数据节点1将连接到数据节点4。
  • 然后,DataNode 1将会推送管道中的数据块,数据将被复制到DataNode 4。
  • 同样,DataNode 4将连接到DataNode 6,并将复制块的最后一个副本。

3.关闭管道或确认阶段:

一旦块被复制到所有三个DataNode中,就会发生一系列确认,确保客户端和NameNode确认数据已成功写入。然后,客户端将最终关闭管道来结束TCP会话。

如下图所示,确认以相反的顺序发生,即从DataNode 6到4,然后到1.最后,DataNode 1将三个确认(包括它自己的)推送到流水线并发送给客户端。客户端将通知NameNode数据已成功写入。NameNode将更新其元数据,客户端将关闭管道。

Apache Hadoop HDFS体系结构

类似地,块B也将被复制到与块A并行的DataNode中。因此,下面将注意到以下事项:

  • 客户端将块A和嵌段B复制到第一数据节点同时
  • 因此,在我们的情况下,将为每个区块形成两条管线,上述所有过程将在这两条管线中并行发生。
  • 客户端将数据块写入第一个数据节点,然后DataNode将依次复制数据块。

Apache Hadoop HDFS体系结构

如上图所示,每个块(A和B)都有两条流水线。以下是各个管道中每个区块正在进行的操作流程:

  • 对于方框A:1A - > 2A - > 3A - > 4A
  • 对于块B:1B→2B→3B→4B→5B→6B 

HDFS读取架构:

HDFS读取架构比较容易理解。我们再来看看上面的例子,HDFS客户端现在想要读取文件“example.txt”。

Apache Hadoop HDFS体系结构

现在,下面的步骤将在阅读文件时发生:

  • 客户端将与NameNode联系,询问文件“example.txt”的块元数据。
  • NameNode将返回存储每个块(块A和块B)的DataNode列表。
  • 在那个客户端之后,将连接到存储块的DataNode。
  • 客户端开始从DataNode并行读取数据(DataNode 1的Block A和DataNode 3的Block B)。
  • 一旦客户端获得了所有必需的文件块,它将把这些块组合起来形成一个文件。

在提供客户端的读取请求时,HDFS选择最接近客户端的副本。这减少了读取延迟和带宽消耗。因此,如果可能,选择与阅读器节点位于同一机架上的副本。

现在,您应该对Apache Hadoop HDFS体系结构有一个很好的想法。我知道这里有很多信息,可能并不容易。我建议你再来一遍,我相信你会发现这一次更容易。现在,在我的下一篇博客中,我将讨论Apache Hadoop HDFS联合和高可用性体系结构。

原文地址:https://www.edureka.co/blog/apache-hadoop-hdfs-architecture/