Hadoop系列的HDFS架构

本文翻译了Hadoop系列下的HDFS架构。原文经作者翻译后,约6000字。之后,作者对内容进行了简化和压缩,以便作者和其他读者在阅读本文时能够更高效、更快速地学习或复习Hadoop。本文主要介绍Hadoop的整体架构,包括但不限于节点概念、命名空间、数据容错机制、数据管理方法、简单脚本命令和垃圾收集概念。

PS:我是新手。如果看到有什么问题,请在下面留言!

Hadoop分布式文件系统(HDFS)是一种高容错、高吞吐量的分布式文件系统,用于处理海量数据。

HDFS一般由数百台机器组成,每台机器存储整个数据集的一部分。快速发现和恢复机器故障是HDFS的核心目标。

HDFS接口的核心目标是高吞吐量而不是低延迟。

HDFS支持海量数据收集,一个集群一般可以支持几千万个文件。

HDFS应用需要一次写一个文件多次读的接口模型,文件修改只支持加尾和截断。

HDFS的海量数据和一致的接口特征,使得迁移计算以适应文件内容比迁移数据以支持计算更高效。

HDFS支持跨平台使用。

HDFS采用主从架构。一个HDFS集群由一个NameNode、一个主服务器(用于管理系统命名空间和控制客户端文件接口)和大量DataNode(一般一个节点用于管理节点的数据存储)组成。HDFS公开了文件系统命名空间,并允许用户数据存储在文件中。文件被分成一个或多个块,这些块存储在一组DataNode中。NameNode执行打开、关闭和重命名文件系统名称空间等命令,并记录块和DataNode之间的映射。DataNode用于处理客户端的读写请求和块的相关操作。NameNode和DataNode一般运行在GNU/Linux操作系统上,HDFS是用Java语言开发的,所以NameNode和DataNode可以运行在任何支持Java的机器上。此外,Java语言的高度可移植性使得HDFS可以在各种机器上发布。一个HDFS集群运行一个NameNode,其他机器运行一个(或多个,这种情况非常少见)DataNode。NameNode简化了系统的架构,仅用于存储所有HDFS元数据,用户数据不会进入该节点。下图显示了HDFS体系结构图:

HDFS支持传统的分层文件管理,用户或应用程序可以在目录下创建目录或文件。文件系统命名空间类似于其他文件系统,支持创建、删除、移动和重命名文件。HDFS支持用户数量限制和访问控制,但不支持软链接和硬链接。用户可以自己实现软硬链接。NameNode控制命名空间,命名空间中的几乎任何更改都会记录在NameNode中。应用程序可以在HDFS声明文件的副本数量,这称为副本系数,并将记录在NameNode中。

HDFS将每个文件存储为一个或多个块,并为文件设置块大小和复制因子以支持文件容错。一个文件中的所有块(除了最后一个块)大小相同,并且支持后面的变长块。复制系数是在创建文件时指定的,以后可以更改。一个文件在任何时候只能有一个编写器。NameNode负责块复制。它定期接收每个DataNode的心跳和块报告。心跳指示数据节点的正常操作,块报告包含该数据节点的所有块。

副本存储方案对于HDFS的稳定性和性能至关重要。为了提高数据的可靠性、灵活性和充分利用网络带宽,HDFS引入了机架感知副本存储策略,这只是副本存储策略的第一步,为后续的优化奠定了基础。大规模HDFS集群通常在跨越许多机架的计算机集群中运行。一般来说,同一个机架中的两个节点之间的数据传输要比不同机架之间的数据传输快。一种简单的方法是将副本存储在单独的机架中,这样可以防止数据丢失并提高带宽,但增加了数据写入的负担。一般情况下,复制系数为3,HDFS存储策略是将第一个副本存储到本地机器或同一机架中的下一个随机DataNode,将另外两个副本存储到同一远程机架中的不同DataNode。NameNode不允许同一DataNode多次存储同一副本。在机架感知策略的基础上,后续支持存储类型与机架感知相结合的策略。简单来说就是在rack-aware的基础上判断DataNode是否支持这种类型的文件,如果不支持就找下一个。

HDFS利用邻近原理读取数据。首先,它会查找同一机架上是否有副本,然后是本地数据中心,最后是远程数据中心。

启动时,NameNode进入安全模式,在这种模式下不会进行数据块复制。NameNode接收来自DataNode的心跳和块报告,每个块的最小拷贝数为n,NameNode接收到n次块后,就认为该数据块已经被安全拷贝。当已被安全复制的数据块的比例达到可配置的百分比值时,再过30秒,NameNode退出安全模式,并最终判断是否仍有未达到最小副本数的数据块,并复制这些数据块。

NameNode使用一个名为EditLog的事务日志来连续记录文件系统元数据的每一次变化(比如创建文件,改变复制系数),并使用一个名为FsImage的文件来存储所有的文件系统命名空间(包括块和文件的映射关系以及文件系统的相关属性)。EditLog和FsImage存储在NameNode的本地文件系统中。NameNode在内存中保存元数据和块映射的快照。当NameNode启动或某个配置项达到阈值时,它会从磁盘中读取EditLog和FsImage,通过EditLog的新记录更新内存中的FsImage,然后将新版本的FsImage刷新到磁盘,然后截断EditLog中已处理的记录。这个过程是一个检查点。检查点的目的是通过使用内存中元数据的快照来确保文件系统持续观察元数据的变化,并将快照信息存储在磁盘FsImage中。检查点基于以下两个配置参数:时间段(dfs.namenode.checkpoint.period)和文件系统事务数量(dfs.namenode.checkpoint.txns)。当两者同时配置时,如果满足任一条件,将触发检查点。

所有HDFS网络协议都是基于TCP/IP的,客户端建立一个可配置的TCP端口到NameNode机器,用于它们之间的交互。DataNode使用DataNode协议与NameNode交互,RPC包装客户端协议和DataNode协议。按照设计,NameNode只负责响应来自客户端或DataNode的RPC请求。

HDFS的核心目标是确保数据的可靠性,即使在出现故障或错误的情况下。三种常见的故障情况包括NameNode故障、DataNode故障和网络分区故障。

网络分区可能导致部分DataNode市区与NameNode之间的连接。NameNode通过心跳包进行判断,将断开的DataNode标记为挂起,那么在挂起的DataNode中注册的数据将全部不可用,这可能导致部分数据块的复制次数低于原来配置的复制系数。NameNode跟踪哪些块需要复制,并在必要时复制它们。触发条件包括多种情况:DataNode不可用、复制乱码、硬件磁盘故障或负系数增大。为了避免DataNode状态不稳定导致的复制风暴,标记DataNode挂起的超时时间设置得很长(默认为10min),用户可以设置一个较短的时间间隔来标记DataNode为过时,以避免在需要高读写性能的请求中使用这些过时的节点。

HDFS架构兼容各种数据再平衡方案。当一个DataNode的空闲空间小于某个阈值时,一种方案可以将数据移动到另一个DataNode。当一个特殊文件突然有很高的读取需求时,一种方法是主动创建额外的副本,平衡集群中的其他数据。这些类型的平衡方案还没有实现(不清楚现有的方案是什么...).

存储设备、网络或软件的问题可能会导致从DataNode获得的数据出现乱码。HDFS客户端已经验证了文件的内容。当客户端创建文件时,它将计算文件中每个块的校验值,并将其存储在命名空间中。当客户端检索数据时,它将使用检查值来检查每个块。如果有问题,客户端将转到另一个DataNode来获取这个块的副本。

FsImage和EditLog是HDFS的核心数据结构,它们的错误会导致整个HDFS挂起。所以NameNode在任何时候都要支持FsImage和EditLog的多点复制,所有文件如果有变化都要同步更新。另一种选择是在NFS上使用共享存储或分布式编辑日志来支持多个NameNode。官方推荐分布式编辑日志。

快照可以存储特定时刻的数据副本,从而支持HDFS在发生错误时回滚到上一个稳定版本。

HDFS的应用场景是大数据集,数据只需要写一次,但是需要读一次或者几次,并且支持流量读取数据。一般情况下,块的大小是128MB,所以一个文件被切割成128MB的大块,每个块可能分布在不同的DataNode中。

当客户端在复制系数为3的条件下写入数据时,NameNode通过目标选择算法接收副本要写入的DataNodes集合。第1个DataNode开始一部分一部分的采集数据,将每个部分存储在本地,转发给第二个DataNode。第二个datanode同样在本地存储每个部分,并将其转发给第三个DataNode,第三个DataNode在本地存储数据。这是管道复制。

HDFS提供了多种访问方式,比如文件系统Java API,这个Java API的C语言包装器和REST API,还支持浏览器直接浏览。通过使用NFS网关,客户端可以在本地文件系统上安装HDFS。

HDFS使用目录和文件来管理数据,并提供了一个名为FS shell的命令行界面。以下是一些简单的命令:

DFSAdmin命令集用于管理HDFS集群。这些命令只能由集群管理员使用。以下是一些简单的命令:

正常的HDFS安装将配置一个web服务,它通过可配置的TCP端口公开名称空间,以便用户可以通过web浏览器查看文件内容。

如果打开了垃圾收集配置,通过FS shell删除的文件不会被立即删除,而是会被移动到垃圾文件专用的目录(/user/

当文件副本系数降低时,NameNode会选择要删除的冗余副本,并在收到心跳包时向DataNode发送删除信息。如上所述,此删除操作需要一些时间来显示集群上可用空间的增加。

HDFS建筑