1.2 HDFS设计及实现思想

Hadoop是一个开源软件框架,拥有强大的存储和计算能力,能够处理PB级以上的大型数据集。Hadoop由Apache软件基金会(Apache Software Foundation)开发(这里是指开源的Apache Hadoop,后文中没有特别指明也都是指开源版本)。

Hadoop框架中用于存储的部分叫作HDFS(Hadoop Distributed File System)。

1.2.1 HDFS发展历史

Hadoop的发展历史可追溯到最初的Apache Nutch项目。

2002年

Doug Cutting和Mike Cafarella致力于研发Apache Nutch项目,这个项目旨在构建一个能够抓取和索引网站的搜索引擎。之后,这个项目被证明使用起来过于昂贵,无法为数十亿个网页编制索引。因此,需要寻找一种可行的解决方案来降低成本。

2003年

Google发表了一篇关于分布式文件系统(GFS)的论文The Google File System,其中描述了GFS的架构,该架构提供了在分布式环境中存储文件的大型数据集的方法。这篇论文解决了存储作为网络爬虫和索引过程中生成的大文件的问题。

2004年

有了GFS的架构方法,Nutch项目的研发人员开始着手编写开源实现,即Nutch分布式文件系统(NDFS),这就是HDFS的前身。

同年,Google发表了另外一篇关于计算的论文MapReduce,提供了处理大型数据集数据计算的解决方案。

Nutch项目的研发人员也在2004年开始实施MapReduce。

2006年

Apache社区的开发者意识到MapReduce和NDFS的实现不仅可以用于检索领域,也可以用于其他任务,于是就将MapReduce和NDFS从Nutch中分离开来,组建了一个名为“Hadoop”的独立子项目。原先的“NDFS”从这时起就被称为“HDFS”。

2007年

Yahoo在2007年成功应用Hadoop,并将集群拓展至千个节点。

2008年

2008年初,Hadoop成为Apache顶级项目。此后,Facebook和纽约时报等许多公司开始使用Hadoop。

2011年

Apache发布Hadoop 1.0版本,包含多种特性。之后Hadoop持续发展,功能特性不断增强。

2017年

2017年末,Hadoop 3.0版本发布。

Hadoop从诞生至今,发展还是比较成功的。现在很多公司都在使用Hadoop,而且单集群部署节点已经达到万台规模,其中,HDFS通常会作为存储基座。

1.2.2 HDFS特性

HDFS经过多年的不断发展,在开源社区及各大公司中受到极大关注并得到广泛使用。开发者将在实践中发现的问题积极反馈至开源社区,形成良性循环。这也是HDFS能持续发展的原因之一。

HDFS有很多重要的特性符合当下行业的发展趋势,以及技术的发展趋势。

(1)检测和快速应对机器故障

通常在分布式集群中,硬件故障并不是例外,甚至可以说会常态发生。一个HDFS集群可能会部署数百乃至数千台机器,每台机器都存储文件系统中数据的一部分。这意味着HDFS集群在运转时某些组件在某些时刻可能存在无法正常工作的故障。因此,当出现故障时,故障快速检测与自动恢复是HDFS的核心特点之一。

(2)流式数据访问

HDFS上的应用程序通常需要对其数据集进行流式访问。HDFS在设计上更多的是用于批处理而不是和用户交互式处理。因此,使用HDFS的重点是提升数据访问的高吞吐而不是低延迟性(不过在很多实践中,经过多种优化,低延迟性也得到了很大改善)。

(3)支持大文件存储

HDFS支持大文件存储。在HDFS上运行的应用程序通常是大型的数据集,这些文件以典型的大文件居多,从GB到TB不等。这种特点符合高聚合数据带宽并拓展到集群中的数百个节点。通常在单个HDFS集群中能够支持千万级以上的文件数据。

(4)一致性模型

HDFS对应用程序获取文件的访问是一次写入、多次读取的模型。文件一旦创建,写入完成就无须更改,同时也支持对文件的再次追加写入。这种简单的一致性模型较为简单,并实现了高吞吐数据的特点。

(5)移动计算优先于移动数据

这点是和计算相结合的。如果应用程序运行的计算任务在数据附近的位置执行,那么运行的效率会更高。当数据集很大时,效果更明显。这最大限度地减少了网络拥塞并增加了系统的整体吞吐量。将计算迁移到距离数据更近的位置通常比将数据移动到应用程序附近会更好,因此,HDFS为应用程序提供了相关接口,使得应用程序的执行效率更高。

(6)异构硬件支持和软件平台可移植性

HDFS可以轻松地从一个平台移植到另一个平台,这有助于降低使用分布式文件系统的复杂性,同时也为基础设施的选择提供了多样性。

从以上这些特点可以看出,HDFS与其他现有的分布式文件系统有相似之处,也有显著的区别。同时,HDFS具有高度容错性,旨在部署在低成本硬件上。HDFS提供了对应用程序访问数据的高吞吐特性,适合具有大型数据集的应用。HDFS访问地址为https://hadoop.apache.org/hdfs/。

1.2.3 HDFS服务视图

为实现以上特性,HDFS包含的各个服务模块都是经过精心设计的,HDFS的服务视图如图1-2所示。

HDFS的服务视图包含三大部分:核心服务公共服务拓展服务

1.核心服务

核心服务是HDFS最重要的功能。

• 图1-2 HDFS服务视图

1)Namenode。HDFS系统采用中心化设计,即Master/Slave架构。这里的Namenode即是Master,主要作用是管理整个文件系统的meta信息并管理Client对文件的访问。一个HDFS集群可以由多个Namenode组成。

2)DataNode。DataNode是HDFS中的Slave角色,主要作用是存储从Client写入的数据,并负责处理来自Client的直接读写请求。DataNode还会处理来自Namenode的指令。一个HDFS集群可以部署成百上千个DataNode节点。

3)HA(High Availability,高可用)。HDFS提供了高可用机制。在实际使用中,一个集群会部署两个Namenode节点,一个处于Active状态,另一个处于Standby状态。Active Namenode负责集群中的客户端操作。当集群发生故障,Active节点不可用时,HDFS会快速完成状态转移,原先Standby节点会变成Active状态,原先Active节点会变成Standby状态,从而保障集群正常工作。

4)Namespace。随着业务访问量的增大,一个Active Namenode在处理所有Client请求时会存在压力,这时需要对该Namenode减压。一种有效的方法是将原先一个Namenode处理的业务分离出去一部分。因此,HDFS提供了Namespace的概念,支持部署多个Namespace,由每个Namespace处理一部分Client的请求。

5)Snapshot(快照)。快照是数据在某个只读时间上的副本,通常是用来作为数据备份,防止用户误操作,实现数据的容灾恢复。

6)FsImage。Client访问过的数据对应的meta会在Namenode中记录,并分别在两处保存。一处是在Namenode内存中,另一处是在硬盘。Namenode会定期将内存中的结构数据持久化,持久化的这部分数据成为FsImage,主要作用是防止数据丢失。

7)Edits。Client访问HDFS时,如果是更新操作,会生成一条Transaction记录,记录本次操作的具体内容。这个记录会被保存到Edits文件中,之后会定期被Standby Namenode处理。

8)Cache Management。在HDFS中,Cache采用集中式管理。Cache的使用能有效提升Client读数据的效率。

9)Native Libraries(本地库)。本地库的作用是可以提高压缩和解压的效率,同时提供本地方法调用接口,如和C、C++交互。

10)Quotas(限流)。当访问HDFS的Client不断增加、集群存在压力时,需要适当控制流入HDFS的请求。HDFS提供了Quotas限流功能,可以对文件数量和流量限流。

11)Interface。HDFS提供了对外接入的统一访问接口,可以支持RPC、REST或C API。

12)Storage Policies。HDFS支持的存储非常丰富,有DISK、SSD、内存存储、Archive和第三方存储介质。存储策略上支持热存储、温存储和冷存储等。

13)Thansparent Encryption。HDFS中的加密是透明的端到端的。对数据加密后,无须Client修改程序。

14)Third Party Support。HDFS提供了对第三方的拓展机制,支持对Amazon S3、Azure Blob Storage、OpenStack等的拓展,也支持自定义一些特性。

15)Upgrade/Downgrade。当有新版本需要替换时,HDFS提供滚动升级和滚动降级版本的功能。

16)Rack(机架)。Hadoop组件都能识别机架感知,HDFS也不例外。数据块(Block)副本放置在不同机架上可以实现容错,这是使用机架感知来实现的。通过网络交换机和机器位置可以在机器故障的情况下区分数据的可用性。

2.公共服务

公共服务一般是用来处理统一流程。

1)Secure Mode。HDFS的安全功能包括身份认证、服务级别授权、Web控制台身份验证和数据机密性验证等。

2)Authentication。HDFS的权限和认证支持很强大。可以通过Kerberos、SSL认证、Posix样式权限和Ranger授权。

3)Service Level。服务层级花费是HDFS的一大亮点,可以支持让某些用户只访问其中一部分服务来控制集群风险,如只运行User A访问DataNode服务。

4)Proxy User。HDFS的用户系统支持超级用户、普通用户和代理用户。其中,代表另一个用户访问HDFS集群的用户被称为代理用户。

3.拓展服务

拓展服务通常用来辅助管理集群,如额外使用的工具、提供测试功能等。

1)Tools。和HDFS相关的工具比较多,包括User Commands(如dfs、fsck)、Admin Commands(如balancer、dfsadmin)和Debug Commands(如verifyMeta)。

2)Tracing。Tracing功能可以跟踪HDFS的请求,排查某些故障出现的原因。

3)Benchmark。HDFS提供一些用于基准测试的能力,如测试Namenode接口、HDFS I/O吞吐能力等。

4)Mini Cluster。单Namenode集群,用于验证真实HDFS集群在一些场景下的测试。

1.2.4 HDFS架构

HDFS的基本架构如图1-3所示,它采用的是Master/Slave架构模式。

• 图1-3 HDFS基本架构

通常在部署HDFS时,需要一些基本的组件服务。

• Namenode管理文件系统的Metadata,并处理Client请求。

• 发生故障时,Active Namenode和Standby Namenode快速实现高可用(HA)。

• Client访问时,先通过Namenode定位文件所在位置,然后直接和Datanode交互。

• Client写入的数据会以数据块(Block)的形式存储在各个Datanode,每个Block通常会有多个副本(Replication)。

• HDFS通常会部署多个Datanode节点,这些节点在机架(Rack)上有各自的位置。

• 一个HDFS系统支持多个Namespace。

Hadoop HDFS作为开源项目,每天都会有来自全球的开发者和使用者讨论新的想法和实现。Hadoop项目中有几个和HDFS关联性较强的模块hadoop-common-project和hadoop-hdfs-project、hadoop-tools,如图1-4所示(项目源码详见https://github.com/apache/hadoop)。

感兴趣的读者可以下载源码研究,也可以向开源社区反馈。

• issue反馈地址https://issues.apache.org/jira/projects/HDFS/issues。

• wiki访问地址https://cwiki.apache.org/confluence/display/HADOOP/。

• 图1-4 Hadoop项目源码