HDFS架构

Apache Hadoop的HDFS架构

介绍:

在这个博客中,我将讨论Apache Hadoop HDFS架构。HDFS和YARN是Hadoop认证中需要掌握的两个重要概念。从我之前的博客中,您已经知道HDFS是一个分布式文件系统,它部署在低成本的商品硬件上。因此,现在是我们深入研究Apache Hadoop HDFS架构并发掘其魅力的时候了。

本博客中有关Apache Hadoop HDFS体系结构的主题如下:

HDFS架构:

HDFS拓扑-Apache Hadoop HDFS体系结构-Edureka

Apache HDFS Hadoop分布式文件系统是一个块结构的文件系统,其中每个文件都被划分为预先确定大小的块。这些块存储在一个或多个机器组成的集群中。Apache Hadoop HDFS体系架构遵循主/从体系结构,其中集群由单个Name Node(主节点)和所有其他节点(从节点)组成。HDFS可以部署在支持JAVA的多种机器上。虽然可以在一台机器上运行多个Data Node,但是在实际世界中,这些Data Node分布在不同的机器上。

NameNode:

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中的所有块以及这些块所在的节点。
  • NameNode还负责处理所有块的复制因子,稍后我们将在这个HDFS教程博客中详细讨论这个问题。
  • 在DataNode失败的情况下,NameNode为新的副本选择新的DataNode,平衡磁盘使用,并管理到DataNode的通信流量。

DataNode(数据节点):

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

DataNode的功能:

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

到现在为止,你一定已经意识到NameNode对我们来说非常重要。如果失败了,我们就完了。但是不要担心,我们将在下一篇Apache Hadoop HDFS架构博客中讨论Hadoop如何解决这个单点故障问题。所以,现在先放松一下,让我们一步一步来。

Secondary NameNode(次主节点):

除了这两个守护进程之外,还有第三个守护进程或称为辅助NameNode的进程。Secondary NameNode作为辅助守护进程与主NameNode并发工作。不要把Secondary NameNode误认为是NameNode的备份,因为它并不是。

Secondary NameNode的功能:

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

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

Blocks(块):

现在,我们知道HDFS中的数据以块的形式分散在各个datanode中。让我们看看什么是块,它是如何形成的。

块只是硬盘上存储数据的最小连续位置。通常,在任何文件系统中,都将数据存储为块的集合。同样地,HDFS将每个文件存储为分散在Apache Hadoop集群中的块。在Apache Hadoop 2中,每个块的默认大小是128 MB。2.x  (Apache Hadoop 1.x中的64 MB),可以根据需要配置。

在HDFS中,每个文件的存储大小不一定是所配置块大小的精确倍数(128 MB、256 MB等)。举一个例子,我有一个文件example.txt,大小为514 MB,如上图所示。假设我们使用默认的块大小配置,即128 MB,那么将创建多少块? 5块,对吧。前4个块的大小为128 MB,但最后一个块的大小只有2 MB。

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

当我们谈到HDFS时,我们谈到的是巨大的数据集,即tb级和pb级的数据。因此,如果我们的块大小是4 KB,就像在Linux文件系统中那样,那么我们就会有太多的块,因此也就有太多的元数据。因此,管理这些块和元数据将产生巨大的开销,这是我们不希望发生的事情。

当你理解了什么是块之后,让我们在HDFS体系结构的下一节中了解如何复制这些块。同时,你可以查看这个关于HDFS架构的视频教程,其中详细讨论了所有的HDFS架构概念。https://youtu.be/m9v9lky3zcE

Replication Management(复制管理):

HDFS提供了一种以数据块的形式在分布式环境中存储大量数据的可靠方法,还复制这些块以提供容错能力。默认的复制因子是3,这也是可配置的。因此,如下图所示,每个块复制三次并存储在不同的datanode上(考虑默认的复制因子)

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

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

Rack Awareness(机架感知):

好了,让我们继续了解更多关于HDFS如何放置副本和什么是机架感知?同样,NameNode还确保所有的副本不会存储在同一个机架上或单个机架上。它遵循一个内置的机架感知算法,以减少延迟,并提供容错。考虑到复制因子是3,机架感知算法表示,块的第一个副本将存储在本地机架上,而另外两个副本将存储在另一个(远程)机架上,但是存储在(远程)机架上的不同的DataNode上,如上图所示。如果您有更多的副本,那么其余的副本将被放置在随机的datanode上,前提是同一机架上不超过两个副本(如果可能的话)。

这就是实际的Hadoop生产集群的样子。在这里,您有多个装有DataNode的机架。

机架感知的优势:

所以,现在你会想为什么我们需要机架感知算法?原因是:

  • 提高网络性能:位于不同机架上的节点之间的通信通过交换机进行。通常,你会发现位于同一机架上的计算机之间的网络带宽比位于不同机架上的计算机之间的网络带宽大。因此,机架感知可以帮助减少不同机架之间的写流量,从而提供更好的写性能。另外,由于使用了多个机架的带宽,我们将获得更高的读取性能。
  • 防止数据丢失:即使整个机架由于开关故障或电源故障而失效,我们也不必担心数据丢失。如果你仔细想想,就会发现这是有道理的,就像人们常说的,不要把所有的鸡蛋放在一个篮子里。

HDFS读/写架构:

现在让我们讨论如何在HDFS上执行数据读/写操作。HDFS遵循写一次读多的原则。因此,不能对已经存储在HDFS中的文件进行编辑。但是,可以通过重新打开文件来附加新数据。

HDFS写架构:

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

假设系统块大小配置为128 MB(默认)。因此,客户机将把example.txt文件分成两个块,一个是128 MB(块A),另一个是120 MB(块B)。

现在,无论何时将数据写入HDFS,都将遵循以下协议:

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

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

1.管道设置:

在写入块之前,客户端确认每个ip列表中的Data Node是否准备好接收数据。在此过程中,客户端通过连接每个块的相应列表中的各个Data Node来为每个块创建一个管道。让我们参考块A。NameNode提供的datanode列表是:

对于块A,列表A = {DataNode 1的IP, DataNode 4的IP, DataNode 6的IP。

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

  • 客户端将在列表(A块的DataNode IPs)中选择第一个DataNode,即DataNode 1,并建立一个TCP/IP连接。
  • 客户端将通知DataNode 1准备接收数据块。它还将为DataNode 1提供下两个DataNode(4和6)的ip,在DataNode 1中复制块。
  • DataNode 1将连接到DataNode 4。DataNode 1将通知DataNode 4准备接收块,并将DataNode 6的IP给它。然后,DataNode 4将告诉DataNode 6准备接收数据。
  • 接下来,确认准备就绪将遵循相反的顺序,即从DataNode 6到4,然后到1。
  • 最后,DataNode 1将通知客户端所有的DataNode都准备好了,并在客户端DataNode 1、DataNode 4和DataNode 6之间形成一个管道。
  • 现在管道设置完成,客户端将最终开始数据复制或流处理。

2.数据流

在创建管道之后,客户端将把数据推入管道。不要忘记在HDFS中,数据是根据复制因子进行复制的。因此这里块A将被存储到三个DataNode,因为假设的复制因子是3。接着客户机仅将块(A)复制到DataNode 1,复制总是按DataNode顺序完成。

 

因此,在复制期间将执行以下步骤:

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

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

将数据块复制到所有的三个DataNode之后,将执行一系列确认,以确保客户端和NameNode成功地编写了数据。然后,客户端将最终关闭管道以结束TCP会话。

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

同理,B块也将与A块并行复制到NameNode中,因此,这里需要注意以下几点:

  • 客户端将同时复制块A和块B到第一个DataNode。
  • 因此,在我们的实例中,每个区块将形成两个管道,上面讨论的所有过程将在这两个管道中并行进行。
  • 客户端将数据块写入第一个DataNode,然后DataNode将按顺序复制数据块。

 

如上图所示,每个块(A和B)有两条管道,下面是在各自管道中每个块的操作流程:

  • Block A:1A -> 2A -> 3A -> 4A
  • Block B:1B -> 2B -> 3B -> 4B -> 5B -> 6B 

HDFS读架构:

HDFS读架构相对容易理解,让我们再次以上面的例子为例,现在HDFS客户机希望读取example.txt文件。

在读取文件时将执行以下步骤:

  • 客户端将向NameNode请求文件example.txt的块元数据。
  • NameNode将返回存储每个块(块A和块B)的DataNode列表。
  • 之后客户端将连接到存储块的DataNode。
  • 客户端开始从DataNode并行读取数据(从DataNode 1读取块A,从DataNode 3读取块B)。
  • 一旦客户端获得所有需要的文件块,它将组合这些块形成完整的文件。

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

现在,你应该对Apache Hadoop HDFS体系结构有了很好的了解。我知道这里有很多信息,可能不太容易一蹴而就。我建议你再检查一遍,我相信这次你会觉得容易一些。现在,在下一篇博客中,我将讨论Apache Hadoop HDFS联合和高可用性架构。

原文:https://www.edureka.co/blog/apache-hadoop-hdfs-architecture/#hdfs_read_or_write_architecture

转载:https://blog.csdn.net/qq_40784783/article/details/79104393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值