4.1 管理数据,解析开源框架Hadoop
Hadoop是一种分析技术,也称“大数据”技术,其可快速收集、传播和分析海量数据。目前,该技术已被广泛用于Google、Yahoo、Facebook、eBay、LinkedIn、Zynga等网络服务。
4.1.1 Hadoop的主要特点
Hadoop是一个由Apache基金会开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,使用它来开发分布式程序,并充分利用集群的威力进行高速运算和存储。简而言之,Hadoop就是一个可以更容易开发和运行处理大规模数据的软件 平台。
Hadoop的主要特点如下:
➢ 可靠性(Reliable)。Hadoop能自动地维护数据的多份备份,并且在任务失败后能自动地重新部署(redeploy)计算任务。
➢ 扩容能力(Scalable)。Hadoop能可靠地(reliably)存储和处理千兆字节(PB)数据。
➢ 高效率(Efficient)。通过分发数据,Hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常快速。
➢ 成本低(Economical)。可以通过普通机器组成的服务器群来分发以及处理数据。另外,这些服务器群总计可达数千个节点。
专家提醒
Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements),这样可以流的形式访问(streaming access)文件系统中的数据。
4.1.2 Hadoop的发展历史
Hadoop的源头是Apache Nutch,该项目始于2002年,是Apache Lucene的子项目之一。Lucene是一个功能全面的文本索引和查询库,开发者可以使用Lucene引擎方便地在文档上添加搜索功能。例如,桌面搜索、企业搜索以及许多领域特定的搜索引擎使用的都是Lucene。
Lucene、Nutch和Hadoop这3个项目都是由Doug Cutting所创立的,每个项目在逻辑上都是前一个项目的演进。Doug Cutting起初的目标是从头开始构建一个网络搜索引擎,这样不但要编写一个复杂的、能够抓取和索引网站的软件,还需要面临没有专有运行团队支持运行它的挑战,因为它有很多的独立部件。Doug Cutting意识到,他们的架构将无法扩展到拥有数十亿网页的网络。
在2004年左右,Google发表了两篇论文来论述Google文件系统(GFS)和MapReduce框架。Google声称使用了这两项技术来扩展自己的搜索系统。具体而言,GFS会省掉管理所花的时间,如管理存储节点。
Doug Cutting立即看到了这些技术可以适用于Nutch,接着他的团队实现了一个新的框架,将Nutch移植上去,即Nutch的分布式文件系统(NDFS)。这种新的技术马上提升了Nutch的可扩展性,它开始能够处理几亿个网页,并能够运行在几十个节点的集群上。Doug Cutting认识到设计一个专门的项目可以充实两种网络扩展所需的技术,于是就有了Hadoop。
2006年1月,Doug Cutting加入雅虎(Yahoo),雅虎为他提供一个专门的团队和资源,准备将Hadoop发展成一个可在网络上运行的系统。两年后,Hadoop成为Apache的顶级项目。
2008年2月,雅虎宣布其索引网页的生产系统采用了在10000多个核的Linux集群上运行的Hadoop。此时,Hadoop才真正达到了万维网的规模。通过这次机会,Hadoop成功地被雅虎之外的很多公司应用,如Last.fm、Facebook和《纽约时报》。
Hadoop这个名字不是一个缩写,它是一个虚构的名字。为软件项目命名时,Doug Cutting似乎总会得到家人的启发。Lucene是他妻子的中间名,也是她外祖母的名字。他的儿子在咿呀学语时,总把所有用于吃饭的词叫成Nutch,后来儿子又把一个黄色大象毛绒玩具叫做Hadoop。Doug Cutting说:“我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。所以,我尝试生活中以前没有人用过的各种词汇,而孩子们很擅长创造单词。”
4.1.3 Hadoop的主要用途
得益于市场的宣传,企业用户对于“大数据”这一概念的接受程度越来越高,作为一个较为廉价并且开源的大数据解决方案——Hadoop,也越来越受到用户的关注。
那么,选用Hadoop系统能够为我们带来什么作用呢?
首先,Hadoop的方便和简单让其在编写和运行大型分布式程序方面占尽优势。Hadoop采用分布式存储方式来提高数据读写速度和扩大存储容量;采用MapReduce整合分布式文件系统上的数据,保证高速分析处理数据;与此同时还采用存储冗余数据来保证数据的安全性。
即使是在校的大学生也可以快速、廉价地建立自己的Hadoop集群。另一方面,它的健壮性和可扩展性又使它胜任雅虎和Facebook最严苛的工作。这些特性使Hadoop在学术界和工业界都大受欢迎。如图4-1所示为Hadoop的主要用途。
图4-1 Hadoop的主要用途
专家提醒
Hadoop中的HDFS具有高容错性,并且是基于Java语言开发的,这使得Hadoop可以部署在低廉的计算机集群中,同时不限于某个操作系统。Hadoop中HDFS的数据管理能力、MapReduce处理任务时的高效率以及它的开源特性,使其在同类分布式系统中大放异彩,并在众多行业和科研领域中被广泛应用。
4.1.4 Hadoop的项目结构
近几年分布式系统的发展越来越快,而Hadoop整套项目也起到了推波助澜的作用,而且Hadoop已经发展成为包含很多项目的集合。
Hadoop项目包括3部分:Hadoop Distributed File System(HDFS,分布式文件系统)、Hadoop MapReduce模型和Hadoop Common。虽然其核心内容是MapReduce和Hadoop分布式文件系统,但与Hadoop相关的Common、Avro、Chukwa、Hive、HBase等项目也是不可或缺的。它们提供了互补性服务或在核心层上提供了更高层的服务。Hadoop的项目结构如图4-2所示。
图4-2 Hadoop的项目结构
下面对Hadoop的各个关联项目进行更详细的介绍。
➢ Pig:一种编程语言,它简化了Hadoop常见的工作任务。Pig可加载数据、表达转换数据以及存储最终结果。
➢ Chukwa:Chukwa是一个开源的用于监控大型分布式系统的数据收集系统,其可以用于监控大规模(2000+以上的节点,每天产生数据量在TB级别)Hadoop集群的整体运行情况并对它们的日志进行分析。Chukwa是构建在Hadoop的HDFS和MapReduce框架之上的,继承了Hadoop的可伸缩性和鲁棒性。Chukwa还包含了一个强大和灵活的工具集,可用于展示、监控和分析已收集的数据。
➢ Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,其可以将SQL语句转换为Map Reduce任务进行运行。Hive的优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计 分析。
➢ HBase:HBase是一个分布式的、面向列的开源数据库,类似Google BigTable的分布式NoSQL列数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
➢ MapReduce:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。MapReduce极大地方便了编程人员的工作,即使在不了解分布式并行编程的情况下,也可以将自己的程序运行在分布式系统上。MapReduce在执行时先指定一个Map(映射)函数,其把输入键值对映射成一组新的键值对,经过一定处理后交给Reduce(化简), Reduce对相同key下的所有value进行处理后再输出键值对作为最终的结果。
➢ HDFS:HDFS是一个分布式文件系统。HDFS原本是开源的Apache项目Nutch的基础结构,最后它却成为了Hadoop基础架构之一。HDFS放宽了对可移植操作系统接口(Portable Operating System Interface, POSIX)的要求,这样可以实现以流的形式访问文件系统中的数据。
➢ ZooKeeper:ZooKeeper是一个针对大型分布式系统的可靠协调系统,提供的功能有配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户,提供类似Google Chubby(分布式锁服务)的功能。
➢ Core(酷睿):酷睿是一款由英特尔设计的节能新型微架构,设计的出发点是提供卓然出众的性能和能效,提高每瓦特性能,也就是所谓的能效比。
➢ Avro:Avro是用于数据序列化的系统,其提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用RPC的功能和简单的动态语言集成功能。其中代码生成器既不需要读写文件数据,也不需要使用或实现RPC协议,它只是一个可选的对静态类型语言的实现。
专家提醒
Common是为Hadoop其他子项目提供支持的常用工具,它主要包括FileSystem、RPC和串行化库。它们为在廉价硬件上搭建云计算环境提供基本的服务,并且会为运行在该平台上的软件开发提供所需的API。在Hadoop 0.20及以前的版本中,包含HDFS、MapReduce和其他项目公共内容,从0.21开始HDFS和MapReduce被分离为独立的子项目,其余内容为Hadoop Common。
4.1.5 Hadoop的体系结构
Hadoop的整个体系结构主要是通过HDFS来实现对分布式存储的底层支持,并且通过MapReduce来实现对分布式并行任务处理的程序支持。可以说,HDFS和MapReduce是Hadoop的两大核心体系结构。
1.HDFS的体系结构
HDFS是一个主从结构(Master/Slave)模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。如图4-3所示为HDFS的体系结构。
图4-3 HDFS的体系结构
➢ NameNode(名称节点):NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作。
➢ DataNode(数据节点):集群中的DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据,从内部来看,文件被分成若干个数据块,而且这若干个数据块存放在一组DataNode上。
NameNode执行文件系统的命名空间操作,例如,打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。
2.MapReduce的体系结构
MapReduce是一种并行编程模式,这种模式使得软件开发者可以轻松地编写出分布式并行程序。MapReduce框架是由一个单独运行在主节点上的Job Tracker和运行在每个集群从节点上的Task Tracker共同组成的。当一个Job被提交时,Job Tracker接收到提交作业和其配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控Task Tracker的执行。
很多人也许看不明白,下面笔者举个简单的例子来说明MapReduce结构的作用。假设你是幼儿园的老师,带着一群小朋友做一个加减乘除的游戏,你给每一个小朋友出一道题目,然后让他算好后给你报告答案,你再给他出一道题目,周而复始如此做。如果只有十几个小朋友在算,相信你可以轻松应付;如果上了一百个小朋友,估计每个人都会争着表现,叫嚷着让你出题,这时你肯定会感到不堪重负。
面对这样的场景,我们通常的经验是“再拽的算法也难以抵挡海量的数据或任务”。因此,应对方法主要还是增加资源,其次才是优化算法,而且两者可并行。即小朋友在增加的同时,我们也相应地增加老师的数量,通过这样的途径来缓解每个老师的压力。
与这种场景类似,MapReduce结构也面临类似的问题。越来越多的Task Tracker(小朋友)会让有限的Job Tracker(老师)很有压力,以至于Task Tracker有很多时,Job Tracker不能及时响应请求,很多Task Tracker就让资源空闲着,等待Job Tracker的response(响应)。因此,如何优化MapReduce结构,也是各个大数据分析平台急需解决的难题。
总之,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现了分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。