大数据技术基础:基于Hadoop与Spark
上QQ阅读APP看书,第一时间看更新

1.5 初识Hadoop大数据平台

1.5.1 Hadoop的发展过程

Hadoop是毕业于美国斯坦福大学的道格· 卡廷(Doug Cutting) (见图1-7)创建的。1997年年底,Doug Cutting开始研究如何用Java来实现全文文本搜索,最终开发出了全球第一个开源的全文文本搜索系统函数库——Apache Lucene。之后,Cutting再接再厉,在Lucene的基础上将开源的思想继续深化。2004年,Doug Cutting和同为程序员出身的迈克·卡法雷拉 Mike Cafarella 决定开发一款可以代替当时的主流搜索产品的开源搜索引擎,这个项目被命名为 Nutch。Hadoop 就起源于这个开源的网络搜索引擎——Apache Nutch。因此,Hadoop开始本身也是Lucene项目的一部分。

图1-7 Hadoop之父——道格·卡廷(Doug Cutting)

1.Hadoop名字的来历

Hadoop这个单词并不是一个缩略词,它完全是一个虚构的名字。有关Hadoop名称的来历,请大家看一下创始人Doug Cutting是如何解释的:“这个名字是我的孩子给一头吃饱了的棕黄色大象取的。我的命名标准是简短,容易发音和拼写,没有太多的含义,并且不会被用于别处。小孩子是这方面的高手。Google就是小孩子起的名字。”

有趣的是,Hadoop的子项目及后续模块所使用的名称也往往与其功能不相关,通常也以大象或其他动物为主题命名,如“Pig”“Hive”“Impala”等,就连一些较小的组件的名称通常也比较通俗。这意味着我们可以通过它的名字大致猜测它的功能,例如,JobTracker 就是一款用于跟踪MapReduce作业的程序。

从头开始构建一个网络搜索引擎是一个雄心勃勃的计划,不仅是因为编写一个爬取并索引网页的软件比较复杂,更因为这个项目包含许多需要随时修改的组件,必须有一个专门的团队来实现。同时,构建这样一个系统的代价非常高(据道格·卡廷和迈克·卡法雷拉估计,一个支持10亿网页的索引系统单是硬件上的投入就高达50万美元,另外每月运行维护费用也高达3万美元)。不过,他们仍然认为这项工作是值得的,因为它开创了优化搜索引擎算法的平台。

2.Hadoop的诞生

Nutch项目开始于2002年,一个可以运行的网页爬取工具和搜索引擎系统很快“浮出水面”。但后来,开发者认为这一架构可扩展性不够,无法应对数十亿网页的搜索问题。2003 年和 2004年,Google先后发表了The Google File System、MapReduce: Simplified Data Processing on Large Clusters 两篇论文。这两个创新性的思路点燃了道格·卡廷和迈克·卡拉雷拉的激情与斗志,他们花了2年的业余时间实现分布式文件系统DFS和MapReduce机制。2005年,他们将Nutch的所有主要算法均改造为用DFS和MapReduce来运行,并且使Nutch可以在20台机器上支持几亿的数据规模。

2006年,当雅虎在考虑构建一个高度利用硬件资源、并且维护和开发都非常简易的软件架构时,道格·卡廷的Nutch进入了雅虎的视野。2006年1月,道格·卡廷加入雅虎,雅虎为此组织了一个专门的团队和资源,将 Hadoop 发展成了一个能够处理 Web 数据的系统。2006 年 2 月, Hadoop从Nutch项目中独立出来,并且正式成为Apache组织中一个专注于DFS和MapReduce的开源项目。作为一个分布式系统基础架构,Hadoop使用户可以在不了解分布式底层细节的情况下,充分利用集群的威力,开发分布式程序,实现分布式计算和存储。

2008年1月,Hadoop发展成为Apache的顶级项目。2008年4月,Hadoop打破世界纪录,成为最快的TB级数据排序系统。通过一个900节点的群集,Hadoop在209s内完成了对1 TB数据的排序,击败了2007年的297s冠军。这标志着Hadoop取得了成功。

自2007年推出后,Hadoop很快在工业界获得普及应用,同时获得了学术界的广泛关注和研究。在短短的几年中,Hadoop很快成为到现在为止最为成功、最广泛接受使用的大数据处理主流技术和系统平台,而且成为了大数据领域事实上的一种工业标准。

10年来,Hadoop的主要发展历程如下。

● 2008年6月,Hadoop的第一个SQL框架——Hive成为了Hadoop的子项目。

● 2009年7月,MapReduce 和 HDFS成为Hadoop项目的独立子项目。

● 2010年5月,Avro脱离Hadoop项目,成为Apache顶级项目。

● 2010年5月,HBase脱离Hadoop项目,成为Apache顶级项目。

● 2010年9月,Hive脱离Hadoop,成为Apache顶级项目。

● 2010年9月,Pig脱离Hadoop,成为Apache顶级项目。

● 2011年1月,ZooKeeper脱离Hadoop,成为Apache顶级项目。

● 2011年12月,Hadoop 1.0.0版本发布。

● 2012年5月, Hadoop 2.0.0-alpha发布,YARN成为Hadoop子项目。

● 2012年10月,Impala加入到了Hadoop生态圈。

● 2013年10月15日, Hadoop 2.2.0版本发布,标志着Hadoop正式进入MapReduce v2.0时代。

● 2014年2月,Spark开始代替MapReduce成为Hadoop的默认执行引擎,并成为Apache顶级项目。

● 2015年4月21日, Hadoop 2.7.0版本发布。

● 2016年7月26日, Spark 2.0.0版本发布。

1.5.2 Hadoop的优势

Hadoop是一个能够对大数据进行分布式处理的软件框架。经过10年的快速发展,Hadoop已经形成了以下4点优势。

1.高可靠性

Hadoop是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。

2.高扩展性

Hadoop是在可用的计算机集群之间分配数据并完成计算任务的,整个集群包含的节点规模可以方便地扩展到数以千计。

3.高效性

Hadoop是高效的,因为它以并行的方式工作,通过大规模的并行处理加快数据的处理速度。它还能够在节点之间动态地移动数据,并保证各个节点的负载动态平衡,因此保证了集群的整体处理速度。

4.高容错性

Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。Hadoop带有用Java语言编写的框架,因此运行在Linux生产平台上是非常理想的。Hadoop上的应用程序也可以使用其他语言编写,比如C++。

1.5.3 Hadoop的生态系统

2006年,Hadoop还只是HDFS和MapReduce的代名词,但是10年来,它已经发生了脱胎换骨的变化。它已经从传统的三驾马车——HDFS、MapReduce和HBase社区发展为60多个相关组件组成的庞大生态系统。其中,包含在各大发行版中的组件就有25个以上,包括数据存储、执行引擎、编程和数据访问框架等。

现在,构成Hadoop的整个生态系统的所有组件可划分为4个层次。如图1-8所示。

图1-8 Hadoop技术生态系统

Hadoop的底层是存储层,核心组件是分布式文件系统HDFS;中间层是资源及数据管理层,核心组件是YARN以及Sentry等;上层是计算引擎,核心组件是MapReduce、Impala、Spark等;顶层是基于MapReduce、Spark等计算引擎的高级封装及工具,如Hive、Pig、Mahout等。

在Hadoop的生态系统之中,HDFS是分布式存储系统,即Hadoop Distributed File System。HDFS提供了高可靠性、高扩展性和高吞吐率的数据存储服务,它源自于Google的GFS论文,是GFS克隆版。

YARN是Hadoop的资源管理系统,原意是Yet Another Resource Negotiator(另一个资源管理系统),负责集群资源的统一管理和调度,是Hadoop 2.0新增加的系统组件,它允许多种计算框架运行在一个集群中。

MapReduce是分布式计算框架,具有易于编程、高容错性和高扩展性等优点。MapReduce源自于Google的MapReduce论文,是Google MapReduce的克隆版。

特别要注意的是,很多人把YARN理解成了升级版的MapReduce。实际上,YARN并不是下一代MapReduce(即MRv2)。下一代MapReduce与第一代MapReduce(MRv1)在编程接口、数据处理引擎(MapTask和ReduceTask)上是完全一样的,可认为MRv2重用了MRv1的这些模块。二者有所不同的是资源管理和作业管理系统,在MRv1中资源管理和作业管理都是由JobTracker实现的,集两个功能于一身;而在MRv2中,将这两部分功能分开了,作业管理由ApplicationMaster实现,而资源管理由新增系统YARN完成。由于YARN具有通用性,因此YARN也可以作为其他计算框架(如Spark、Storm等)的资源管理系统,而不仅限于MapReduce。通常而言,我们将运行在YARN上的计算框架统称为“X on YARN”,例如“MapReduce On YARN”“Spark On YARN”“Storm On YARN”等。

Hive是由Facebook开源,基于MapReduce的数据仓库,数据计算使用MapReduce,数据存储使用HDFS。Hive定义了一种类 SQL 查询语言——HQL。HQL类似SQL,但不完全相同。

Pig是由Yahoo!开源的,是构建在Hadoop之上的数据仓库。

Mahout是数据挖掘的API库,基于Hadoop的机器学习和数据挖掘的分布式计算框架,实现了3大类算法:推荐(Recommendation)、聚类(Clustering)、分类(Classification)。

HBase是一种分布式数据库,源自Google的Bigtable论文,是Google Bigtable克隆版。

Zookeeper是一个分布式协作服务组件,源自Google的Chubby论文,是Chubby克隆版。它被用于解决分布式环境下的数据管理问题,包括统一命名、状态同步、集群管理、配置同步等。

Sqoop是数据同步工具,是连接Hadoop与传统数据库之间的桥梁。它支持多种数据库,包括MySQL、DB2等,本质上是一个MapReduce程序。

Flume是日志收集工具,Cloudera开源的日志收集系统。

Oozie是作业流调度系统。通过它,我们可以把多个Map/Reduce作业组合到一个逻辑工作单元中,从而完成更大型的任务。

1.5.4 Hadoop的版本

当前Apache Hadoop版本非常多,要理解各版本的特性以及它们之间的联系比较困难。在搞清楚Hadoop各版本之前,先要了解Apache软件发布方式。

对于任何一个Apache开源项目,所有的基础特性均被添加到一个称为“trunk”的主代码线。当项目需要添加一个重要的特性时,Apache 会从主代码线中专门延伸出一个分支(branch),作为一个候选发布版(candidate release)。该分支将专注于实现该特性而不再添加其他新的特性,当bug修复之后,经过相关人士投票便会对外公开,成为发布版(release version)。之后,该特性将合并到主代码线中。需要注意的是,有时可能会同时进行多个分支的研发,这样一来,版本高的分支可能先于版本低的分支发布。

由于Apache以特性为准延伸新的分支,故在介绍Apache Hadoop版本之前,先了解几个独立产生Hadoop新版本的重大功能特性。

1.HDFS Append

Append特性主要完成追加文件内容的功能,也就是允许用户以Append方式修改HDFS上的文件。HDFS最初的一个设计目标是支持MapReduce编程模型,而该模型只需要写一次文件,之后仅进行读操作而不会对其修改,即“write-once-read-many”,这就不需要支持文件追加功能。但随着HDFS变得流行,一些具有写需求的应用想以HDFS作为存储系统,例如,有些应用程序需要往HDFS上的某个文件中追加日志信息,HBase使用HDFS的Append功能来防止数据丢失等。

2.HDFS RAID

Hadoop RAID模块在HDFS之上构建了一个新的分布式文件系统——DRFS (Distributed Raid File System),该系统采用了纠错码(erasure codes)来增强对数据的保护。有了这样的保护,可以采用更低的副本数来实现同样的可靠性保障,进而为用户节省大量存储空间。

3.Symlink

Symlink 模块让 HDFS 支持符号链接。符号链接是一种特殊的文件,它以绝对或者相对路径的形式指向另外一个文件或者目录(目标文件),当程序向符号链接中写数据时,相当于直接向目标文件中写数据。

4.Security

Hadoop的HDFS和MapReduce均缺乏相应的安全机制设计。例如,在HDFS中,用户只要知道某个block的blockID,便可以绕过NameNode直接从DataNode上读取该block,用户也可以向任意DataNode上写block;在MapReduce中,用户可以修改或者杀死任意其他用户的作业等。为了增强Hadoop的安全机制,从2009年起,Apache专门抽出一个团队,从事为Hadoop增加基于Kerberos和删除标记(deletion token)的安全认证和授权机制的工作。

5.MRv1

正如前面所述,第一代MapReduce计算框架由3部分组成:编程模型、数据处理引擎和运行时环境。其中,编程模型由新旧API两部分组成;数据处理引擎由MapTask和ReduceTask组成;运行时环境由JobTracker和TaskTracker两类服务组成。

6.MRv2/YARN

MRv2 是针对 MRv1 在扩展性和多框架支持等方面的不足而提出来的,它将 MRv1 中的JobTracker 包含的资源管理和作业控制两部分功能拆分开来,分别交由不同的进程实现。考虑到资源管理模块可以共享给其他框架使用,MRv2将其做成了一个通用的YARN系统。YARN系统的引入使得计算框架进入了平台化时代。

7.NameNode Federation

在Hadoop 1.0中,一个Hadoop集群只有一个NameNode,因此NameNode的内存限制了集群的可扩展性。NameNode Federation特性解决了Hadoop 1.0的扩展性问题,它允许一个集群拥有多个NameNode,每个NameNode分管一部分目录,这不仅使HDFS的扩展性得到了增强,也使HDFS具备了隔离性。

8.NameNode HA

HDFS的NameNode存在内存约束限制扩展性和单点故障两个问题。其中,第一个问题可以通过NameNode Federation方案解决,而第二个问题则可以通过NameNode HA(High Available)机制实现,该机制实现了NameNode的热备份。

到2013年8月为止,Apache Hadoop已经出现4个大的分支。如图1-9所示。

Apache Hadoop的4大分支构成了3个系列的Hadoop版本。

(1)0.20.X系列

0.20.2版本发布后,几个重要的特性没有基于trunk而是在0.20.2基础上继续研发。值得一提的主要有两个特性:Append与Security。其中,包含Security特性的分支以0.20.203版本发布,而后续的0.20.205版本综合了这两个特性。需要注意的是,之后的1.0.0版本仅是0.20.205版本的重命名。0.20.X系列版本是最令用户感到疑惑的,因为它们具有的一些特性trunk上没有,而trunk上有的一些特性0.20.X系列版本也没有。

图1-9 Hadoop的版本图

(2)0.21.0/0.22.X系列

这一系列版本将整个 Hadoop 项目分割成了 3 个独立的模块,分别是 Common、HDFS 和MapReduce。0.22.0在0.21.0基础上修复了一些bug并进行了部分优化。HDFS和MapReduce都对Common模块有依赖,但是MapReduce对HDFS并没有依赖,这样,MapReduce可以更容易地运行在其他的分布式文件系统之上,同时,模块间可以独立开发。各个模块的改进如下。

① Common模块。最大的新特性是在测试方面添加了Large-Scale Automated Test Framework和Fault Injection Framework。

② HDFS模块。主要增加的新特性包括支持追加操作与建立符号连接、Secondary NameNode改进(Secondary NameNode被剔除,取而代之的是Checkpoint Node,同时添加了一个Backup Node的角色作为NameNode的冷备)、允许用户自定义block放置算法等。

③ MapReduce模块。在作业API方面,开始启动新MapReduce API,但仍然兼容老的API。

(3)0.23.X系列

0.23.X 是为了克服 Hadoop 在扩展性和框架通用性方面的不足而提出来的,它包括基础库Common、分布式文件系统HDFS、资源管理框架YARN和运行在YARN上的MapReduce 4部分。其中,新增的YARN可对接入的各种计算框架(如MapReduce、Spark等)进行统一管理。该发行版自带MapReduce库,而该库集成了迄今为止所有的MapReduce新特性。

(4)2.X系列

同0.23.X系列一样,2.X系列属于下一代Hadoop。与0.23.X相比,2.X增加了NameNode HA和Wire-compatibility等新特性。

截至本书编写时,在Hadoop的官方网站http://hadoop.apache.org/releases.html 页面上,供用户下载的最新版本有:Hadoop 2.6.4(于2016年2年11日发布)、Hadoop 2.7.2(于2016年1月25日发布)。本书以Hadoop 2.7.2为准,所有示例代码均在Hadoop 2.7.2中调试。