第 1 章 ? Hadoop概述 ? 1.1 Hadoop简介 1. Hadoop的由来 Hadoop是Doug Cutting(Apache Lucene创始人)开发的、使用广泛的文本搜索库。Hadoop起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Lucene项目的一部分。 2. Hadoop名字的起源 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云计算将4 TB的报纸扫描文档压缩,转换为用于Web的PDF文件。 这个过程历时不到24小时,使用100台机器运行,如果不结合亚马逊的按小时付费的模式(即允许《纽约时报》在很短的一段时间内访问大量机器)和Hadoop易于使用的并行程序设计模型,该项目很可能不会这么快开始启动。 2008年4月,Hadoop打破世界纪录,成为最快排序1 TB数据的系统,运行在一个910节点的集群,Hadoop在209秒内排序了1 TB的数据(还不到三分半钟),击败了前一年的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。 3. Hadoop大事记 2004年,最初的版本(现在称为HDFS和MapReduce)由Doug Cutting和Mike Cafarella开始实施。 2005年12月,Nutch移植到新的框架,Hadoop在20个节点上稳定运行。 2006年1月,Doug Cutting加入雅虎。 2006年2月,Apache Hadoop项目正式启动以支持MapReduce和HDFS的独立发展。 2006年2月,雅虎的网格计算团队采用Hadoop。 2006年4月,标准排序(10 GB每个节点)在188个节点上运行47.9个小时。 2006年5月,雅虎建立了一个300个节点的Hadoop研究集群。 2006年5月,标准排序在500个节点上运行42个小时(硬件配置比4月的更好)。 2006年11月,研究集群增加到600个节点。 2006年12月,标准排序在20个节点上运行1.8个小时,100个节点3.3小时,500个节点5.2小时,900个节点7.8个小时。 2007年1月,研究集群到达900个节点。 2007年4月,研究集群达到两个1000个节点的集群。 2008年4月,赢得世界最快1 TB数据排序在900个节点上用时209秒。 2008年10月,研究集群每天装载10 TB的数据。 2009年3月,17个集群总共24 000台机器。 2009年4月,赢得每分钟排序,59秒内排序500 GB(在1400个节点上)和173分钟内排序100 TB数据(在3400个节点上)。 1.2 Hadoop版本和生态系统 1. Hadoop版本的优缺点 目前市面上Hadoop版本主要有两种:Apache版本和CDH版本。 (1)Aapche 版本的Hadoop 官网:http://hadoop.apache.org/ Aapche Hadoop 优势:对硬件要求低。 Aapche Hadoop 劣势:搭建烦琐,维护烦琐,升级烦琐,添加组件烦琐。 Apache版本Hadoop集群中YARN的界面如图1-1所示,HDFS的界面图1-2 所示。 图1-1 YARN的界面 图1-2 HDFS的界面 (2)CDH版本的Hadoop 官网:https://www.cloudera.com/ CDH优势:搭建方便,维护较为容易,升级以及迁移容易,添加组件容易。 CDH缺点:对硬件要求高。 Cloudera Manager是一个管理CDH的端到端的应用。主要作用包括:管理、监控、诊断、集成。 CDH的Hadoop版本集群中CDH管理界面如图1-3所示。 图1-3 CDH管理界面 2. CDH架构 CDH 架构如图1-4所示。 图1-4 CDH架构 (1)Server 管理控制台服务器和应用程序逻辑。 负责软件安装、配置,启动和停止服务。 管理服务运行的集群。 (2)Agent 安装在每台主机上。 负责启动和停止进程,配置、监控主机。 (3)Management Service 由一组角色组成的服务,执行各种监视、报警和报告功能。 3. Hadoop生态系统和组件介绍 Hadoop生态组件主要包括:MapReduce、HDFS、HBase、Hive、Pig、ZooKeeper、Mahout。Hadoop生态系统组件如图1-5所示。 图1-5 Hadoop生态系统组件 (1)MapReduce:MapReduce 是使用集群的并行、分布式算法处理大数据集的可编程模型。Apache MapReduce 是从 Google MapReduce 派生而来的:在大型集群中简化数据处理。当前的 Apache MapReduce 版本基于 Apache YARN 框架构建。YARN是“Yet-Another-Resource-Negotiator”的缩写。YARN 可以运行非 MapReduce 模型的应用。YARN 是 Apache Hadoop 想要超越 MapReduce 数据处理能力的一种尝试。 (2)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 配置。 (3)HBase:灵感来源于 Google BigTable。HBase 是 Google Bigtable 的开源实现,类似 Google Bigtable 利用 GFS 作为其文件存储系统,HBase 利用 Hadoop HDFS 作为其文件存储系统;Google 运行 MapReduce 来处理 Bigtable 中的海量数据,HBase 同样利用 Hadoop MapReduce 来处理 HBase 中的海量数据;Google Bigtable 利用 Chubby 作为协同服务,HBase 利用 ZooKeeper 作为对应。 (4)Hive:Facebook开发的数据仓库基础设施。数据汇总、查询和分析。Hive 提供类似 SQL 的语言(不兼容 SQL92):HiveQL。 (5)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循环。 (6)ZooKeeper:ZooKeeper 是 Hadoop 的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper 是 Google 的 Chubby 一个开源的实现,是高效和可靠的协同工作系统。ZooKeeper 能够用来执行leader 选举、配置信息维护等。在一个分布式的环境中,我们需要一个 Master 实例用来存储一些配置信息,确保文件写入的一致性等。 (7)Mahout :基于MapReduce 的机器学习库和数学库。 1.3 MapReduce简介 1. MapReduce是什么 MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义: (1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。 (2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。 (3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。 2. MapReduce的由来 MapReduce最早是由Google公司研究提出的一种面向大规模数据处理的并行计算模型和方法。Google公司设计MapReduce的初衷主要是为了解决其搜索引擎中大规模网页数据的并行化处理。Google公司发明了MapReduce之后,首先用其重新改写了搜索引擎中的Web文档索引处理系统。但由于MapReduce可以普遍应用于很多大规模数据的计算问题,因此自发明MapReduce以后,Google公司内部进一步将其广泛应用于很多大规模数据处理问题。到目前为止,Google公司内有上万个各种不同的算法问题和程序都使用MapReduce进行处理。 2003年和2004年,Google公司在国际会议上分别发表了两篇关于Google分布式文件系统和MapReduce的论文,公布了Google的GFS和MapReduce的基本原理和主要设计思想。2004年,开源项目Lucene(搜索索引程序库)和Nutch(搜索引擎)的创始人Doug Cutting发现MapReduce正是其所需要的解决大规模Web数据处理的重要技术,因而模仿Google MapReduce,基于Java设计开发了一个称为Hadoop的开源MapReduce并行计算框架和系统。自此,Hadoop成为Apache开源组织下最重要的项目,自其推出后很快得到了全球学术界和工业界的普遍关注,并得到推广和普及应用。 MapReduce的推出给大数据并行处理带来了巨大的革命性影响,使其已经成为事实上的大数据处理的工业标准。尽管MapReduce还有很多局限性,但人们普遍公认,MapReduce是到目前为止更为成功、更广为接受和更易于使用的大数据并行处理技术。MapReduce的发展普及和带来的巨大影响远远超出了发明者和开源社区当初的意料,以至于马里兰大学教授、2010年出版的Data-Intensive Text Processing with MapReduce一书的作者Jimmy Lin在书中提出:MapReduce改变了我们组织大规模计算的方式,它代表了第一个有别于冯?诺依曼结构的计算模型,是在集群规模而非单个机器上组织大规模计算的、新的抽象模型上的第一个重大突破,是到目前为止所见到的最为成功的基于大规模计算资源的计算模型。 3. MapReduce设计目标 MapReduce是一种可用于数据处理的编程框架。MapReduce采用“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是“任务的分解与结果的汇总”。 在分布式计算中,MapReduce框架负责处理并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。 4. MapReduce适用场景 用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。 1.4 HDFS简介 1. HDFS是什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。目前HDFS是Apache Hadoop Core项目的一部分。 2. HDFS的由来 我们知道HDFS源于Google发布的GFS论文。HDFS是Hadoop Distribute File System 的简称,是Hadoop的一个分布式文件系统。 3. HDFS设计目标 ? 大文件存储:支持TB、PB级的数据量。 ? 高容错:运行在商业硬件上,而商业硬件并不可靠。 ? 高吞吐量:为大量数据访问的应用提供高吞吐量支持。 4. HDFS适用场景与不适用场景 HDFS适用场景与不适用场景如表1-1所示。 表1-1 HDFS适用场景与不适用场景 适用场景 不适用场景 大文件访问 流式数据访问 存储大量小文件 随机读取,低延迟读取 5. HDFS的基本概念 (1)数据块(block) 大文件会被分割成多个block进行存储,block大小默认为128MB。小于一个块大小的文件不会占据整个块的空间。 每一个block会在多个DataNode上存储多份副本,默认是3份。 比如:1MB的文件有1个block块,128MB的文件有1个block块,129MB的文件有2个block块。 (2)NameNode 记录文件系统的元数据,单一主元数据服务器,其中包括每个文件、文件位置以及这些文件所在的DataNode内的所有数据块的内存映射。维护文件系统树及整棵树内所有的文件和目录。 (3)DataNode 负责存储和检索数据块,它受客户端和NameNode调度,并且它会定期向NameNode发送本节点上所存储的块列表,这就是为什么NameNode并不是永久保存各个节点块信息的原因了。 1.5 Eclipse+Java开发环境搭建 1.5.1 Java安装 1. Java安装步骤 本书中Java版本为java1.8.0_77,安装步骤如图1-6至图1-9所示,不再详细说明,读者注意一下安装的版本即可。 图1-6 安装步骤一 图1-7 安装步骤二 图1-8 安装步骤三 图1-9 安装步骤四 2. Java环境变量及测试 配置Java环境变量,步骤为:控制面板→系统和安全→系统→高级系统设置。Java环境变量设置如图1-10所示。 图1-10 Java环境变量设置 测试Java安装是否成功,在命令行窗口运行java -version命令。Java测试如图1-11所示。 图1-11 Java测试 1.5.2 Maven安装 1. Maven下载 本书中采用的是Maven3.3.3版本,下载之后,把文件apache-maven-3.3.3-bin.tar.gz解压放入D:\Java目录中。 2. Maven 配置 Maven下载后,需要配置环境变量,将Maven解压后的bin目录配置到环境变量中,Maven环境变量设置如图1-12所示,这里用的是3.3.3版本,并安装在D盘根目录下。 图1-12 Maven环境变量设置 3. Maven 测试 可打开命令行,输入命令mvn -v进行测试。Maven测试如图1-13所示(出现版本信息,即表示配置成功)。 图1-13 Maven测试 1.5.3 Eclipse安装和配置 本书中Eclipse版本为eclipse4.4.2,下载解压之后放入D:\Java目录下面,且创建快捷键到桌面。Eclipse解压结果如图1-14所示,Eclipse创建启动快捷方式如图1-15所示。 图1-14 Eclipse解压结果 图1-15 Eclipse创建启动快捷方式 创建Eclipse的workspace目录D:\Java\eclipseworkspace,并设置Eclipse的工作空间eclipseworkspace,如图1-16所示。 图1-16 设置Eclipse的eclipseworkspace 1. Eclipse加载本地Java Eclipse添加Java步骤如图1-17所示。 图1-17 Eclipse添加Java 2. Eclipse运行测试 建立测试类运行如图1-18所示。 图1-18 Eclipse建立测试类运行 3. Eclipse加载Maven 选择Window→Preferences→Maven→Installations,单击“Add”添加Maven目录。Eclipse加载Maven的步骤如图1-19所示。 图1-19 Eclipse加载Maven的步骤 4. Eclipse中maven配置 默认的Maven仓库位置为:C:\Users\Administrator\.m2(其中Administrator为当前系统用户账号)。Eclipse设置Maven仓库的位置如图1-20所示。 图1-20 Eclipse设置Maven仓库的位置 Maven仓库位置的配置文件是D:\Java\apache-maven-3.3.3\conf\settings.xml。settings.xml设置内容如图1-21所示,Eclipse加载settings.xml步骤如图1-22所示。 图1-21 settings.xml设置内容 图1-22 Eclipse加载settings.xml步骤 5. Eclipse中Maven测试 这是Eclipse中的pom.xml文件,加入下列内容保存之后,Eclipse就自动下载依赖包。pom.xml自动下载的包如图1-23所示。 org.apache.kafka kafka-clients 0.9.0.1 图1-23 pom.xml自动下载的包 1.5.4 Eclipse创建Maven项目 Eclipse创建Maven项目步骤如图1-24~图1-26所示。 图1-24 Eclipse创建Maven项目一 图1-25 Eclipse创建Maven项目二 图1-26 Eclipse创建Maven项目三 单击Finish按钮完成。Maven加载本地Java步骤如图1-27所示。 图1-27 Maven加载本地Java步骤 项目建立完后Eclipse的整体展示如图1-28所示。 图1-28 项目建立完后Eclipse的整体展示 1.5.5 Eclipse其余配置 1. Eclipse中 Runnable JAR file 的历史记录 用Eclipse打包jar的时候,需要指定一个main函数。需要先运行一下main函数,Eclipse的Runnable JAR File Specification 下的Launch configuration下拉列表才会有记录。如果想要删除下拉列表里的历史记录,只需要进入到要打包的这个工程所在的目录。 ? Linux: /.metadata/.plugins/org.eclipse.debug.core/.launches ? Windows: E:\Java\eclipseworkspace\.metadata\.plugins\org.eclipse.debug.core\.launches 2. 主题 Eclipse主题设置如图1-29所示。 图1-29 Eclipse主题设置 3. 字体 Java代码字体设置如图1-30所示,Java代码背景设置如图1-31所示。 图1-30 Java代码字体设置 图1-31 Java代码背景设置 4. Debug当前行颜色 Debug当前行颜色配置如图1-32所示。 图1-32 Debug当前行颜色配置 1.6 小结 本章讲解了Hadoop的简介、Hadoop由来与起源、大事年表,接着介绍了Hadoop常用版本优缺点以及生态组件,之后介绍了Hadoop中两个重要组件MapReduce和HDFS,最后引导读者安装Hadoop的开发环境,包括Java、Maven、Eclipse。