Apache Hadoop HDFS 架构

举报
Donglian Lin 发表于 2021/08/10 08:37:58 2021/08/10
【摘要】 在服务客户端的读请求时,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 架构遵循 主/从架构,其中集群由单个 NameNode(主节点)组成,所有其他节点都是 DataNode(从节点)。HDFS 可以部署在各种支持 Java 的机器上。虽然可以在一台机器上运行多个 DataNode,但在实际世界中,这些 DataNode 分布在不同的机器上。

名称节点:

Apache Hadoop HDFS 架构 - Edureka

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

NameNode的功能:

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

数据节点:

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

DataNode的功能:

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

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

辅助名称节点:

除了这两个守护进程之外,还有第三个守护进程或进程称为 Secondary NameNode。辅助 NameNode 作为辅助守护进程与主 NameNode 同时工作并且不要对辅助 NameNode 是备份 NameNode感到困惑,因为它不是。

辅助 NameNode 功能 - Apache Hadoop HDFS 架构 - Edureka

二级NameNode的功能:

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

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

块:

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

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

HDFS 架构——HDFS 教程 介绍 在这个博客中,我们将讨论 HDFS 架构。 从我之前的博客中,我们已经知道 HDFS 是一种部署在低成本商品硬件上的分布式文件系统。 我也讨论了它的许多功能。 因此,现在是我们深入研究 Apache Hadoop HDFS 架构并释放其美感的时候了。 本博客将涵盖的主题如下: • HDFS 主/从拓扑 • NameNode 和 DataNode • 什么是块 • 复制管理 • 机架感知 • HDFS 读/写 – 在幕后 HDFS 架构 HDFS 或 Hadoop 分布式文件System 是一个块结构的文件系统,其中每个文件被分成预定大小的块。 这些块存储在由一台或多台机器组成的集群中。 Apache Hadoop HDFS 架构遵循主/从架构,其中集群由单个 NameNode(主节点)组成,所有其他节点都是 DataNode(从节点)。 HDFS 基于 Java 编程语言,因此 HDFS 可以部署在支持 Java 的广泛机器上。 虽然可以在一台机器上运行多个 DataNode,但在实际世界中,这些 DataNode 分布在不同的机器上。 NameNode 和 DataNode NameNode:NameNode 是 HDFS 的主节点,负责维护和管理 DataNode(从节点)上存在的块。 把 NameNode 想象成一辆兰博基尼在其他各种汽车中。 因此,与兰博基尼一样,NameNode 是一个高度可用的服务器,用于管理文件系统命名空间并控制客户端对文件的访问。 我将在下一篇博客中讨论 Apache Hadoop HDFS 的这个高可用性特性。 HDFS 架构的构建方式使得用户数据永远不会存储在 NameNode 中。 数据仅驻留在 DataNode 上。 NameNode 的功能: • 它是维护和管理 DataNode(从节点)的主守护进程 • 它记录集群中存储的所有文件的元数据,例如存储块的位置、文件大小、权限、层次结构等. 有两个文件与元数据相关联: o FsImage:启动 NameNode 时的文件系统映像。 o EditLogs:启动NameNode后对文件系统进行的一系列修改。 • 它记录对文件系统元数据发生的每个更改。 例如,如果在 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 对我们来说非常重要。 如果失败,我们就完蛋了。 不过别担心,我们将在下一个 HDFS 教程博客中讨论 Hadoop 如何解决这个单点故障问题。 所以,暂时放松一下,让我们一步一步来。 辅助 NameNode 除了这两个守护进程之外,还有第三个守护进程或进程称为辅助 NameNode。 辅助 NameNode 作为辅助守护进程与主 NameNode 同时工作。 并且不要将辅助 NameNode 混淆为备用 NameNode,因为它不是。 Secondary NameNode 的功能: • Secondary NameNode 是一种不断地从NameNode 的RAM 中读取所有文件系统和元数据,并将其写入硬盘或文件系统的一种。 • 它负责将EditLogs 与来自NameNode 的FsImage 结合起来。 • 它定期从NameNode 下载EditLogs 并应用于FsImage。 新的 FsImage 被复制回 NameNode,在下次启动 NameNode 时使用。 因此,Secondary NameNode 只是在 HDFS 中执行常规检查点。 因此,它也被称为 CheckpointNode。 块 现在我们知道 HDFS 中的数据作为块分散在 DataNode 中。 让我们来看看什么是块,它是如何形成的? 块是硬盘驱动器中存储数据的最小连续位置。 通常,在任何文件系统中,数据都存储为块的集合。 同样,HDFS 将每个文件存储为块,这些块分散在整个 Apache Hadoop 集群中。 每个块的默认大小在 Apache Hadoop 2.x 中为 128MB(在 Apache Hadoop 1.x 中为 64MB),您可以根据需要进行配置。 没有必要在 HDFS 中,每个文件都存储在配置块大小(128MB、256MB 等)的精确倍数中。 让我们举个例子,我有一个大小为 514MB 的文件“example.txt”,如上图所示。 假设我们使用默认的块大小配置,即 128Mb。 那么,将创建多少块? 5、对。 前四个块将是 128 MB。 但, 最后一个块只有 2 MB 大小。 现在你一定在想为什么我们需要这么大的块大小,即 128MB? 好吧,每当我们谈论 HDFS 时,我们都会谈论巨大的数据集,即 TB 和 PB 的数据。 所以,如果我们有一个块大小,比如说在 Linux 文件系统中是 4KB,我们会有太多的块,因此会有太多的元数据。 所以,管理这些没有。 块和元数据会产生巨大的开销,这是我们不想要的。 当您了解什么是块时,让我们在下一节中了解这些块是如何放置的。 Replication Management 和 Rack Awareness Replication Management:HDFS 提供了一种可靠的方式来在分布式环境中将大量数据存储为数据块。 这些块也被复制以提供容错能力。 默认复制因子是 3,它也是可配置的。

在 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 架构的下一部分中了解这些块的复制是如何发生的。同时,您可以查看有关 HDFS 架构的视频教程,其中详细讨论了所有 HDFS 架构概念:

复制管理:

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

复制管理 - Apache Hadoop HDFS 架构 - Edureka

因此,如果您使用默认配置在 HDFS 中存储 128 MB 的文件,您最终将占用 384 MB (3*128 MB) 的空间,因为这些块将被复制 3 次并且每个副本将驻留在一个不同的数据节点。 

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

机架意识:

机架意识 - Apache Hadoop HDFS 架构 - Edureka

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

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

Hadoop 集群 - Apache Hadoop HDFS 架构 - Edureka

机架感知的优势:

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

  • 提高网络性能:驻留在不同机架上的节点之间的通信通过交换机进行定向。通常,您会发现同一机架中的机器之间的网络带宽比驻留在不同机架中的机器要大。因此,机架感知可帮助您减少不同机架之间的写入流量,从而提供更好的写入性能。此外,您将获得更高的读取性能,因为您正在使用多个机架的带宽。
  • 防止数据丢失:即使整个机架因为交换机故障或电源故障而发生故障,我们也不必担心数据丢失。如果您考虑一下,这将是有道理的,因为据说永远不要将所有鸡蛋放在同一个篮子里。


HDFS 读/写架构:

下面我们来谈谈数据读写操作是如何在HDFS上进行的。HDFS 遵循一次写入 – 多次读取的理念。因此,您无法编辑已存储在 HDFS 中的文件。但是,您可以通过重新打开文件来附加新数据。

HDFS 写入架构:

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

hdfs-file-blocks-apache-hadoop-hdfs-architecture-edureka

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

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

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

HDFS 管道 - Apache Hadoop HDFS 架构 - Edureka

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

1.管道设置:

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

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

HDFS 管道设置 - Apache Hadoop HDFS 架构 - Edureka

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

  • 客户端将选择列表中的第一个 DataNode(Block A 的 DataNode IP),即 DataNode 1,并将建立 TCP/IP 连接。
  • 客户端将通知 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、4 和6 之间将形成一条管道。
  • 现在管道设置完成,客户端将最终开始数据复制或流处理。

2. 数据流:

创建管道后,客户端会将数据推送到管道中。现在,不要忘记在 HDFS 中,数据是根据复制因子复制的。因此,这里块 A 将存储到三个 DataNode,因为假定复制因子为 3。继续前进,客户端将只将块 (A) 复制到 DataNode 1。复制总是由 DataNode 顺序完成。

HDFS 写入 - Apache Hadoop HDFS 架构 - Edureka

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

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

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

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

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

HDFS 写入确认 - Apache Hadoop HDFS 架构 - Edureka

同理,Block B 也会与 Block A 并行复制到 DataNode 中。 所以,这里需要注意以下几点:

  • 客户端将块A和嵌段B复制到第一数据节点同时
  • 因此,在我们的例子中,将为每个块形成两条流水线,并且上面讨论的所有过程都将在这两条流水线中并行发生。
  • 客户端将块写入第一个 DataNode,然后 DataNode 将依次复制块。

HDFS 多写管道 - Apache Hadoop HDFS 架构 - Edureka

正如您在上图中所看到的,每个块(A 和 B)形成了两个管道。以下是在其各自管道中为每个块发生的操作流程:

  • 对于 A 区:1A -> 2A -> 3A -> 4A
  • 对于区块 B:1B -> 2B -> 3B -> 4B -> 5B -> 6B 

HDFS 读架构:

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

HDFS 读取 - Apache Hadoop HDFS 架构 - Edureka

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

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。