Apache Hadoop HDFS 架构
Apache Hadoop HDFS架构
介绍:
在这篇博客中,我将讨论 Apache Hadoop HDFS 架构。 HDFS 和 YARN 是Hadoop 认证需要掌握的两个重要概念。你知道HDFS是部署在低成本商品硬件的分布式文件系统。因此,现在是我们深入研究 Apache Hadoop HDFS 架构并释放其美感的时候了。
这篇关于 Apache Hadoop HDFS 架构的博客将涵盖的主题如下:
- HDFS Master/Slave Topology
- NameNode, DataNode and Secondary NameNode
- What is a block?
- Replication Management
- Rack Awareness
- HDFS Read/Write – Behind the scenes
HDFS架构:
Apache HDFS 或 Hadoop 分布式文件系统 是一种块结构的文件系统,其中每个文件都被分成预定大小的块。这些块存储在由一台或多台机器组成的集群中。Apache Hadoop HDFS 架构遵循 主/从架构,其中集群由单个 NameNode(主节点)组成,所有其他节点都是 DataNode(从节点)。HDFS 可以部署在各种支持 Java 的机器上。虽然可以在一台机器上运行多个 DataNode,但在实际世界中,这些 DataNode 分布在不同的机器上。
名称节点:
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的功能:
- 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 MB。x(Apache Hadoop 1 .x 中为64 MB ),您可以根据需要进行配置。
在 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 上(考虑默认复制因子):
因此,如果您使用默认配置在 HDFS 中存储 128 MB 的文件,您最终将占用 384 MB (3*128 MB) 的空间,因为这些块将被复制 3 次并且每个副本将驻留在一个不同的数据节点。
注意: NameNode 定期从 DataNode 收集块报告以维护复制因子。因此,每当块被过度复制或复制不足时,NameNode 都会根据需要删除或添加副本。
机架意识:
无论如何,继续前进,让我们更多地讨论 HDFS 如何放置副本以及什么是机架感知?同样,NameNode 还确保所有副本不会存储在同一机架或单个机架上。它遵循内置的机架感知算法,以减少延迟并提供容错能力。考虑到复制因子是 3,Rack Awareness Algorithm 说一个块的第一个副本将存储在本地机架上,接下来的两个副本将存储在不同的(远程)机架上,但是,在其中的不同 DataNode 上(远程)机架,如上图所示。如果您有更多的副本,其余的副本将被放置在随机 DataNode 上,前提是同一机架上驻留的副本不超过两个(如果可能)。
这就是实际的 Hadoop 生产集群的样子。在这里,您有多个装有 DataNode 的机架:
机架感知的优势:
那么,现在您会想为什么我们需要机架感知算法?原因是:
- 提高网络性能:驻留在不同机架上的节点之间的通信通过交换机进行定向。通常,您会发现同一机架中的机器之间的网络带宽比驻留在不同机架中的机器要大。因此,机架感知可帮助您减少不同机架之间的写入流量,从而提供更好的写入性能。此外,您将获得更高的读取性能,因为您正在使用多个机架的带宽。
HDFS 读/写架构:
下面我们来谈谈数据读写操作是如何在HDFS上进行的。HDFS 遵循一次写入 – 多次读取的理念。因此,您无法编辑已存储在 HDFS 中的文件。但是,您可以通过重新打开文件来附加新数据。
HDFS 写入架构:
假设 HDFS 客户端想要写入大小为 248 MB 的名为“example.txt”的文件。
假设系统块大小配置为 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 中,以保持整个集群的复制因子一致。
- 现在整个数据复制过程将分三个阶段进行:
- 管道的设置
- 数据流和复制
- 管道关闭(确认阶段)
1.管道设置:
在写入块之前, 客户端确认存在于每个 IP 列表中的 DataNode 是否准备好接收数据。 在这样做时,客户端通过连接该块的相应列表中的各个 DataNode 来为每个块创建一个管道。让我们考虑 Block A。 NameNode 提供的 DataNode 列表是:
对于块 A,列表 A = {DataNode 1 的 IP,DataNode 4 的 IP,DataNode 6 的 IP}。
因此,对于块 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 顺序完成。
因此,复制期间将执行以下步骤:
- 客户端将块写入 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 将更新其元数据,客户端将关闭管道。
同理,Block B 也会与 Block A 并行复制到 DataNode 中。 所以,这里需要注意以下几点:
- 客户端将块A和嵌段B复制到第一数据节点同时。
- 因此,在我们的例子中,将为每个块形成两条流水线,并且上面讨论的所有过程都将在这两条流水线中并行发生。
- 客户端将块写入第一个 DataNode,然后 DataNode 将依次复制块。
正如您在上图中所看到的,每个块(A 和 B)形成了两个管道。以下是在其各自管道中为每个块发生的操作流程:
- 对于 A 区:1A -> 2A -> 3A -> 4A
- 对于区块 B:1B -> 2B -> 3B -> 4B -> 5B -> 6B
HDFS 读架构:
HDFS Read架构比较容易理解。让我们再次看上面的例子,HDFS 客户端现在想要读取文件“example.txt”。
现在,在读取文件时将执行以下步骤:
- 客户端将联系 NameNode 请求文件“example.txt”的块元数据。
- NameNode 将返回存储每个块(块 A 和 B)的 DataNode 列表。
- 在该客户端之后,将连接到存储块的 DataNode。
- 客户端开始从 DataNode 并行读取数据(DataNode 1 的 Block A 和 DataNode 3 的 Block B)。
- 一旦客户端获得了所有需要的文件块,它就会将这些块组合成一个文件。
在服务客户端的读请求时,HDFS 选择离客户端最近的副本。这减少了读取延迟和带宽消耗。因此,如果可能,选择与读取器节点位于同一机架上的副本。
现在,您应该对 Apache Hadoop HDFS 架构有了一个很好的了解。我知道这里有很多信息,一次获取可能并不容易。我建议你再读一遍,我相信这次你会发现它更容易。现在,在我的下一篇博客中,我将讨论 Apache Hadoop HDFS 联合和高可用性架构。
- 点赞
- 收藏
- 关注作者
评论(0)