Hadoop起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Lucene项目的一部分。
Hadoop这个名字不是一个缩写,它是一个虚构的名字。该项目的创建者Doug Cutting如此解释Hadoop的得名:“这个名字是我孩子给一头吃饱了的棕黄色大象起的名字。我的命名标准就是简短、容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子是这方面的高手。Googol就是由小孩命名的。”(Google来源于Googol一词。GooGol指的是10的100次幂(方),代表互联网上的海量资源。公司创建之初,肖恩·安德森在搜索该名字是否已经被注册时,将Googol误打成了Google。)
Hadoop及其子项目和后继模块所使用的名字往往也与其功能不相关,经常用一头大象或其他动物主题(例如Pig)。较小的各个组成部分给予更多描述性(因此也更通俗)的名称。这是一个很好的原则,因为它意味着可以大致从其名字猜测其功能,例如,jobtracker的任务就是跟踪MapReduce作业。
从头开始构建一个网络搜索引擎是一个雄心勃勃的目标,不只是要编写一个复杂的、能够抓取和索引网站的软件,还需要面临着没有专业运行团队支持运行它的挑战,因为它有那么多独立部件。同样昂贵的还有:据Mike Cafarella和Doug Cutting估计,一个支持此10亿页的索引,需要价值约50万美元的硬件投入,每月运行费用还需要3万美元。不过,他们相信这是一个有价值的目标,因为这会开源并最终使搜索引擎算法普及化。
Nutch项目开始于2002年,一个可工作的抓取工具和搜索系统很快浮出水面。但他们意识到,他们的架构将无法扩展到拥有数十亿网页的网络。2003年发表的一篇描述Google分布式文件系统(简称GFS)的论文为他们提供了及时的帮助,文中称Google正在使用此文件系统。GFS或类似的东西,可以解决他们在网络抓取和索引过程中产生的大量文件的存储需求。具体而言,GFS会省掉管理所花的时间,如管理存储节点。在2004年,他们开始写一个开放源码的应用,即Nutch的分布式文件系统(NDFS)。
2004年,Google发表了论文,向全世界介绍了MapReduce。2005年年初,Nutch的开发者在Nutch上有了一个可工作的MapReduce应用,到了年中,所有主要的Nutch算法被移植到使用MapReduce和NDFS来运行。
Nutch中的NDFS和MapReduce实现的应用远不只是搜索领域,2006年2月,他们从Nutch转移出来成为一个独立的Lucene子项目,称为Hadoop。大约同一时间,Doug Cutting加入雅虎,Yahoo提供一个专门的团队和资源将Hadoop发展成一个可在网络上运行的系统(见后文的补充材料)。2008年2月,雅虎宣布其搜索引擎产品部署在一个拥有1万个内核的Hadoop集群上。
2008年1月,Hadoop已成为Apache顶级项目,证明它是成功的,它成为一个多样化、活跃的社区。通过这次机会,Hadoop成功地应用在雅虎之外的很多公司,如Last.fm、Facebook和《纽约时报》。一些应用在Hadoop维基网站上有介绍,Hadoop维基的网址为http://wiki.apache.org/hadoop/PoweredBy。
有一个良好的宣传范例,《纽约时报》使用亚马逊的EC2云计算将4TB的报纸扫描文档压缩,转换为用于Web的PDF文件。这个过程历时不到24小时,使用100台机器同时运行。如果不结合亚马逊的按小时付费的模式(即允许《纽约时报》在很短的一段时间内访问大量机器)和Hadoop易于使用的并行程序设计模型,该项目很可能不会这么快开始启动。
2008年4月,Hadoop打破世界纪录,成为最快排序1TB数据的系统,运行在一个910个节点的集群上,Hadoop在209秒内排序了1 TB的数据(还不到3.5分钟),击败了前一年费时297秒的冠军。同年11月,谷歌在报告中声称,它的MapReduce实现了执行1 TB数据的排序只用68秒。2009年5月,有报道称Yahoo的团队使用Hadoop对1 TB的数据进行排序,只花了62秒。
构建互联网规模的搜索引擎需要大量的数据,因此需要大量的机器来进行处理。Yahoo!Search包括四个主要组成部分:Crawler,从因特网下载网页;WebMap,构建一个网络地图;Indexer,为最佳页面构建一个反向索引;Runtime(运行时),回答用户的查询。WebMap是一幅图,大约包括一万亿条边(每条代表一个网络链接)和一千亿个节点(每个节点代表不同的网址)。创建和分析此类大图需要大量计算机运行若干天。2005年年初,WebMap所用的基础设施名为Dreadnaught,需要重新设计以适应更多节点的需求。Dreadnaught成功地从20个节点扩展到600个,但还需要一个完全重新的设计,以进一步扩展节点。Dreadnaught与MapReduce有许多相似的地方,但灵活性更强,结构更少。具体说来,Dreadnaught作业可以将输出发送到此作业下一阶段中的每一个分段(fragment),但排序是在库函数中完成的。在实际情形中,大多数WebMap阶段都是成对存在的,对应于MapReduce。因此,WebMap应用并不需要为了适应MapReduce而进行大量重构。
Eric Baldeschwieler(Eric14)组建了一个小团队,他们开始设计并原型化一个新的框架(原型为GFS和MapReduce,用C++语言编写),打算用它来替换Dreadnaught。尽管当务之急是需要一个WebMap新框架,但很显然,标准化对于整个Yahoo! Search平台至关重要,并且通过使这个框架泛化,足以支持其他用户,这样他们才能够充分运用其对整个平台的投资。
与此同时,雅虎在关注Hadoop(当时还是Nutch的一部分)及其进展情况。2006年1月,雅虎聘请了Doug Cutting,一个月后,决定放弃自己的原型,转而使用Hadoop。相较于雅虎自己的原型和设计,Hadoop的优势在于它已经在20个节点上实际应用过。这样一来,雅虎便能在两个月内搭建一个研究集群,并着手帮助真正需要的客户使用这个新的框架,速度比原来预计的要快许多。另一个明显的优点是Hadoop已经开源,较容易(虽然远没有那么容易)从雅虎法务部门获得许可。因此,雅虎在2006年初设立了一个200个节点的研究集群,他们将WebMap的计划暂时搁置,转而为研究用户支持和发展Hadoop。
目前市面上Hadoop版本主要有两种:Apache版本和第三方发行版本。Apache Hadoop是一款支持数据密集型分布式应用,并以Apache 2.0许可协议发布的开源软件框架。它支持在商品硬件构建的大型集群上运行的应用程序。Hadoop是根据Google公司发表的有关MapReduce和Google文件系统的论文设计的,称为社区版Hadoop。
第三方发行版Hadoop遵从Apache开源协议,用户可以免费地任意使用和修改Hadoop,也正是因此,市面上出现了很多Hadoop版本。其中有很多厂家在Apache Hadoop的基础上开发自己的Hadoop产品,比如Cloudera的CDH、Hortonworks的HDP、MapR的MapR产品等。
这两种版本各自优缺点如下:
官方网址:http://hadoop.apache.org/。
Aapche Hadoop优势:对硬件要求低,完全开源免费,社区活跃,文档、资料翔实。
Aapche Hadoop劣势:搭建烦琐,维护烦琐,升级烦琐,添加组件烦琐。
官方网址:https://www.cloudera.com/。
优势:
· 版本管理清晰。比如Cloudera CDH1、CDH2、CDH3、CDH4、CDH5等。后面加上补丁版本,如CDH4.1.0 patch level 923.142,表示在原生态Apache Hadoop 0.20.2基础上添加了1065个patch。
· 比Apache Hadoop在兼容性、安全性、稳定性上有增强。第三方发行版通常都经过了大量的测试验证,有众多部署实例,大量地运行在各种生产环境。
· 版本更新快。通常情况,比如CDH每个季度会有一个update,每一年会有一个release。
· 基于稳定版本Apache Hadoop,并应用了最新BUG修复或Feature的patch。
· 提供了部署、安装、配置工具,大大提高了集群部署的效率,可以在几个小时内部署好集群。
· 运维简单。提供了管理、监控、诊断、配置修改的工具,管理配置方便,定位问题快速、准确,运维工作简单、高效。
缺点:对硬件要求高。
第三方发行版本使用比较多的是CDH,其拥有最多的部署案例,提供强大的部署、管理和监控工具。Cloudera开发并贡献了可实时处理大数据的Impala项目,有强大的社区支持,当出现一个问题时,能够通过社区、论坛等网络资源快速获取解决方法。Cloudera Manager是一个管理CDH的端到端的应用,其主要作用包括:管理、监控、诊断、集成。
CDH的Hadoop版本集群中CDH管理界面如图1-2所示。
图1-2 CDH管理界面
CDH架构如图1-3所示。
(1)Server
管理控制台服务器和应用程序逻辑。
负责软件安装、配置,启动和停止服务。
管理服务运行的集群。
图1-3 CDH架构
(2)Agent
安装在每台主机上。
负责启动和停止进程,配置、监控主机。
(3)Management Service
由一组角色组成的服务,执行各种监视、报警和报告功能。
Hadoop生态系统组件主要包括:MapReduce、HDFS、HBase、Hive、Pig、ZooKeeper、Mahout、Flume、Sqoop,具体如图1-4所示。
图1-4 Hadoop生态系统组件
下面具体介绍其中的主要组件:
· MapReduce:MapReduce是使用集群的并行、分布式算法处理大数据集的可编程模型。Apache MapReduce是从Google MapReduce派生而来的,用于在大型集群中简化数据处理。当前的Apache MapReduce版本基于Apache YARN框架构建的。YARN是“Yet-Another-Resource-Negotiator”的缩写。YARN可以运行非MapReduce模型的应用。YARN是Apache Hadoop想要超越MapReduce数据处理能力的一种尝试。
· HDFS:The Hadoop Distributed File System(HDFS)提供跨多个机器存储大型文件的一种解决方案。Hadoop和HDFS都是从Google File System(GFS)中派生的。Hadoop 2.0.0之前,NameNode是HDFS集群的一个单点故障(SPOF)。利用ZooKeeper、HDFS高可用性特性解决了这个问题,提供选项来运行两个重复的NameNodes,在同一个集群中,同一个Active/Passive配置。
· HBase:灵感来源于Google BigTable。HBase是Google BigTable的开源实现,类似Google BigTable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理BigTable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google BigTable利用Chubby作为协同服务,HBase利用ZooKeeper作为协同服务。
· Hive:Facebook开发的数据仓库基础设施,用于数据汇总、查询和分析。Hive提供类似SQL的语言(不兼容SQL92)——HiveQL。
· Pig:Pig提供一个引擎在Hadoop并行执行数据流。Pig包含一种语言:Pig Latin,用来表达这些数据流。Pig Latin包括大量的传统数据操作(join、sort、filter等),也可以让用户开发他们自己的函数,用来查看、处理和编写数据。Pig在Hadoop上运行,在Hadoop分布式文件系统(HDFS)和Hadoop处理系统MapReduce中都可以使用。Pig使用MapReduce来执行所有的数据处理,编译Pig Latin脚本,用户可以编写一个系列、一个或者多个的MapReduce作业,然后执行。Pig Latin看起来跟大多数编程语言都不一样,没有if状态和for循环。
· ZooKeeper:ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂且容易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper是Google的Chubby一个开源的实现,是高效和可靠的协同工作系统。ZooKeeper能够用来执行Leader选举、配置信息维护等。在一个分布式的环境中,我们需要一个Master实例用来存储一些配置信息,确保文件写入的一致性等。
· Mahout:基于MapReduce的机器学习库和数学库。