什么是HDFS

0x00:序

Hadoop Distributed File System (HDFS) 是一种分布式文件系统,设计用于在商用硬件上运行。它与现有的分布式文件系统有许多相似之处。

但是,与其他分布式文件系统的差异很大:

  • HDFS具有高度容错能力,旨在部署在低成本硬件上。
  • HDFS提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。
  • HDFS放宽了一些POSIX要求,以实现对文件系统数据的流式访问。

HDFS最初是作为Apache Nutch网络搜索引擎项目的基础设施而构建的。HDFS是Apache Hadoop Core项目的一部分。

0x01:HDFS的设计目标和假设

  • 硬件故障是常态
  • 应用程序需要流式访问数据
  • 大数据集
  • 简单的一致性模型
  • “移动计算比移动数据更划算”
  • 跨异构硬件和软件平台的可移植性

0x02:NameNode和DataNodes

  • HDFS具有主/从架构。

HDFS集群由单个NameNode(NN)和管理文件系统名称空间并控制客户端对文件的访问的主服务器组成。此外,还有许多数据节点,通常是集群中每个节点一个,用于管理与它们所运行的节点相连的存储。

HDFS公开了文件系统名称空间,并允许用户数据存储在文件中。在内部,文件被分成一个或多个块,这些块存储在一组DataNode(DN)中。NameNode(NN)执行文件系统名称空间操作,例如打开,关闭和重命名文件和目录。

NameNode(NN)执行文件系统命名空间操作,如打开、关闭、重命名文件或目录。

NameNode(NN)还确定了块到DataNode的映射。

DataNode(DN)负责提供来自文件系统客户端的读写请求和块创建、删除。

img

NameNode(NN)和DataNode(DN)是设计用于在商用机器上运行的软件,通常使用GNU/Linux操作系统。

HDFS是使用Java语言构建的,任何支持Java的机器都可以运行NameNode或DataNode软件。

典型的集群案例是有只运行NameNode的专用服务器。集群中的每台其他服务器都运行DataNode的一个实例。这个架构不排除在同一台机器上运行多个DataNode,但在实际部署中很少出现这种情况。

群集中存在独立的NameNode极大地简化了系统的架构,NameNode是所有HDFS元数据的仲裁者和存储库。系统的设计使用户数据永远不会流经NameNode。

0x03:文件系统命名空间

HDFS支持传统的分层文件组织,可以在这些目录中创建目录并存储文件。

文件系统命名空间层次结构与大多数其他现有文件系统类似; 可以创建、删除、移动、重命名文件。

  • HDFS尚未实现用户配额或访问权限。

  • HDFS不支持硬链接或软链接。

  • 但HDFS架构并不排除实现这些功能。

NameNode(NN)负责维护文件系统NameSpace(名称空间)。

  • NameNode(NN)记录对文件系统命名空间或其属性的任何更改。
  • 应用程序可以指定应由HDFS维护的文件的副本数。
  • 文件的副本数称为该文件的复制因子,由NameNode(NN)存储。

0x04:数据复制

HDFS旨在可靠地在大型群集中的计算机上存储非常大的文件。

它将每个文件存储为一系列块,文件中除最后一个块外的所有块都具有相同的大小。

复制文件的块是为了容错。块大小和复制因子是每个文件可配置的。应用程序可以指定文件的副本数。复制因子可以在文件创建时指定,以后可以更改。

HDFS中的文件只能写入一次,并且在任何时候都只能有一个写入者。

NameNode负责调度复制块的动作。它定期从群集中的每个DataNode接收Heartbeat(心跳)和Blockreport(块汇报)。收到心跳意味着DataNode正常运行。Blockreport(块汇报)包含DataNode上所有块的列表。

img

0x041:副本放置策略:第一步

复制品的放置对HDFS的可靠性和性能至关重要。

优化副本放置将HDFS与大多数其他分布式文件系统区分开来。这是一项需要大量调整和体验的功能。机架感知副本放置策略的目的是提高数据可靠性、可用性和网络带宽利用率。

副本放置策略的当前实现是朝这个方向的第一次努力。实施此策略的短期目标是在生产系统上对其进行验证,进一步了解其行为,并为测试和研究更复杂的策略奠定基础。

大型HDFS实例在通常分布在多个机架上的计算机群集上运行。不同机架中两个节点之间的通信必须通过交换机。在大多数情况下,同一机架中的计算机之间的网络带宽大于不同机架中的计算机之间的网络带宽。

NameNode通过Hadoop Rack Awareness中概述的过程确定每个DataNode所属的机架ID 。一个简单但非最佳的策略是将副本放置在唯一的机架上。这可以防止在整个机架出现故障时丢失数据,并允许在读取数据时使用来自多个机架的带宽。

此策略在群集中均匀分布副本,这样可以轻松平衡组件故障的负载。但是,此策略会增加写入成本,因为写入需要将块传输到多个机架。

对于常见情况,当复制因子为3时,HDFS的放置策略是将一个副本放在本地机架的一个节点,另一个放在本地机架中的另一个节点上,将最后一个放在不同机架中的节点上。此策略可以减少机架间写入流量,从而提高写入性能。而机架故障的可能性远小于节点故障的可能性因此不会影响数据可靠性和可用性保证。但是,它确实减少了读取数据时使用的聚合网络带宽,因为块只放在两个唯一的机架而不是三个。使用此策略时,文件的副本不会均匀分布在机架上。三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,另外三个副本均匀分布在剩余的机架上。

此处描述的默认副本放置策略正在开发中。

0x042:副本选择

为了最大限度地减少全局带宽消耗和读取延迟,HDFS尝试满足最接近读取器的副本的读取请求。

如果在与读取器节点相同的机架上存在副本,则该副本首选满足读取请求。如果angg/HDFS群集跨越多个数据中心,则本地数据中心的副本优先于任何远程副本。

0x043:安全模式

在启动时,NameNode进入一个名为Safemode的特殊状态。

当NameNode处于Safemode状态时,不会发生数据块的复制。NameNode从DataNode接收Heartbeat和Blockreport消息。Blockreport包含DataNode托管的数据块列表。每个块都有指定的最小副本数。

当NameNode收到这个块的最小副本数量时,这个块被视为已经安全复制。而收到已经安全复制数据块超过配置比例(再加上30秒)后,NameNode退出Safemode状态;如果它确定仍然有少于最小副本数的数据块列表。NameNode就会将这些块复制到其他DataNode。