Hadoop海量数据处理:技术详解与项目实战(第2版)

978-7-115-42746-5
作者: 范东来
译者:
编辑: 杨海玲
分类: Hadoop

图书目录:

详情

本书介绍了Hadoop技术的相关知识,并将理论知识与实际项目相结合。全书共分为三个部分:基础篇、应用篇和总结篇。基础篇详细介绍了Hadoop、YARN、MapReduce、HDFS、Hive、Sqoop和HBase,并深入探讨了Hadoop的运维和调优;应用篇则包含了一个具有代表性的完整的基于Hadoop的商业智能系统的设计和实现;结束篇对全书进行总结,并对技术发展做了展望。

图书摘要

版权信息

书名:Hadoop海量数据处理:技术详解与项目实战(第2版)

ISBN:978-7-115-42746-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    范东来

  责任编辑 杨海玲

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


本书介绍了Hadoop技术的相关知识,并将理论知识与实际项目相结合。全书共分为三个部分:基础篇、应用篇和总结篇。基础篇详细介绍了Hadoop、YARN、MapReduce、HDFS、Hive、Sqoop和HBase,并深入探讨了Hadoop的运维和调优;应用篇则包含了一个具有代表性的完整的基于Hadoop的商业智能系统的设计和实现;结束篇对全书进行总结,并对技术发展做了展望。

本书结构针对学习曲线进行了优化,由浅至深,从理论基础到项目实战,适合Hadoop的初学者阅读,也适合作为高等院校相关课程的教学参考书。


作为作者的老师,我很欣喜地看到作者的成长,正如这本书一样。

本书第1版问世后,得到了读者认可,市场反响也不错,而且其台湾繁体字版也于2015年问世。时间过得真快,我依然记得作者抱着第1版初稿到我办公室的那个下午,我们聊了很久。就一两年的时间,大数据技术已发生了巨大的变化,本书第2版的出版也就成了顺理成章的事。第2版根据最新技术做了全面修订,并新增了YARN和HBase的章节,更加全面和实用。

大数据本质上是一种思想,代表了数据的深度和广度。读者当然可以从本书学到Hadoop相关的技术,但这并不是最重要的,最重要的是能够用大数据的思想来思考和解决问题。

大数据天然地能够和几乎任意行业相结合,如金融、医疗、电商,但是这些都需要行业应用来支撑,需要各位读者来积极投身其中。中国的互联网土壤非常肥沃,这给了大数据非常好的发展基础。目前国内的大数据活跃程度丝毫不亚于国外,在大数据方面,中国很有机会弯道超车,成为世界一流。这是大数据最好的时代,充满了机遇与挑战。

但是,“路漫漫其修远兮”,希望这本书能够帮到更多的人。

北京软件行业协会执行会长

北京航空航天大学软件学院教授

2016年6月,北京


这是一本大数据工程师和Hadoop工程师的必备书。

近年来,由于移动互联网的高速发展和智能移动设备的普及,数据累积的速率已超过以往任何时候,这个世界已经进入了大数据时代。如何高效地存储、处理这些海量、多种类、高速流动的数据已成为亟待解决的问题。

Hadoop最早来源于全球云计算技术的领导者谷歌在2003年至2006年间发表的三篇论文。得益于学术界和工业界的大力支持,Hadoop目前已成为最为成熟的大数据处理技术。Hadoop利用了“分而治之”的朴素思想为大数据处理提供了一整套新的解决方案,如分布式文件系统HDFS、分布式计算框架MapReduce、NoSQL数据库HBase、数据仓库工具Hive等。Hadoop打破了传统数据处理技术的瓶颈,如样本容量、样本种类,让大数据真正成为了生产力。Hadoop目前已广泛应用于各行各业,行业巨头也纷纷推出自己的基于Hadoop的解决方案。今天,Hadoop已经在电信业、能源业等有了一定的用户基础,传统数据分析架构也逐渐在向Hadoop进行过渡。

大数据和大数据处理技术在相互促进,大数据刺激了大数据处理技术的发展,而大数据处理技术又加速了大数据应用落地。大数据催生了一批新的产业,并产生了对Hadoop工程师的庞大迫切需求,而目前有关Hadoop的书籍和在线材料仍然太少,这更进一步加大了人才缺口。

本书章节安排合理,结构清晰,内容由浅入深,循序渐进。作者是我的学生,作为一个奋战在大数据第一线的工程师,经验非常丰富,能够更加理解并贴近开发者和读者的需求。全书涵盖了HDFS、MapReduce、Hive、Sqoop等内容,尤其宝贵的是包含了大量动手实例和一个完备的Hadoop项目实例。我相信本书对于希望学习Hadoop的读者来说,是一个不错的选择。

北京软件行业协会执行会长

北京航空航天大学软件学院教授、院长

2014年12月,北京


2013年被称为“大数据元年”,标志着世界正式进入了大数据时代,而就在这一年,我加入了清华大学苏州汽车研究院大数据处理中心,从事Hadoop的开发、运维和数据挖掘等方面的工作。从出现之日起,Hadoop就深刻地改变了人们处理数据的方式。作为一款开源软件,Hadoop能让所有人享受到大数据红利,让所有人在大数据时代站在了同一起跑线上。Hadoop很好地诠释了什么是“大道至简,衍化至繁”,Hadoop来源于非常朴素的思想,但是却衍生出大量的组件,让初学者难以上手。

我在学习和工作的过程中,走过很多弯路也做过很多无用功,尽管这是学习新技术的必由之路,但却浪费了大量的时间。我将自己学习和工作的心得记录下来,为了帮助更多像我当年一样的Hadoop学习者,我决定写一本书,一本自己开始Hadoop职业生涯的时候也想读到的书。

本书结构针对学习曲线进行了优化,本书由浅至深,从理论基础到项目实战。

本书最大的特点是面向实践。基础篇介绍了Hadoop及相关组件,包含了大量动手实例,而应用篇则包含了一个具有代表性的基于Hadoop的项目完整实例,该实例脱胎于生产环境的真实项目,在通过基础篇的学习后,读者将在应用篇得到巩固和升华,并对Hadoop有一个更加清晰和完整的认识,这也符合实践出真知的规律。

本书介绍了Hadoop主要组件,如HDFS、YARN、MapReduce、Hive、Sqoop、HBase等,还介绍了Hadoop生产环境下的调优和运维、机器学习算法等高级主题。

全书内容由浅入深,既适合初学者入门,也适合有一定基础的技术人员进一步提高技术水平,本书特别适合循序渐进地学习。本书的读者对象包括:

本书第1版于2014年下半年完稿,次年年初出版,当时Hadoop正值急速发展的时期,很多组件都没有实现自己的最终形态。到目前为止,Hadoop离我完成本书第1版之时已有较大变化并已基本稳定。

很多读者在阅读过程中给我来信,说书中使用的Hadoop版本较老(CDH3),而且没有YARN和HBase的内容。收到读者的反馈,加之HBase 1.0版已经发布,CDH5已经基本普及,我就开始本书第2版的写作工作,于是呈现在读者面前的就是全新的《Hadoop海量数据处理》。第2版主要做了以下修改和内容增补:

本书在章节的安排上旨在引导读者以最快的速度上手Hadoop,而省去其他不必要的学习过程。如果你是一个有经验的Hadoop工程师或者是项目经理,也可以直接进入应用篇,关注项目的设计和实现;如果不是,还是建议你循序渐进地阅读本书方能获得最好的学习效果。

本书一共分为基础篇、应用篇和结束篇3个部分,一共18章。

基础篇从第1章至第9章,其中第1章为绪论,第2章为环境准备,第3章至第8章主要介绍HDFS、YARN、MapReduce、Hive、Sqoop、HBase的原理和使用,在此之上,第9章介绍Hadoop的性能调优和运维。读者将从基础篇获得Hadoop工程师的理论基础。

应用篇从第9章至19章,主要内容为一个基于Hadoop的在线图书销售商业智能系统的设计和实现,包含了系统需求说明、总体设计和完整的实现。应用篇会运用基础篇的知识,巩固并升华基础篇的学习效果。此外,应用篇的项目架构可以进行一些改动并推而广之,有一定的参考价值。读者将从应用篇获得Hadoop工程师的项目经验。

结束篇为第20章,将对全书进行总结,并对技术发展做了展望。

写书就像是跳水,高高跳起跃入水中,但在浮出水面之前,运动员却无法知道评委的给分,而我期待读者的评价。由于作者水平有限,编写时间仓促,书中难免会出现一些错误,恳请读者批评指正。读者可以将对本书的反馈和疑问发到ddna_1022@163.com,我将尽力为读者提供满意的回复。

感谢电子科技大学的赵勇教授、北京航空航天大学的孙伟教授和邵兵副教授,从您们身上我学到了严谨的学术精神和做人的道理。

感谢清华大学苏州汽车研究院大数据处理中心的林辉主任,您的锐意进取精神一直深留我心。

感谢周俊琨、肖宇、赵虎、李为、黄普、朱游强、熊荣、江彦平,没有你们的帮助和努力,本书不可能完成。

感谢我的父母和外婆这些年来在生活上对我无微不至的关怀和无时无刻的支持,你们辛苦了;感谢吴静宜和她的家人对我的支持;感谢范若云哥哥,是你改变了我。

感谢人民邮电出版社的杨海玲编辑在本书出版过程中给予我的指导和一如既往的信任,感谢庞燕博士为审阅本书第1版付出的辛勤劳动。

感谢所有在我求学路上帮助过我的人。

范东来

2016年6月于成都


本书的第一部分相当于工具的使用手册,将会介绍Hadoop的核心组件:HDFS、YARN、MapReduce、Hive、Sqoop和HBase,并在此基础上,进一步学习Hadoop性能调优和运维。通过这部分的学习,读者将获得Hadoop工程师的理论基础。


这是最好的时代,这是最坏的时代;这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬……

——狄更斯《双城记》

本章作为绪论,目的是在学习Hadoop之前,让读者理清相关概念以及这些概念之间的联系。

Hadoop从问世之日起,就和云计算有着千丝万缕的联系。本节将在介绍Hadoop的同时,介绍Hadoop和云计算之间的关系,为后面的学习打下基础。

如果你是一名创业者或者是一名项目经理,那么最好准备一份“电梯演讲”。所谓电梯演讲,是对自己产品的简单介绍,通常都是1~2分钟(电梯从1层~30层的时间),以便如果你恰巧和投资人挤上同一部电梯的时候,能够说服他投资你的项目或者产品。

在做Hadoop的电梯演讲之前,先来恶补一下Hadoop的有关知识。来看看Hadoop的发布者Apache软件基金会(ASF)对Hadoop的定义:Hadoop软件库是一个框架,允许在集群中使用简单的编程模型对大规模数据集进行分布式计算。它被设计为可以从单一服务器扩展到数以千计的本地计算和存储的节点,并且Hadoop会在应用层面监测和处理错误,而不依靠硬件的高可用性,所以Hadoop能够在一个每个节点都有可能出错的集群之上提供一个高可用服务。

从上面的定义可以看出Hadoop的如下几个特点。

1.Hadoop是一个框架

很多初学者在学习Hadoop的时候,对Hadoop的本质并不十分了解,Hadoop其实是由一系列的软件库组成的框架。这些软件库也可称作功能模块,它们各自负责了Hadoop的一部分功能,其中最主要的是Common、HDFS和YARN。HDFS负责数据的存储,YARN负责统一资源调度和管理,Common则提供远程过程调用RPC、序列化机制等。

而从字面来说:Hadoop没有任何实际的意义。Hadoop这个名字不是缩写,它是一个虚构的名字。Hadoop的创建者Doug Cutting这样解释Hadoop这一名称的来历:“这个名字是我的孩子给一头吃饱了的棕黄色大象取的。我的命名标准是简短,容易发音和拼写,没有太多含义,并且不会被用于别处。小孩子是这方面的高手。”所以我们看到这头欢快的大象也随着Hadoop的流行而逐渐深入人心(如图1-1所示)。

图1-1 Hadoop的LOGO

2.Hadoop适合处理大规模数据

这是Hadoop一个非常重要的特点和优点,Hadoop海量数据的处理能力十分可观,并且能够实现分布式存储和分布式计算,有统一的资源管理和调度平台,扩展能力十分优秀。在2008年的时候,Hadoop打破297 s的世界纪录,成为最快的TB级数据排序系统,仅用时209 s。

3.Hadoop被部署在一个集群上

承载Hadoop的物理实体,是一个物理的集群。所谓集群,是一组通过网络互联的计算机,集群里的每一台计算机称作一个节点。Hadoop被部署在集群之上,对外提供服务。当节点数量足够多的时候,故障将成为一种常态而不是异常现象,Hadoop在设计之初就将故障的发生作为常态进行考虑,数据的灾备以及应用的容错对于用户来说都是透明的,用户得到的只是一个提供高可用服务的集群。

了解了上面三点,我们就可以开始准备电梯演讲了。麦肯锡对电梯演讲的要求是“凡事要归纳为三点”,因为人们一般只能记得住一二三而记不住四五六,基于此,我们的Hadoop电梯演讲为“Hadoop是一个提供分布式存储和计算的软件框架,它具有无共享、高可用、弹性可扩展的特点,非常适合处理海量数据”,一共46个字。

一般来说,狭义的Hadoop仅代表了Common、HDFS、YARN和MapReduce模块。但是开源世界的创造力是无穷的,围绕Hadoop有越来越多的软件蓬勃出现,方兴未艾,构成了一个生机勃勃的Hadoop生态圈。在特定场景下,Hadoop有时也指代Hadoop生态圈。

图1-2所示是一个Hadoop生态圈的架构图。

图1-2 Hadoop生态圈

说Hadoop催生了一个产业毫不过分,目前围绕Hadoop做二次开发的公司非常多,其中最著名的当属Cloudera、Hortonworks和MapR(Cloudera、Hortonworks和MapR公司的标识如图1-3所示)。这三家公司技术实力都非常雄厚,其中Cloudera开发的CDH(Cloudera’s Distribution for Hadoop)已成为生产环境下装机量最大Hadoop发行版。CDH的特点在于稳定,并有许多重要的补丁、向后移植和更新。而Hontonworks比较有名的则是DAG(有向无环图)计算框架Tez。在一些应用场景中,为了利用MapReduce解决问题,需将问题分解为若干个有依赖关系的作业,形如一个有向无环图,目前MapReduce计算框架并不支持依赖关系为有向无环图的作业计算,而Tez的出现很好地解决了这一问题。另外,YARN这个重要组件也是由Hortonworks公司贡献。MapR公司的拳头产品MapR Converged Data Platform专注于数据的快速分析,Apache Drill也是由MapR主导开发的。

图1-3 Cloudera、Hortonworks和MapR

云计算自从诞生之日起,短短几年就在各个行业产生了巨大的影响,而Hadoop作为云计算时代最耀眼的明星,又和云计算的提出者Google有着千丝万缕的联系。

自从2006年8月9日Google首席执行官埃里克·施密特在搜索引擎大会(SES San Jose 2006)率先提出了“云计算”这个名词后,其概念众说纷纭,相关领域的各方机构和专家分别从不同的角度对云计算进行了定义,有的从应用场景划分,有的从资源角度划分。本书选取美国国家标准技术研究院(NIST)对云计算的定义:“云计算是一种可以通过网络方便地接入共享资源池,按需获取计算资源(这些资源包括网络、服务器、存储、应用、服务等)的服务模型。共享资源池中的资源可以通过较少的管理代价和简单业务交互过程而快速部署和发布。”

从上面这个定义可以归纳出云计算的5个特点。

(1)按需提供服务:以服务的形式为用户提供应用程序、数据存储、基础设施等资源,并可以根据用户需求自动分配资源,而不需要系统管理员干预。例如,亚马逊弹性计算云(Amazon Elastic Compute Cloud,Amazon EC2),用户可以通过填写Web表单将自己所需要的配置,如CPU核数、内存大小提交给亚马逊,从而动态地获得计算能力。

(2)宽带网络访问:用户可以利用各种终端设备(如PC机、笔记本电脑、智能手机等)随时随地通过互联网访问云计算服务。

(3)资源池化:资源以共享资源池的方式统一管理。利用虚拟化技术,将资源分享给不同用户,资源的放置、管理与分配策略对用户透明。

(4)高可伸缩性:服务的规模可快速伸缩,以自动适应业务负载的动态变化。用户使用的资源同业务的需求相一致,避免了因为服务器性能过载或冗余而导致的服务质量下降或资源浪费。

(5)可量化的服务:云计算中心都可以通过监控软件监控用户的使用情况,并根据资源的使用情况对服务计费。

另外云计算还有些比较明显且重要的特点。

(1)大规模:承载云计算的集群一般都具有超大的规模,Google的有“信息核电站”之称的云计算中心具有100多万台服务器,Amazon、IBM、微软和雅虎等公司的“云”均具有几十万台服务器的规模,从这点上来看,云将赋予用户前所未有的计算能力。

(2)服务极其廉价:“云”的特殊容错机制使得可以采用廉价的节点来构建“云”;“云”的自动化管理使数据中心管理成本大幅降低;“云”的公用性和通用性使资源的利用率大幅提升;“云”设施可以建在电力丰富的地区,从而大幅降低能源成本。因此“云”具有极高的性价比。Google中国区前总裁李开复称,Google每年投入约16亿美元构建云计算数据中心,所获得的能力相当于使用传统技术投入640亿美元,构建云计算数据中心投入成本是使用传统技术投入成本的1/40。根据微软公布的数据,使用微软的云计算平台Windows Azure的解决方案部署自己的Web应用,将会节约三分之一的成本,而成本还将会随着使用时间的延长而进一步降低。这正是为什么不仅CTO关注云计算,连CEO和CFO也对云计算高度关注的原因。

之所以称之为“云”,是因为云计算在某些地方和现实中的云非常符合,云的规模可以动态伸缩,它的边界是模糊的,云在空中飘忽不定,无法也无需确定它的具体位置,但它确实存在于某处。

云计算按照服务类型大致可以分为基础设施即服务(Infrastructure as a Service,IaaS)、平台即服务(Platform as a Service,PaaS)、软件即服务(Software as a Service,SaaS)3类,如图1-4所示。

图1-4 云计算的类型

IaaS作为云计算架构最底层,利用虚拟化技术将硬件设备等基础资源封装成服务供用户使用,用户相当于在使用裸机,既可以让它运行Windows,也可以让它运行Linux,既可以做Web服务器,也可以做数据库服务器(架构如图1-5所示),但是用户必须考虑如何才能让多个节点(虚拟机)协同工作起来。IaaS最大的优势在于它允许用户动态申请或释放节点,按使用量和使用时间计费。典型的虚拟化产品包括VMware vShpere、微软的Hyper-V、开源的KVM、开源的Xen。Amazon EC2/S3利用的是Xen这种技术。另外,目前关注度非常高的容器技术Docker也是属于IaaS。

图1-5 虚拟化技术

而PasS对资源进行更进一步的抽象,它提供了用户应用程序的应用环境,典型的如Google App Engine等。Google App Engine使用户可以在Google提供的基础架构上运行、开发、托管自己的应用程序。Google App Engine应用程序易于构建和维护,并可根据用户的访问量和数据存储的增长需求轻松扩展。使用Google App Engine,不再需要维护服务器,只需上传你的应用程序即可。PaaS自身负责资源的动态扩容、容错灾备,用户的应用程序不需过多考虑节点间的配合问题,但与此同时,用户的自主权降低,必须使用特定的编程环境并遵照特定的编程模型,这有点像在高性能集群计算机里进行MPI编程,只适合于解决某些特定的计算问题。例如,Google App Engine只允许使用Python和Java语言,基于Django的Web应用框架,使用Google App Engine SDK来开发在线应用服务。

SaaS的针对性更强,它将某些特定应用软件功能封装成服务,如Salesforce公司提供的在线客户关系管理(Client Relationship Management,CRM)服务。SaaS既不像IaaS一样提供计算或存储资源类型的服务,也不像PaaS一样提供运行用户自定义应用程序的环境,它只提供某些专门用途的服务供应用调用。

通过以上3个层面对云计算的介绍,我们可以看出云计算是集成服务的,图1-6比较清晰地表明云计算和服务集成之间的关系。

需要指出的是,随着云计算的深化发展,不同云计算解决方案之间相互渗透融合,同一种产品往往横跨两种以上的类型。例如,Amazon Web Service(AWS)是以IaaS为基础的,但新提供的弹性MapReduce服务模仿了Google的MapReduce、SimpleDB模仿了Google的Bigtable,这两者属于PaaS的范畴,而它新提供的电子商务服务FPS和DevPay以及网站访问统计服务Alexa Web服务则属于SaaS的范畴。

云计算技术作为IT产业界的一场技术革命,已经成为IT行业未来发展的方向。各国政府也纷纷将云计算服务视为国家软件产业发展的新机遇。需求驱动、技术驱动和政策驱动三大驱动力给云计算的发展提供了极大助力,在国外,由于云计算技术发展较早,有较强的技术基础和运营经验,商业模式也较为清晰,尤其是在美国,Google、Amazon、IBM、微软和Yahoo等都是云计算技术的先行者和佼佼者,众多成功公司还包括Facebook、VMware、Salesforce等。而国内虽然政策力度非常大,资金投入也比较多,但由于起步较晚,技术和商业模式学习欧美,采用复制并本地化的发展路线,因此云计算技术仍属于初级阶段。国内云计算技术走在前列的有华为公司、阿里巴巴集团、百度等,主要以互联网企业巨头和系统集成提供商为主。

图1-6 集成服务的云计算

在谷歌提出“云计算”的概念之前,谷歌工程师在全球顶级计算机会议OSDI和SOSP上连续发表3篇论文:SOSP 2003会议上的The Google File System、OSDI 2004会议上的MapReduce: Simpliyed Data Processing on Large Clusters和OSDI 2006会议上的Bigtable: A Distributed Storage System for Structured Data,在工业界和学术界引起了不小的震动,随后世界上顶级的开源团队(Yahoo、ASF)接手将其实现,可以说Hadoop是云计算的产物,是云计算技术的一种实现。

Hadoop做为一个分布式的软件框架,拥有云计算PaaS层的所有特点,是云计算的重要组成部分。Hadoop的分布式文件系统HDFS抽象了所有硬件资源,使其对于用户来说是透明的,它提供了数据的冗余,自动灾备,也可以动态地增加、减少节点;Hadoop也提供Java、C++、Python等应用程序的运行环境,但如果想基于Hadoop做应用开发,则必须参照MapReduce的编程模型,用户完全不需要考虑各个节点相互之间的配合。另外Hadoop还提供自己独特的数据库服务HBase以及数据仓库服务Hive。Hadoop也可以搭建在IaaS环境下,《纽约时报》使用Hadoop做文字处理就是基于Amazon EC2,当然这不是必须的。

Hadoop可以看做云计算技术的一种实现,而云计算的概念则更广阔,并不拘泥于某种技术。Hadoop作为云计算领域的一颗明星,目前已经得到越来越广泛的应用。

在人们对云计算这个词汇耳熟能详之后,大数据这个词汇又在最短时间内进入大众视野。云计算对于普通人来说就像云一样,一直没有机会能够真正感受到,而大数据则更加实际,是确确实实能够改变人们生活的事物。Hadoop从某个方面来说,与大数据结合得更加紧密,它就是为大数据而生的。

“大数据”(big data),一个看似通俗直白、简单朴实的名词,却无疑成为了时下IT界最炙手可热的名词,在全球引领了新一轮数据技术革命的浪潮。通过2012年的蓄势待发,2013年被称为世界大数据元年,标志着世界正式步入了大数据时代。

现在来看看我们如何被数据包围着。在现实的生活中,一分钟或许微不足道,或许连200字也打不了,但是数据的产生却是一刻也不停歇的。来看看一分钟到底会有多少数据产生:YouTube用户上传48小时的新视频,电子邮件用户发送204 166 677条信息,Google收到超过2 000 000个搜索查询,Facebook用户分享684 478条内容,消费者在网购上花费272 070美元,Twitter用户发送超过100 000条微博,苹果公司收到大约47 000个应用下载请求,Facebook上的品牌和企业收到34 722个“赞”,Tumblr博客用户发布27 778个新帖子,Instagram用户分享36 000张新照片,Flicker用户添加3 125张新照片,Foursquare用户执行2 083次签到,571个新网站诞生,WordPress用户发布347篇新博文,移动互联网获得217个新用户。

数据还在增长着,没有慢下来的迹象,并且随着移动智能设备的普及,一些新兴的与位置有关的大数据也越来越呈迸发的趋势。

那么大数据究竟是什么?我们来看看权威机构对大数据给出的定义。国际顶级权威咨询机构麦肯锡说:“大数据指的是所涉及的数据集规模已经超过了传统数据库软件获取、存储、管理和分析的能力。这是一个被故意设计成主观性的定义,并且是一个关于多大的数据集才能被认为是大数据的可变定义,即并不定义大于一个特定数字的TB才叫大数据。因为随着技术的不断发展,符合大数据标准的数据集容量也会增长;并且定义随不同行业也有变化,这依赖于在一个特定行业通常使用何种软件和数据集有多大。因此,大数据在今天不同行业中的范围可以从几十TB到几PB。”

从上面的定义我们可以看出以下几点。

(1)多大的数据才算大数据,这并没有一个明确的界定,且不同行业有不同的标准。

(2)大数据不仅仅只是大,它还包含了数据集规模已经超过了传统数据库软件获取、存储、分析和管理能力这一层意思。

(3)大数据不一定永远是大数据,大数据的标准是可变的,在20年前1 GB的数据也可以叫大数据,可见,随着计算机软硬件技术的发展,符合大数据标准的数据集容量也会增长。

IBM说:“可以用三个特征相结合来定义大数据:数据量(volume)、多样性(variety)和速度(velocity),或者就是简单的3 V,即庞大容量、极快速度和种类丰富的数据。”[1]

(1)数据量:如今存储的数量正在急剧增长,毫无疑问我们正深陷在数据之中。我们存储所有事物——环境数据、财务数据、医疗数据、监控数据等。有关数据量的对话已从TB级别转向PB级别,并且不可避免地转向ZB级别。现在经常听到一些企业使用存储集群来保存数PB的数据。随着可供企业使用的数据量不断增长,可处理、理解和分析的数据比例却不断下降。

(2)数据的多样性:与大数据现象有关的数据量为尝试处理它的数据中心带来了新的挑战:它多样的种类,随着传感器、智能设备以及社交协作技术的激增,企业中的数据也变得更加复杂,因为它不仅包含传统的关系型数据,还包含来自网页、互联网日志文件(包括点击流数据),搜索索引、社交媒体论坛、电子邮件、文档、主动和被动的传感器数据等原始、半结构化和非结构化数据。简言之,种类表示所有数据类型。

(3)数据的速度:就像我们收集和存储的数据量和种类发生了变化一样,生成和需要处理数据的速度也在变化。不要将速度的概念限定为与数据存储库相关的增长速率,应动态地将此定义应用到数据——数据流动的速度。有效处理大数据要求在数据变化的过程中对它的数量和种类执行分析,而不只是在它静止后执行分析。

最近,IBM在以上3 V的基础上归纳总结了第4个V——veracity(真实性和准确性)。“只有真实而准确的数据才能让对数据的管控和治理真正有意义。随着社交数据、企业内容、交易与应用数据等新数据源的兴起,传统数据源的局限性被打破,企业愈发需要有效的信息治理以确保其真实性及安全性。”

接下来让我们来剖析下大数据突出的特征:多样性。图1-7显示了几种不同结构类型数据的增长趋势,从图中可以看到,未来数据增长的80%~90%将来自于不是结构化的数据类型(半结构化数据、准结构化数据或非结构化数据)。

图1-7 不同结构类型数据的增长趋势

结构化数据:包括预定义的数据类型、格式和结构的数据,例如,事务性数据和联机分析处理,如表1-1所示。

表1-1 结构化数据

姓  名

学  号

性  别

年  龄

Hardy

1

M

25

Jenny

2

F

27

半结构化数据:具有可识别的模式并可以解析的文本数据文件,例如自描述和具有定义模式的XML数据文件,如代码清单1-1所示。

代码清单1-1 半结构化数据示例

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Do not modify this file directly. Instead, copy entries that you -->
<!-- wish to modify from this file into mapred-site.xml and change them -->
<!-- there. If mapred-site.xml does not already exist, create it.   -->

<configuration>

<property>
 <name>hadoop.job.history.location</name>
 <value></value>
</property>

<property>
 <name>hadoop.job.history.user.location</name>
 <value></value>
</property>
</configuration>

准结构化数据:具有不规则数据格式的文本数据,使用工具可以使之格式化,例如包含不一致的数据值和格式的网站点击数据,如http://zh.wikipedia.org/wiki/Wikipedia:%E9%A6% 96%E9%A1%B5

非结构化数据是没有固定结构的数据,通常保存为不同的类型文件,如文本文档、PDF文档、图像和视频。

虽然上面显示了4种不同的、互相分离的数据类型,但实际上,有时这些数据类型是可以被混合在一起的。例如,一个传统的关系型数据库管理系统保存着一个软件支持呼叫中心的通话日志。这里有典型的结构化数据,比如日期/时间戳、机器类型、问题类型、操作系统,这些都是在线支持人员通过图形用户界面上的下拉式菜单输入的。另外,还有非结构化数据或半结构化数据,比如自由形式的通话日志信息,这些可能来自包含问题的电子邮件,或者技术问题和解决方案的实际通话描述,最重要的信息通常是藏在这里的。另外一种可能是与结构化数据有关的实际通话的语音日志或者音频文字实录。即使是现在,大多数分析人员还无法分析这种通话日志历史数据库中的最普通和高度结构化的数据。因为挖掘文本信息是一项工作强度很大的工作,并且无法实现简单的自动化。人们通常最熟悉结构化数据的分析,然而,半结构化数据(XML)、准结构化数据(网站地址字符串)和非结构化数据带来了不同的挑战,需要使用不同的技术来分析。

先来看一则《纽约时报》报道的新闻。一位愤怒的父亲跑到美国Target超市投诉他近期收到超市寄给他大量婴儿用品广告,而他的女儿还只不过是个高中生,但一周以后这位愤怒的父亲再次光临并向超市道歉,因为Target发来的婴儿用品促销广告并不是误发,他的女儿的确怀孕了。《纽约时报》的这则故事让很多人第一次感受到了变革,这次变革和人类经历过的若干次变革最大的不同在于:它发生得悄无声息,但它确确实实改变了我们的生活。各行各业的先知先觉者已经从与数据共舞中尝到了甜头,而越来越多的后来者和新进者都希望借助云计算和大数据这波浪潮去撬动原有市场格局或开辟新的商业领域。这也难怪麦肯锡称大数据将会是传统四大生产要素之后的第五大生产要素。

1.你能一直赢吗?

风靡全球的网络游戏《英雄联盟》拥有数以千万计的用户群体。每天深夜,当大多数玩家已经奋战一天,呼呼大睡的时候,数据服务器正紧张地劳作着。世界各地的运营商会把当日的数据发送到位于美洲的数据中心。随即一个巨大的数据分析引擎转动起来,需要执行上千个数据分析的任务。当日所有的比赛都会被分析,数据分析师会发现,某一个英雄单位太强或太弱,在接下来的2~3周内,会推出一个新补丁,及时调整所有的平衡性问题,并加入一个新单位。整个游戏被保持在一个快速更新,并且良好平衡的状态。正是靠着大数据的魔力,《英雄联盟》才能成为这个时代最受欢迎的游戏之一。

2.你喜欢这个吗?

产品推荐是Amazon的发明,它为Amazon等电子商务公司赢得了近三分之一的新增商品交易。产品推荐的一个重要方面是基于客户交易行为分析的交叉销售。根据客户信息、客户交易历史、客户购买过程的行为轨迹等客户行为数据,以及同一商品其他访问或成交客户的客户行为数据,进行客户行为的相似性分析,为客户推荐产品,包括浏览这一产品的客户还浏览了哪些产品、购买这一产品的客户还购买了哪些产品、预测客户还喜欢哪些产品等。对于领先的B2C网站如京东、亚马逊等,这些数据是海量存在的。

产品推荐的另一个重要方面是基于客户社交行为分析的社区营销。通过分析客户在微博、微信、社区里的兴趣、关注、爱好和观点等数据,投其所好,为客户推荐他本人喜欢的、或者是他的圈子流行的、或推荐给他朋友的相关产品。

通过对客户行为数据的分析,产品推荐将更加精准、个性化。传统企业既可以依赖大型电子商务公司和社区网络的产品推荐系统提升销售量,也可以依靠企业内部的客户交易数据、公司自有的电子商务网站等直销渠道、企业社区等进行客户行为数据的采集和分析,实现企业直销渠道的产品推荐。

基于大数据应用的行业实例数不胜数,并且都为各个行业带来可观的效益,甚至可以改变游戏规则。对于未来,我们会发现在电影中出现的预测犯罪、智慧城市等情景都会由于大数据处理技术的进步一一实现,这完全不是遥远的梦想。

首先,简单概括一下云计算和大数据之间的关系。在很大程度上它们是相辅相成的,最大的不同在于:云计算是你在做的事情,而大数据是你所拥有的东西。以云计算为基础的信息存储、分享和挖掘手段为知识生产提供了工具,而通过对大数据分析、预测会使得决策更加精准,两者相得益彰。从另一个角度讲,云计算是一种IT理念、技术架构和标准,而云计算不可避免地会产生大量的数据。大数据技术与云计算的发展密切相关,大型的云计算应用不可或缺的就是数据中心的建设,所以大数据技术是云计算技术的延伸。

作为云计算PaaS层技术的代表,Hadoop可以以一种可靠、高效、可扩展的方式存储、管理“大数据”,如图1-8所示。Hadoop及其生态圈为管理、挖掘大数据提供了一整套成熟可靠的解决方案。从功能上说,Hadoop可以称作一个“大数据管理和分析平台”。下面我们先对Hadoop的核心组件做一个简单的介绍,让读者对Hadoop有个初步的认识。

1.海量数据的摇篮——HDFS

作为Hadoop分布式文件系统,HDFS处于Hadoop生态圈的最下层,存储着所有的数据,支持着Hadoop的所有服务。它的理论基础源于Google的The Google File System这篇论文,它是GFS的开源实现。

图1-8 云计算、大数据和Hadoop

HDFS的设计理念是以流式数据访问模式,存储超大文件,运行于廉价硬件集群之上。

2.处理海量数据的利器——MapReduce

MapReduce是一种编程模型,Hadoop根据Google的MapReduce论文将其实现,作为Hadoop的分布式计算模型,是Hadoop的核心。基于这个框架,分布式并行程序的编写变得异常简单。综合了HDFS的分布式存储和MapReduce的分布式计算,Hadoop在处理海量数据时,性能横向扩展变得非常容易。

3.列族存储——HBase

HBase是对Google的Bigtable的开源实现,但又和Bigtable存在许多不同之处。HBase是一个基于HDFS的分布式数据库,擅长实时地随机读/写超大规模数据集。它也是Hadoop非常重要的组件。

简言之,由于Hadoop可以基于分布式存储进行分布式计算,横向扩展能力非常优秀,所以Hadoop非常适合并且能够胜任存储、管理、挖掘“大数据”的任务。

1.Storm

在现实生活中,有很多数据是属于流式数据,即计算的输入并不是一个文件,而是源源不断的数据流,如网上实时交易所产生的数据。用户需要对这些数据进行分析,否则数据的价值会随着时间的流逝而消失。流式数据有以下特点。

(1)数据实时到达,需要实时处理。

(2)数据是流式源源不断的,大小可能无穷无尽。

(3)系统无法控制将要处理的新到达数据元素的顺序,无论这些数据元素是在同一个数据流中还是跨多个数据流。

(4)一旦数据流中的某个数据经过处理,要么被丢弃或者无状态。

Storm也是一个成熟的分布式的流计算平台,擅长流处理(stream processing)或者复杂事件处理(complex event processing,CEP),Storm有以下几个关键特性。

(1)适用场景广泛。

(2)良好的伸缩性。

(3)保证数据无丢失。

(4)异常健壮。

(5)良好的容错性。

(6)支持多语言编程。

值得一提的是,Storm采用的计算模型并不是MapReduce,并且MapReduce也已经被证明不适合做流处理。另外,Storm也运行在YARN之上,从这个角度上来说,它也是属于Hadoop生态圈。

2.Apache Spark

Apache Spark由加州大学伯克利分校AMP实验室开发。由于使用的开发语言为Scala,Spark在并行计算有很大的优势,且Spark十分小巧玲珑,其中核心部分只有63个文件。Apache Spark引入了弹性分布数据集(RDD)的概念,基于内存计算,速度在特定场景下大幅领先MapReduce。Spark的主要优势包括以下几个方面。

(1)提供了一套支持DAG的分布式并行计算的编程框架,减少多次计算之间中间结果写到HDFS的开销。

(2)提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的I/O开销。

(3)使用多线程池模型来减少任务启动开销,减少shuffle过程中不必要的sort操作以及减少磁盘I/O操作。

(4)广泛的数据集操作类型。

目前Spark的发展势头十分迅猛,生态圈已初具规模,如图1-9所示。其中Spark SQL为支持SQL的结构化查询工具,Spark Streaming是Spark的流计算框架,MLlib集成了主流机器学习算法,GraphX则是Spark的图计算框架。从图1-9可以看出Spark在多个领域和MapReduce展开正面交锋,并且具有很多MapReduce所没有的特性,潜力巨大。

图1-9 Apache Spark

和云计算、大数据的概念相比,数据挖掘和商业智能的概念早已被学术界和工业界所接受,但由于大数据的出现,又为它们注入了新的活力,“大数据时代的商业智能”的概念不断被业界所提及,那么它们究竟是什么呢?

先来看一个例子,Google的Flu Trends(流感趋势)使用特殊的搜索项作为流感活动的指示器。它发现了搜索流感相关信息的人数与实际具有流感症状的人数之间的紧密联系。当与流感相关的所有搜索聚集在一起时,一个模式就出现了。使用聚集的搜索数据,Google的Flu Trends可以比传统的系统早两周对流感活动做出评估。这个例子说明了数据挖掘如何把大型数据集转化为知识。现在,我们可以对数据挖掘做一个简短的定义,数据挖掘就是“数据→知识”。

带着这个概念,我们来一步一步分析数据挖掘的本质。数据挖掘可以看作是信息技术自然而然进化的结果。数据库和数据管理产业的一些关键功能不断发展,大量数据库系统提供的查询和事务处理已经司空见惯,高级数据分析自然成为下一步。

20世纪60年代,数据库和信息技术已经系统地从原始文件处理演变成复杂的功能强大的数据库系统。

20世纪70年代,数据库从层次型数据库、网状数据库发展到关系型数据库,用户可以通过查询语言灵活方便地访问数据。

20世纪80年代中后期,数据库技术转向高级数据库系统、支持高级数据分析的数据仓库和数据挖掘,基于Web的数据库。

硬件的飞速发展,导致了功能强大和价格可以接受的计算机、数据收集设备和存储介质大量涌现。这些软件和硬件的进步大大推动了数据库和信息产业的发展,也导致了数据库管理系统分成了两个发展方向:OLTP(联机事务处理)和OLAP(联机分析处理)。图1-10展示了数据库管理系统的发展过程。

图1-10 数据管理系统的发展

而OLAP的出现也导致数据仓库这种数据存储结构的出现。数据仓库是一种多个异构数据源在单个站点以统一的模式组织的存储,以支持管理决策。大量的数据累积在数据库和数据仓库中,数据丰富但数据分析工具缺乏,这种情况被描述为“数据丰富但信息贫乏”。快速增长的“大数据”,没有强有力的工具,理解它们已经远远超出了人的能力。结果,收集了大量数据的数据库和数据仓库变成了“数据坟墓”——几乎不再访问的数据档案(如历史订单)。这样,重要的决策常常不是基于数据库和数据仓库中含有丰富信息的数据,而是基于决策者的直觉。尽管在开发专家系统和知识库系统方面已经做出很大的努力,但是这种系统通常依赖用户或领域专家人工地将知识输入知识库。不幸的是,这一过程常常有偏差和错误,并且费用高、耗费时间。数据和信息之间的鸿沟越来越宽,这就要求必须系统地开发数据挖掘工具,将数据坟墓转换为“数据金块”。

作为一个多学科交叉的领域,数据挖掘可以用多种方式定义,例如“从数据中挖掘知识”、“知识挖掘”等。许多人把数据挖掘视为另一个流行术语——数据中的知识发现(Knowledge Discovery in Database,KDD)的同义词,而另一些人只是把数据挖掘视为知识发现过程的一个基本步骤。知识发现的过程如图1-11所示,由以下步骤的迭代序列组成[2]

(1)数据清理:消除噪声和删除不一致数据。

(2)数据集成:多种数据源可以组合在一起。

(3)数据选择:从数据库中提取与分析任务相关的数据。

(4)数据变换:通过汇总或聚集操作,把数据变换和统一成适合挖掘的形式。

(5)数据挖掘:基本步骤,使用智能方法提取数据模式。

(6)模式评估:根据某种兴趣度量,识别代表知识的真正有趣模式。

(7)知识表示:使用可视化和知识表示技术,向用户提供挖掘的知识。

目前信息产业界的一个流行趋势是将数据清理和数据集成作为数据预处理步骤执行,结果数据存放在数据仓库中。步骤1至步骤4都是在为数据挖掘准备数据。数据挖掘步骤可与用户或知识库交互,将有趣的模式提供给用户,或作为新的知识存放在知识库中。

图1-11 知识发现的过程

因为数据仓库对于数据挖掘和本书都是一个比较关键的概念,在这里我们详细地来分析一下数据仓库的概念。

按照数据仓库系统构造方面的领衔设计师William H.Inmon的说法,数据仓库是一个面向主题的、集成的、时变的、非易失的数据集合,支持管理者的决策过程。这个简短而又全面的定义指出了数据仓库的主要特征,4个关键字:面向主题的、集成的、时变的、非易失的。

操作数据库系统的主要任务是执行联机事务和查询处理。这种系统称作联机事务处理(OLTP)系统。它们涵盖了单位的大部分日常操作,如购物、库存、工资等,也被称作业务系统。另一方面,数据仓库系统在数据分析和决策方面为用户提供服务,这种系统称作联机分析处理(OLAP)系统。

OLTP和OLAP的主要区别有以下几个方面。

OLTP和OLAP的其他区别包括数据库大小、操作的频繁程度以及性能度量等。

既然操作数据库存放了大量数据,读者可能奇怪,为什么不直接在这种数据库上进行联机分析处理(OLAP),而是另外花费时间和资源去构造分离的数据仓库?。分离的主要原因是有助于提高两个系统的性能。操作数据库是为已知的任务和负载设计的,例如使用的主键索引、检索特定的记录、优化定制的查询。另一方面,数据仓库的查询通常是复杂的,涉及大量数据在汇总级的计算,可能需要特殊的基于多维视图的数据组织、存取方法和实现方法。在操作数据库上处理OLAP查询,可能会大大降低操作任务的性能。

此外,操作数据库支持多事务的并发处理,需要并发控制和恢复机制(例如,加锁和记日志),以确保一致性和事务的鲁棒性。通常,OLAP查询只需要对汇总和聚集数据记录进行只读访问。如果将并发控制和恢复机制用于这种OLAP操作,就会危害并行事务的运行,从而大大降低OLTP系统的吞吐量。

最后,数据仓库与操作数据库分离是由于这两种系统中数据的结构、内容和用法都不同。决策支持需要历史数据,而操作数据库一般不维护历史数据。在这种情况下,操作数据库中的数据尽管很丰富,但对于决策是远非完整的。决策支持需要整合来自异构源的数据(例如,聚集和汇总),产生高质量的、纯净的和集成的数据。相比之下,操作数据库只维护详细的原始数据(如事务),这些数据在进行分析之前需要整理。由于两种系统提供大不相同的功能,需要不同类型的数据,因此需要维护分离的数据库。

哪里有数据,哪里就有数据挖掘应用,这句话用来形容商业智能再合适不过了。数据仓库解决了存储问题,而OLAP技术提供了挖掘手段,企业自然而然会想到将数据利用起来,而商业智能就是最好的途径。

商业智能(Business Intelligence,BI)是一个统称,指的是用于支持制定业务决策的技能、流程、技术、应用和实践。商业智能对当前数据或历史数据进行分析,在理想情况下辅助决策者制定未来的业务决策。商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务 经营决策的工具。商业智能是对商业信息的搜集、管理和分析过程,目的是使企业的各级决策者 获得知识或洞察力(insight),促使他们做出对企业更有利的决策。从技术层面上讲,商业智能不是什么新技术,它只是数据仓库 、OLAP等技术的综合运用[3]

大多数的数据仓库是为了挖掘某种商业价值而创建的,但是商业智能和数据仓库之间的区别在于商业智能是定位于生成可向业务用户交付的产品,而数据仓库的目标只是着眼于对数据进行结构化的存储和组织,所以对于数据仓库,还需要OLAP技术,才能完成数据仓库到商业智能的转换过程。对于数据仓库来说,可以只关注数据本身,不需要专门考虑业务,而商业智能则更主要的是基于数据仓库的数据从业务的角度进行分析。如图1-12所示,商业智能主要使用到数据仓库技术和OLAP技术。商业智能系统通过对数据仓库的数据进行数据选择、抽取、加载后,使用数据挖掘方法提取知识,再用BI报表将知识呈现给决策者供其参考。

一款优秀的商业智能系统应该满足以下4个特性:准确、及时、价值高和可操作。准确性的意义是数据是可信的,及时性意味着数据可定期获取、价值高表示对商业用户有用,可操作性是指信息可以用于业务决策过程。

图1-12 商业智能系统

据预测,到2020年,全球需要存储的数据量将达到35万亿GB,是2009年数据存储量的44倍。根据IDC的研究,2010年底全球的数据量已经达到120万PB(或1.2 ZB)。这些数据如果使用光盘存储,摞起来可以从地球到月球一个来回。对于商业智能而言,这里孕育着巨大的市场机会,庞大的数据就是一个信息金矿,但是海量数据也带给传统商业智能前所未有的压力。

数据是企业的重要资产。由于数据挖掘等商业智能技术的应用,让不少企业从大量的历史数据中剥茧抽丝,发现很多有价值的信息,大大改善了管理人员决策的科学性。不过,长期以来,商业智能的应用一直局限于结构化数据,其核心组件数据仓库最为擅长的也是结构化数据的存储与管理。

在大数据时代,一批新的数据挖掘技术正在涌现,有望改变我们分析处理海量数据的方式,使得我们更快、更经济地获得所需的结果。大数据技术就是要打破传统商业智能领域的局限,它在处理数据量上有了质的提高,传统商业智能限于技术瓶颈很大程度上是对抽样数据进行分析,而大数据技术的引入使得商业智能可以基于全量数据,这样让结果更加准确可信。大数据技术不但能处理结构化数据,而且还能分析和处理各种半结构化和非结构化数据,甚至从某种程度上,更擅长处理非结构化数据,比如Hadoop。而在现实生活中,这样的数据更为普遍,增长得也更为迅速。比如,社交媒体中的各种交互活动、购物网站用户点击行为、图片、电子邮件等。可以说,正是此类数据的爆炸性增长催生了大数据相关技术的出现和完善。

而对于Hadoop来说,首先HDFS解决了海量数据存储的问题,Hive负责结构化数据的分析,而半结构化、非结构化数据的分析和数据清洗可根据需要编写MapReduce作业完成,整个过程都是对基于分布式存储的数据进行分布式计算,扩展性将比传统商业智能系统大大提升。另外Hadoop生态圈的Sqoop、Flume等实现了传统商业智能的一些功能模块,如日志收集、数据抽取等。可以说Hadoop及Hadoop生态圈为大数据的商业智能系统提供了一套完整、高效的解决方案。在本书的后半部分,将基于Hadoop设计和实现一个商业智能系统,在实现这个商业系统的过程中,读者可以发现我们无论采取大数据技术还是传统数据挖掘技术,遵循的方法论其实是一致的,希望读者可以从这个项目中举一反三,融会贯通。

本章相当于对大数据、云计算、Hadoop的综述,旨在让初学者理清概念和之间的联系,最后介绍了数据挖掘和商业智能,它们在大数据、云计算的大背景下,必将焕发出新的光彩。


风,属于天的,我借来吹吹,却吹起人间烟火。

——王菲《百年孤寂》

“工欲善其事,必先利其器。”在开始学习Hadoop前,需要有一个良好的学习环境,Hadoop模块众多,搭建环境对于初学者有一定难度,本章将帮助读者搭建学习环境。

作为安装Hadoop的第一步,就是根据实际情况选择最合适的Hadoop版本。而目前由于Hadoop的飞速发展,功能更新和错误修复在不断地迭代着,所以Hadoop的版本非常多,显得有些杂乱。对于初学者来说,选择一个合适的Hadoop版本进行学习非常重要,本节主要理清各个Hadoop版本之间的关系与不同。

Hadoop目前是Apache软件基金会的顶级项目,目前由Apache软件基金负责开发和推广,所以我们可以直接从Apache软件基金会的镜像网站上下载Hadoop,其链接为http://apache.dataguru.cn/hadoop/core/。Apache Hadoop以压缩包(tarball、tar.gz)的形式发布,其中包括了源代码和二进制工作文件。

在第1章中曾经提到过,Cloudera是一家提供Hadoop支持、咨询和管理工具的公司,在Hadoop生态圈具有举足轻重的地位,它的拳头产品就是著名的Cloudera’s Distribution for Hadoop,简称CDH。该软件同Apache Hadoop一样,都是完全开源的,基于Apache软件许可证,免费为个人和商业使用。Cloudera从一个稳定的Apache Hadoop的版本开始,连续不断地发布新版本并为旧版本打上补丁,为各种不同的生产环境提供安装文件,在Cloudera的团队中,有许多Apache Hadoop的贡献者,所以Cloudera公司的实力毋庸置疑。

用户一般安装Hadoop时,不仅只安装HDFS、MapReduce,还会根据需要安装Hive、HBase、Sqoop等。Cloudera将这些相关项目都集成在一个CDH的版本里,目前CDH包括Hadoop、HBase、Hive、Pig、Sqoop、Flume、Zookeeper、Oozie、Mahout和Hue等,几乎完整覆盖了整个Hadoop的生态圈。这样做的好处是保证了组件之间的兼容性,因为这些各个项目之间也存在完全独立的版本,其各个版本与Hadoop之间必然会存在兼容性的问题。如果你选择了CDH,那么同一个CDH版本的组件之间将完全不存在兼容性问题。

在编写本书时,CDH最新的版本是CDH5,也是目前最主流的版本,它是基于Apache Hadoop 2.6。CDH还有两个正式的大版本:CDH3和CDH4(CDH1和CDH2现在早已绝迹,Cloudera公司也早已放弃支持),其中CDH3是一个非常经典的版本,它是基于Apache Hadoop 0.20.2的,这是CDH第一个真正意义上的稳定版,久经生产环境考验,而CDH4是CDH5的过渡版,没有真正意义上流行过。

CDH也会以压缩包的形式发布,可以在其官网下载,CDH还提供Yum、Apt、Zypper形式的安装。

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

目前Hadoop的版本有如下几个特性[4]

(1)Append:HDFS Append支持对文件追加,HDFS在设计之初的理念是“一次写入,多次读取”,但由于某些具有写需求的应用使用HDFS作为底层存储系统,如HBase的预写日志(WAL),所以HDFS加入了这一功能。

(2)Security:Hadoop缺乏自己的安全机制,该功能可以为Hadoop增加基于Kerberos和Deletion Token的安全机制。

(3)Symlink:使HDFS支持符号链接,符号链接又叫软链接,是一类特殊的文件 ,这个文件包含了另一个文件的路径名(绝对路径 或者相对路径 ),在对符号文件 进行读操作或写操作时,系统会自动把该操作转换为对源文件 的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。

(4)MRv1:第一代MapReduce计算框架,通过MapReduce思想,将问题转化为Map和Reduce两个阶段,基础服务由JobTracker、TaskTracker进程提供。

(5)YARN/MRv2:第一代MapReduce计算框架具有扩展性和多计算框架支持不足的缺点,针对这些,提出了全新的资源管理框架(Yet Another Resource Negotiator),通过这个组件,我们可以在共用底层存储(HDFS)的情况下,计算框架采取可插拔式的配置。在MRv1中的JobTracker的资源管理和作业跟踪的功能被分拆由ResourceManager和ApplicationMaster两个组件来完成,增强了扩展性。

(6)NameNode Federation:在Hadoop中,NameNode保存了所有文件的元数据,所以其性能制约了整个HDFS集群的扩展。基于此,NameNode Federation将NameNode横向扩展,每一个NameNode保存一部分元数据,即将元数据水平切分,彼此之间互相隔离,但共享底层的DataNode存储。

(7)NameNode HA:在Hadoop中,NameNode还存在单点故障问题,当NameNode出现故障时,集群必须停止工作。NameNode采取共享存储的方案解决NameNode的高可用性问题。

基于以上Hadoop的特性衍生出的Hadoop版本令人眼花缭乱,这也是由于功能更新和错误修复在不断进行中。图2-1所示为Hadoop不同的版本分支。

图2-1 Hadoop的分支

(1)0.20.0~0.20.2:Hadoop的0.20分支非常稳定,虽然看起来有些落后,但是经过生产环境考验,是Hadoop历史上生命周期最长的一个分支,CDH3、CDH4虽然包含了0.21和0.22分支的新功能和补丁,但都是基于此分支。

(2)0.20-append:0.20-append支持HDFS追加,由于该功能被认为是一个不稳定的潜在因素,所以它被单独新开了一个分支,并且没有任何新的Hadoop的正式版基于此分支发布。

(3)0.20-security:该分支基于0.20并支持Kerberos认证。

(4)0.20.203~0.20.205:这些版本包括了Security分支所带功能,并且还包括错误修复和0.20分支的线上开发的改进。

(5)0.21.0:0.21是一个预研性质的版本,目的是强调那段时间开发的一些新功能,没有Security功能,但有Append功能,不建议部署在生产环境。

(6)0.22.0:0.22.0包括HDFS的安全功能,并且更新不大。

(7)0.23.0:在2011年11月,Hadoop 0.23发布了,包括了Append、Security、YARN和HDFS Federation功能,该版本被认为是2.0.0的预览版本。

(8)1.0.0:1.0.0版本是基于0.20.205版本发布,包括了Security功能,是一个值得部署的稳定版本。但是从上面可以看出,1.0.0并不是包含了所有分支。

(9)2.0.0:2012年5月,基于0.23.0分支的2.0.0版本发布,它包含了YARN,但移除了MRv1,兼容了MRv1的API,但底层实现有明显不同,需要经过大量测试才能被用于生产环境。CDH4是基于此版本,但CDH4还提供了MRv1的实现。

在本书第1版问世的时候,Hadoop的版本还比较乱,各种分支、新特性各自为政,现在已经由CDH5统一了局面,目前国内大多采用Cloudera的CDH5作为生产环境的Hadoop版本,但每个版本各自的特性和功能还是有必要提一下的,如表2-1所示。

表2-1 Hadoop各版本具有的功能

功  能

0.20

0.21

0.22

0.23

1.0

2.0

CDH3

CDH4

CDH5

稳定性

 

 

 

 

Append

 

Security

 

Symlink

 

 

 

YARN

 

 

 

 

 

MRv1

 

 

NameNode Federation

 

 

 

 

 

NameNode HA

 

 

 

 

 

选择Hadoop的版本取决于用户想要的功能和是否稳定,对于稳定的需求,一般就考虑Cloudera的CDH。CDH有很多的补丁和更新,稳定性很不错。对于功能的需求,CDH几乎包含了整个Hadoop生态圈,能够很好地为业务提供支持。CDH5是目前最稳定也是功能最全的CDH版本。

CDH5还包括了Hive、HBase、Sqoop等的CDH版,具体版本号如表2-2所示。表2-2的第二列前面的数字是社区版版本号,后面的数字是CDH的版本号。

表2-2 CDH5组件列表与版本说明

CDH5组件

版 本 说 明

Apache Avro

avro-1.7.6+cdh5.6.0

Apache Crunch

crunch-0.11.0+cdh5.6.0

DataFu

pig-udf-datafu-1.1.0+cdh5.6.0

Apache Flume

flume-ng-1.6.0+cdh5.6.0

Apache Hadoop

hadoop-2.6.0+cdh5.6.0

Apache HBase

hbase-1.0.0+cdh5.6.0

HBase-Solr

hbase-solr-1.5+cdh5.6.0

Apache Hive

hive-1.1.0+cdh5.6.0

Hue

hue-3.9.0+cdh5.6.0

Cloudera Impala

impala-2.4.0+cdh5.6.0

Kite SDK

kite-1.0.0+cdh5.6.0

Llama

llama-1.0.0+cdh5.6.0

Apache Mahout

mahout-0.9+cdh5.6.0

Apache Oozie

oozie-4.1.0+cdh5.6.0

Parquet

parquet-1.5.0+cdh5.6.0

Parquet-format

parquet-format-2.1.0+cdh5.6.0

Apache Pig

pig-0.12.0+cdh5.6.0

Cloudera Search

search-1.0.0+cdh5.6.0

Apache Sentry

sentry-1.5.1+cdh5.6.0

Apache Solr

solr-4.10.3+cdh5.6.0

Apache Spark

spark-1.5.0+cdh5.6.0

Apache Sqoop

sqoop-1.4.6+cdh5.6.0

Apache Sqoop2

sqoop2-1.99.5+cdh5.6.0

Apache Whirr

whirr-0.9.0+cdh5.6.0

Apache ZooKeeper

zookeeper-3.4.5+cdh5.6.0

Hadoop主要由两部分构成:分布式文件系统HDFS和统一资源管理和调度系统YARN。正如前文所述,分布式文件系统主要是用于海量数据的存储,而YARN主要是管理集群的计算资源并根据计算框架的需求进行调度。本节主要是为了让读者对Hadoop的架构有个比较清晰的了解,为后面的安装和学习打下基础。

构成HDFS集群的主要是两类节点,并以主从(master/slave)模式,或者说是管理者-工作者的模式运行,即一个NameNode(管理者)和多个DataNode(工作者)。还有一种节点叫SecondaryNameNode,作为NameNode镜像数据备份。如图2-2所示,图中的所有物理节点构成了一个HDFS集群,而NameNode、DataNode和SecondaryNameNode其实是各自节点上运行的守护进程。所以NameNode既是守护进程,也可以指运行NameNode守护进程的节点。客户端代表用户与整个文件系统交互的客户端。

图2-2 HDFS架构

表2-3列出了HDFS中守护进程的数目及其作用。

表2-3 HDFS守护进程

守 护 进 程

集群中的数目

作  用

NameNode

1

存储文件系统的元数据,存储文件与数据块映射,并提供文件系统的全景图

SecondaryNameNode

1

备份NameNode数据,并负责镜像与NameNode日志数据的合并

DataNode

多个(至少一个)

存储块数据

构成YARN集群的是两类节点:ResourceManager和NodeManager。同HDFS类似,YARN也采用主从(master/slave)架构,如图2-3所示。

图2-3 YARN架构

ResourceManager和NodeManager也是两种守护进程,运行在各自的节点上。表2-4列出了ResourceManager和NodeManager守护进程的数目和作用。

表2-4 ResourceManager和NodeManager守护进程

守 护 进 程

集群中的数量

作  用

ResourceManager

1个

负责集群中所有的资源的统一管理和调度

NodeManager

多个(至少一个)

负责管理单个计算节点、容器的生命周期管理、追踪节点健康状况

从上面的介绍读者可以知道,HDFS集群和YARN集群其实由一些守护进程组成,而所有这些守护进程和运行它们的节点就构成了Hadoop集群。如图2-4所示,这个集群的NameNode进程和ResourceManager进程在一个节点上运行,而DataNode和NodeManager在同一个节点上运行着。

值得一提的是,DataNode和NodeManager需要配对部署在同一个节点,但NameNode和ResourceManager却并不一定部署在同一个节点。在生产环境中,为了性能和稳定性考虑,强烈建议NameNode和ResourceManager分开部署。如图2-5所示(为了突出重点,这里省略了SecondaryNameNode和客户端,实际上是存在的),这样也是一个标准的Hadoop集群。

图2-4 Hadoop集群

图2-5 另一种Hadoop集群部署方式

本节将学习如何安装并运行Hadoop集群。

对于Hadoop发行版的选择,结合2.1节的内容,我们选择CDH5,该版本是目前生产环境中装机量最大的版本之一,涵盖了所有的Hadoop的主要功能和模块,稳定并且还有很多有用的新特性。下载地址为https://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.6.0.tar.gz。

Hadoop的运行模式有以下3种。

(1)单机模式:如果在不进行任何配置的情况下,这是Hadoop的默认模式,在这种模式下,本章第2节介绍的所有守护进程,如NameNode、DataNode、NodeManager、ResourceManager都变成了一个Java进程。

(2)伪分布模式:在这种模式下,所有的守护进程都运行在一个节点上,这种模式在一个节点上模拟了一个具有Hadoop完整功能的微型集群。

(3)完全分布模式:在这种模式下,Hadoop的守护进程运行在多个节点上,形成一个真正意义上的集群。

每种模式都有其优缺点。完全分布模式当然是使用Hadoop的最佳方式,但它需要最多的配置工作和架构所需要的机器集群。单机模式的配置工作是最简单的,但它与用户交互的方式不同于完全分布模式的交互方式。所以,对于一般学习者或者是受限于节点数目的读者,可以采用伪分布模式,虽然只有一个节点支撑整个Hadoop集群,但Hadoop在伪分布模式下的操作方式与其在完全分布模式下的操作几乎是完全相同的。本节将会介绍伪分布模式和完全分布模式的安装方法。

Hadoop的运行环境有以下两种。

(1)Windows:虽然目前Hadoop社区已经支持Windows,但由于Windows操作系统本身不太适合作为服务器操作系统,所以本书不介绍Windows下Hadoop的安装方式。

(2)Linux:Hadoop的最佳运行环境无疑是世界上最成功的开源操作系统Linux。Linux的发行版众多,常见的有CentOS、Ubuntu、RedHat等。CentOS(Community Enterprise Operating System,社区企业操作系统)是来自于Red Hat Enterprise Linux依照开放源代码 规定释出的源代码所编译而成,本书选择稳定且免费的CentOS 6.3 x86-64(64位)版本。

如果读者选择伪分布模式,只需准备1台物理机或者虚拟机。如果选择完全分布模式,那么需要准备两台以上的物理机或者虚拟机。

Hadoop的安装步骤大致分为8步。

(1)安装运行环境。

(2)修改主机名和用户名。

(3)配置静态IP地址。

(4)配置SSH无密码连接。

(5)安装JDK。

(6)配置Hadoop。

(7)格式化HDFS。

(8)启动Hadoop并验证安装。

读者如果有条件,可以在物理机上通过光盘安装的方式安装CentOS,但考虑到在实际情况中,并不一定有物理机安装的条件,这里介绍虚拟机安装的方式。

(1)安装虚拟化软件VMware Workstation 9,安装完成后,下载CentOS的镜像文件,下载地址为 http://centos.ustc.edu.cn/centos (中国科技大学镜像地址),进入VMware Workstation 9,如图2-6所示,单击最上面的“File”选项卡,选择“New Virtual Machine”选项。

图2-6 进入VMware Workstation 9

此时会进入创建新虚拟机向导,如图2-7所示,选择“Custom”,即自定义的设定方式,单击“Next”,选择虚拟机的硬件兼容性,我们此时选用默认配置进入并点击“Next”选择安装操作系统的方式。

图2-7 新建虚拟机向导

(2)为了模拟真实物理机安装操作系统的步骤,如图2-8所示,这里选择第3项 “I will install the operating system later”,单击“Next”进入选择要安装的操作系统。

图2-8 安装虚拟机操作系统

(3)如图2-9所示,选择Linux的CentOS 64-bit的版本。单击“Next”进入命名虚拟机的步骤。

图2-9 选择安装的操作系统

这里为了便于读者理解和记忆,如图2-10所示,命名为“master”,“Location”文本框中读者可以自行填写为保存虚拟机的本地磁盘路径。点击“Next”进入处理器设定环节。

图2-10 命名虚拟机

(4)这一步的设定将很大程度决定虚拟机的性能,在此建议,如果不是特别需要,不管Host(即读者使用的物理机)机器的处理器是几核,主频是多少,都分配为一个虚拟机一个物理核心,如图2-11所示。这样对Host机器的性能影响也不大,对于开发来说,Guest机器(即虚拟机)的性能也足够用了。点击“Next”为虚拟机分配内存。

图2-11 处理器设置

(5)这里还是本着够用和不影响Host机器为原则,一个虚拟机分配1024 MB内存,如图2-12所示。点击“Next”进入虚拟机的网络设定。

图2-12 内存设置

(6)如图2-13所示,一共有3种网络连接选项。

图2-13 网络连接

为了让其他节点能够访问Hadoop集群,这里选择桥接模式,点击“Next”进入I/O控制器。

(7)如图2-14所示,选择推荐配置即可,点击“Next”,进入虚拟机磁盘设置。

图2-14 I/O控制器设置

(8)如图2-15所示,选择默认配置即可,点击“Next”,进入硬盘接口设置。

图2-15 磁盘设置

(9)如图2-16所示,仍然选择默认选项“SCSI”,点击“Next”进入磁盘容量设置。

图2-16 磁盘接口设置

(10)如图2-17所示,设置虚拟机最大磁盘容量,默认20 GB。需要说明的是,这里不管填写多少,虚拟机占用磁盘的容量始终是实际消耗,也就是说这个数字仅仅是个上限,所以这里可以填大一点没有关系,推荐30 GB。下面的选项按照默认选项即可。点击“Next”进入虚拟机文件设置。

图2-17 容量设置

(11)在这一步中将设置存储虚拟机的文件的基本信息,如图2-18所示,vmdk是VMware可识别的格式,该文件保存了虚拟机的基本信息,只占极少的容量,真正存储虚拟机数据的文件是文件名为填写的文件名在文件名尾加上-s001、-s002的文件,依次类推,例如CentOS 64-bit-s001.vmdk,CentOS 64-bit-s002.vmdk。这些文件都存放于前面在命名虚拟机的步骤中填写的文件夹下,点击“Next”,进入虚拟机信息确认的步骤。

图2-18 虚拟机文件设置

(12)如图2-19所示,在这里会看到虚拟机的所有信息,如网络、计算资源、存储资源、名称等,如果读者觉得虚拟机的硬件设置有不合适的地方可以点击“Customize Hardware”,在这里仍然可以修改。点击“Finish”按钮完成整个虚拟机设置。

图2-19 创建虚拟机

(13)以上步骤等同于读者自己组装了台机器,现在需要将安装光盘放进Host机器的光驱,虚拟机的光驱设置默认是使用Host机器的光驱。如果读者采用镜像文件的安装方式,则需要在工作区左边的列表右键单击刚才配置的虚拟机,如图2-20所示。

图2-20 右键单击虚拟机

选择“Setting”选项,进入虚拟机设置界面,如图2-21所示,点击左边“Hardware”选项卡的“CD/DVD”选项,然后选中右边的“Use ISO image file”选项,点击“Browse”按钮,将准备好的Centos 6.3 x86-64的安装文件镜像选中,最后点击“OK”退出。

图2-21 虚拟机设置

(14)这时虚拟机的所有准备工作已经完成,剩下要做的就是启动虚拟机。单击选中刚才配置的虚拟机,点击工作区第二排的第一个如同播放的按钮,启动虚拟机,如图2-22所示。

图2-22 启动虚拟机

此时,虚拟机会自动被安装光盘(或者是镜像文件)引导至安装界面,由于安装步骤和物理机安装并无不同,在此就不介绍了。如果读者选择完全分布模式安装Hadoop,那么读者还需按照上面步骤,再准备多个一模一样的虚拟机,其中一台作为主节点(master node),其余作为从节点(slave node)。

为了统一开发环境,在这里需要修改主机名和用户名。

(1)修改用户名(root用户执行,所有节点都需执行)。执行“useradd hadoop”添加以hadoop为用户名的用户;执行“passwd hadoop”修改该用户的密码,密码统一设置为123456。

(2)修改主机名(root用户,所有节点都需要执行)。在安装CentOS的时候会输入一个主机名,但是我们仍然需要修改使其符合规范。执行“vi /etc/sysconfig/network”,会出现:

NETWORKING=yes
HOSTNAME=your_computer_host_name
...

如果读者选择完全分布模式安装Hadoop,那么需要将一个节点的该文件中的“HOSTNAME”修改为“master”,其他节点的主机名修改为“slave1”、“slave2”、……。如果读者选择伪分布模式安装,那么只需要按照上面的步骤将节点的主机名修改为“master”。保存后退出文件编辑。

(3)为了让安装Hadoop的节点之间能够使用主机名进行互相访问,需要修改hosts文件(root用户执行,所有节点都需执行)。执行“vi /etc/hosts”,在文件末尾加上:

#填写IP地址与主机名
192.168.190.200 master
#如果是完全分布模式还需要填写slave的IP地址和主机名
192.168.190.201 slave1
...

修改后保存退出文件编辑,这样节点之间就可以通过主机名互相访问了。

由于Hadoop集群在启动时需要通过固定的主机名或者IP地址启动,所以我们必须对虚拟机配置静态IP地址。

修改ifcfg-em1文件(root用户执行,所有节点都需执行),执行命令:

vi /etc/sysconfig/network-scripts/ifcfg-em1

将文件修改为:

DEVICE="em1"
BOOTPROTO="static"
NM_CONTROLLED="yes"
ONBOOT="yes"
#TYPE="Ethernet"
#下面为静态IP地址
IPADDR=192.168.190.200
NETMASK=255.255.0.0
#下面为网关IP地址
GATEWAY=192.168.1.1
DNS1=8.8.8.8

当前远程管理环境中最常使用的是SSH(Secure Shell)。SSH是一个可在应用程序中提供的安全通信的协议,通过SSH可以安全地进行网络数据传输,这得益于SSH采用的非对称加密体系,即对所有待传输的数据进行加密,保证数据在传输时不被恶意破坏、泄露和篡改。不过需要注意的是,Hadoop并不是通过SSH协议进行数据传输的,Hadoop仅仅是在启动和停止的时候需要主节点通过SSH协议将从节点上面的进程启动或停止。也就是说如果不配置SSH对Hadoop的使用没有任何影响,只需在启动和停止Hadoop的时候输入每个从节点的用户名的密码就行了,但是一旦集群的规模增大,这种方式无疑是不可取的,也不利于学习和调试。

在配置SSH无密码连接之前,先关闭防火墙。

执行以下命令(使用root用户执行,所有节点都需执行),关闭防火墙:

service iptables stop

可以通过以下命令永久关闭防火墙:

chkconfig iptables off

1.检查SSH是否安装(使用root用户执行,所有节点都需执行)

绝大多数操作系统已经附带了SSH,但以防万一,这里还是简单介绍一下。

安装SSH协议:

yum install ssh
yum install rsync

rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。

启动SSH服务命令:

service sshd restart

检查SSH是否已经安装成功,可以先执行以下命令:

rpm -qa | grep openssh

如果出现下面的信息:

openssh-askpass-5.3p1-81.el6.x86_64
openssh-5.3p1-81.el6.x86_64
openssh-clients-5.3p1-81.el6.x86_64
openssh-server-5.3p1-81.el6.x86_64

再执行命令:

rpm -qa | grep rsync

如果出现以下信息:

rsync-3.0.6-9.el6.x86_64

说明SSH安装成功。

2.生成SSH公钥(以hadoop用户执行)

对于伪分布模式虽然只有一个节点,但也需要配置SSH无密码本机连接本机。在主节点执行“ssh-keygen -t rsa”,遇到提示回车即可,最后显示的图形是公钥的指纹加密。生成公钥后,需要将公钥发至本机的authorized_keys的列表,执行“ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@master”。

对于完全分布模式,有多个节点,但只需主节点无密码连接从节点,因此在主节点执行:

ssh-keygen -t rsa

遇到提示回车即可,将公钥发至从节点的authorized_keys的列表,执行:

ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave2
...

3.验证安装(以hadoop用户执行)

对于伪分布模式,在主节点执行“ssh master”,如果没有出现输入密码的提示,则安装成功。

对于完全分布模式,在主节点执行“ssh slave1”,如果没有出现输入密码的提示,则安装成功。如果读者发现按照上面步骤执行,仍然不成功,有可能是/home/hadoop/.ssh文件夹的权限问题。以hadoop用户执行:

chmod 700 /home/hadoop/.ssh
chmod 644 /home/hadoop/.ssh/authorized_keys

由于Hadoop是由Java编写而成,所以运行环境需要Java支持,Hadoop需要Java 1.6以上支持。读者所装的CentOS可能预装了Open JDK,但是还是推荐用Oracle JDK,下载地址为http://www.oracle.com/technetwork/Java/Javase/downloads/index.html

(1)卸载Open JDK(root用户执行,所有节点都需执行),查看目前系統的JDK,执行命令“rpm -qa | grep jdk”,如果出现openjdk,则需要卸载之,执行命令“yum -y remove xxx”,xxx为刚才执行“rpm -qa | grep jdk”返回的结果。

(2)安装Oracle JDK(root用户执行,所有节点都需执行),将JDK安装至/opt文件夹下,我们采用tar文件的方式安装,将jdk-7u80-linux-x64.tar.gz移到/opt文件夹下,执行:

tar -xzvf jdk-7u80-linux-x64.tar.gz

(3)配置环境变量(root用户执行,所有节点都需执行),对/etc/profile文件追加:

export JAVA_HOME=/opt/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin

修改环境变量后,就能在任意路径下使用java命令。为了使环境变量立即生效,执行命令:

source /etc/profile

验证安装,执行:

java -version,

如果出现如下Java的版本信息,则说明安装成功。

java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

首先,从root用户取得/opt文件夹的权限(root用户执行,所有节点都需执行)。Hadoop的安装路径一般不推荐装在/home/hadoop文件夹下,推荐安装在/opt文件夹下。执行命令“chown -R hadoop /opt”。然后以hadoop用户将安装文件移到/opt下面。

下面我们分别介绍伪分布模式和完全分布模式的配置方式。

1.伪分布模式

(1)解压文件(以hadoop用户在主节点执行),在/opt下执行:

tar -zxvf hadoop-2.6.0-cdh5.6.0

解压后的文件都会存放在/opt/ hadoop-2.6.0-cdh5.6.0下。

(2)修改配置文件(以hadoop用户在主节点执行),Hadoop的配置文件都在/opt/ hadoop-2.6.0-cdh5.6.0/etc/hadoop下,进入该文件夹下,会发现有若干配置文件,主要的配置文件已列在表2-5中。

表2-5 Hadoop配置文件

文 件 名 称

格  式

描  述

hadoop-env.sh

Bash脚本

记录Hadoop要用的环境变量

core-site.xml

Hadoop配置XML

Hadoop Core的配置项,例如HDFS和MapReduce常用的I/O设置等

hdfs-site.xml

Hadoop配置XML

HDFS守护进程的配置项,包括NameNode、SecondaryNameNode、DataNode等

yarn-site.xml

Hadoop配置XML

YARN守护进程的配置项,包括ResourceManager和NodeManager等

mapred-site.xml

Hadoop配置XML

MapReduce计算框架的配置项

slaves

纯文本

运行DataNode和NodeManager的机器列表(每行一个)

hadoop-metrics.properties

Properties文件

控制metrics在Hadoop和上如何发布的属性

log4j.properties

Properties文件

系统日志文件、NameNode审计日志、DataNode子进程的任务日志的属性

Hadoop的安装只涉及表2-5中的前6个文件。

(1)修改hadoop-env.sh。在文件hadoop-env.sh末尾追加环境变量:

export JAVA_HOME=/opt/jdk1.7.0_80
export HADOOP_HOME=/opt/hadoop-2.6.0-cdh5.6.0

(2)修改core-site.xml。修改core-site.xml为:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
  </property>
</configuration>

该项配置设置提供HDFS服务的主机名和端口号,也就是说HDFS通过master的9000端口提供服务,这项配置也指明了NameNode所运行的节点,即主节点。

(3)修改hdfs-site.xml。修改hdfs-site.xml为:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.name.dir</name>
    <value>/opt/hdfs/name</value>
  </property>
  <property>
     <name>dfs.data.dir</name>
     <value>/opt/hdfs/data</value>
  </property>
</configuration>

dfs.replication配置项设置HDFS中文件副本数为3。HDFS会自动对文件做冗余处理,这项配置就是配置文件的冗余数,3为表示有两份冗余。dfs.name.dir配置项设置NameNode的元数据存放的本地文件系统路径,dfs.data.dir设置DataNode存放数据的本地文件系统路径。

(4)修改mapred-site.xml。修改mapred-site.xml为:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

  <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
   </property>

</configuration>

该项配置指明了MapReduce计算框架基于YARN进行工作。

(5)修改yarn-site.xml。修改yarn-site.xml为:

<configuration>
   <property>
      <name>yarn.resourcemanager.address</name>
      <value>master:8080</value>
   </property>
   <property>
       <name>yarn.resourcemanager.resource-tracker.address</name>
       <value>master:8082</value>
   </property>
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>
    <property>
       <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
       <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

该项配置设置指明了ResourceManager服务的主机名和端口号,另外还指明了mapreduce_shuffle的类。

(6)修改slaves文件。修改slaves文件为:

master

这样指明了主节点同时运行DataNode、NodeManager进程。

2.完全分布模式

在伪分布模式配置的基础上,只需将slaves文件修改为:

slave1
slave2
...

这样,运行DataNode和NodeManager的节点就变为slave1、slave2……,然后利用scp命令将安装文件夹分发到从节点的相同路径下:

scp -r /opt/hadoop-2.6.0-cdh5.6.0 hadoop@slave1:/opt
scp -r /opt/hadoop-2.6.0-cdh5.6.0 hadoop@slave2:/opt
...

至此,Hadoop安装配置工作全部完成,为了能在任何路径下使用Hadoop命令,还需要配置环境变量(root用户执行,所有节点都需执行)。对文件/etc/profile追加如下信息:

export HADOOP_HOME=/home/hadoop/hadoop-2.6.0-cdh5.6.0
export PATH=$PATH:$HADOOP_HOME/bin

这样就不用每次都必须进入/opt/hadoop-2.6.0-cdh5.6.0/bin下面才能使用Hadoop的命令了。修改完成后,环境变量不会立即生效,需要执行命令(root用户执行,所有节点都需执行):

source /etc/profile

在第一次启动Hadoop之前,必须先将HDFS格式化。执行命令:

hadoop namenode -format

按照提示输入Y,格式化成功后会出现格式化成功的信息:

14/04/05 09:50:51 INFO common.Storage: Storage directory /opt/hdfs/name has been 
successfully formatted.

1.启动Hadoop

格式化Hadoop完成后,便可以启动Hadoop,启动Hadoop的命令非常简单,只需执行一个脚本。首先赋予脚本可执行权限(hadoop用户,所有节点都需执行),执行命令:

chmod +x -R /opt/hadoop-2.6.0-cdh5.6.0/sbin

然后执行启动脚本(hadoop用户,主节点执行),执行命令:

./opt/hadoop-2.6.0-cdh5.6.0/sbin/start-all.sh

执行完成后,执行jps命令查看进程是否启动成功,jps命令的作用是显示和Java有关的进程名和进程号,如果是伪分布模式,主节点会出现:

NameNode
DataNode
ResourceManager
NodeManager
SecondaryNameNode

也就是说,所有的进程都运行在一个节点。如果选择完全分布模式安装,在主节点会出现:

NameNode
ResourceManager
SecondaryNameNode

在slave1节点会出现:

DataNode
NodeManager

2.验证是否安装成功

我们以一个MapReduce作业来验证是否安装成功,这个MapReduce作业实现单词计数的功能,例如一篇文章内容为“data mining on data warehouse”,那么单词计数的统计结果为:

data 2
mining 1
on 1
warehouse 1

首先准备一个内容“data mining on data warehouse”的文本文件,命名为words,单词之间以空格分开,保存至/home/hadoop目录下。执行命令:

hadoop dfs -mkdir /user/hadoop/input            在HDFS创建一个目录
hadoop dfs -put /home/hadoop/words /user/hadoop/input 将文本文件上传至刚才创建的HDFS目录
hadoop jar /opt/hadoop-2.6.0-cdh5.6.0/share/hadoop/
mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar 
wordcount/user/hadoop/input/user/hadoop/output      执行MapReduce任务

最后一条命令是指用Hadoop自带的测试用例进行测试,第一个参数是测试用例名,第二个参数是输入文件,第三个是输出目录,以上执行完成后,再执行命令:

hadoop dfs -cat /user/hadoop/output/part-r-00000

看到如下输出,说明Hadoop安装成功:

data 2
mining 1
on 1
warehouse 1

在这一节,我们将进行Hive的安装。与安装Hadoop相比,Hive的安装非常简单,并且有些工作已经在安装Hadoop的时候完成,例如JDK的安装。并且Hive作为Hadoop的一个客户端,运行方式并不分为单机模式、伪分布模式、完全分布模式,所以不管读者在上一节选择伪分布模式或者完全分布模式安装Hadoop,安装Hive的方式只有一种。

安装Hive的步骤分为以下两步。

(1)安装元数据库。

(2)修改Hive配置文件。

由于Hadoop选择的Cloudera的CDH5版本,为了不出现兼容性的问题,Hive也选择CDH5的版本,完整的版本号为hive-1.1.0-cdh5.6.0。不管读者采用伪分布模式还是完全分布模式安装Hadoop,Hive可以被安装至集群任意一个节点(以主节点为例)。

Hive的元数据和数据是分开存放的,数据存放在HDFS上,而元数据默认是存在Hive自带的Derby数据库,但由于Derby只支持同时一个用户访问Hive,所以不推荐使用。我们将使用MySQL作为Hive的元数据库。执行以下命令(以root用户在主节点执行)。

安装MySQL客户端:

yum install mysql

安装MySQL服务器端:

yum install mysql-server
yum install mysql-devel

查看MySQL状态、启动及停止:

service mysqld status
service mysqld start
service mysqld stop

启动MySQL服务后,以root用户登录MySQL执行命令:

mysql -u root -p

创建数据库hive,用来保存Hive元数据:

create database hive;

使hadoop(操作系统用户)用户可以操作数据库hive中的所有表:

GRANT all ON hive.* TO hadoop@'master' IDENTIFIED BY 'hivepwd';
flush privileges;

这样,Hive的元数据库就安装完成。

先将Hive的安装文件解压,将Hive的安装包移至/opt下,以hadoop用户在master执行:

tar -zxvf /opt/hive-1.1.0-cdh5.6.0.tar.gz

和Hadoop相同,Hive的配置文件还是存放在/opt/hive-1.1.0-cdh5.6.0/conf路径下,以hadoop用户创建文件hive-site.xml,添加以下内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
     <name>hive.metastore.local</name>
     <value>true</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionDriverName</name>
     <value>com.mysql.jdbc.Driver</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionUserName</name>
     <value>hadoop</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionPassword</name>
     <value>hivepwd</value>
   </property>
</configuration>

修改/opt/hive-1.1.0-cdh5.6.0/conf/hive-env.sh文件,以hadoop用户在文件末尾追加:

export JAVA_HOME=/opt/jdk1.7.0_80
export HADOOP_HOME=/opt/hadoop-2.6.0-cdh5.6.0

将MySQL的JDBC驱动jar包移到hive-1.1.0-cdh5.6.0/lib文件夹下,否则Hive不能成功连接MySQL,最后还需配置环境变量,以root用户在/etc/profile文件末尾追加:

export HIVE_HOME=/opt/hive-1.1.0-cdh5.6.0
export PATH=$PATH:$HIVE_HOME/bin

追加后执行命令使环境变量立即生效:

source /etc/profile

首先启动Hadoop和MySQL,然后执行:

hive

进入Hive命令行,执行命令,创建一个名为test的表,并查询该表的记录数:

create table test(id int);
select count(*) from test;

如无异常并且结果显示为0,则安装成功。

本节将讲解如何安装HBase。HBase是基于HDFS的,所以在安装HBase之前,要确保安装好了Hadoop。另外,HBase也和Hadoop一样,分为完全分布模式和伪分布模式,下面将分别进行介绍。

将/opt/ hbase-1.0.0-cdh5.6.0.tar解压,执行命令:

tar -zxvf /opt/hbase-1.0.0-cdh5.6.0.tar.gz

打开hbase-site.xml:

vi /opt/hbase-1.0.0-cdh5.6.0/conf/hbase-site.xml

修改hbase-site.xml文件,添加如下配置:

export JAVA_HOME=/opt/jdk1.7.0_80
export HBASE_MANAGES_ZK=true

并注释掉其余与Zookeeper相关的配置,这样做的原因是HBase使用自带的Zookeeper,而不使用单独的Zookeeper集群。

修改regionservers文件,执行命令:

vi /opt/hbase-1.0.0-cdh5.6.0/conf/regionservers

如果是完全分布模式,则regionservers为:

slave1
slave2
…

如果是伪分布模式,则regionservers为:

slave1

接下来,需要配置hbase-site.xml,将配置文件修改为:

<configuration>
  <property>
   <name>hbase.rootdir</name>
   <value>hdfs://master:9000/hbase</value>
  </property>
   <name>hbase.cluster.distributed</name>
   <value>true</value>
  <property>
  </property>
</configuration>

第一个配置指的是HBase在HDFS上的存储目录,第二个是指定HBase的运行模式为完全分布模式,如果是伪分布模式,该配置为false。配置完成后,将文件分发至相应节点(regionservers文件里的节点)。

在regionservers所示的节点上,配置如下环境变量:

export HBASE_HOME=/opt/hbase-1.0.0-cdh5.6.0
export PATH=$HBASE_HOME/bin:$PATH

使环境变量立即生效:

source /etc/profile

下面的工作就是启动并验证了,首先赋予脚本可执行权限,再执行:

chmod +x /opt/hbase-1.0.0-cdh5.6.0/bin/start-hbase.sh
.//opt/hbase-1.0.0-cdh5.6.0/bin/start-hbase.sh

启动完成后,在执行命令的节点用jps命令查看发现以下进程,说明启动成功:

HMaster
HRegionServer
HQuorumpeer

其中,Hmaster是HBase的配置节点,默认会在执行tart-hbase.sh脚本的节点启动,HregionServer根据regionservers文件中的节点启动,HQuorumpeer是Zookeeper的进程。

验证的步骤很简单,首先执行

hbase shell

进入HBase命令行,接着执行

hbase(main):001:0> create 'testtable', 'colfaml'

如果没有报错即安装成功。

需要注意的是,安装完HBase,需要采用NTP时间同步服务使各节点时间一致,否则误差到了一定时间,HBase会启动失败。

Sqoop是一个开源工具,它允许用户将数据从关系型数据库抽取到Hadoop中,用于进一步的处理。抽取出的数据可以被MapReduce作业使用,也可以被其他类似于Hive的工具使用。一旦形成分析结果,Sqoop便可以将这些结果导回数据库,供其他客户端使用。

Sqoop的版本同样选择CDH5,完整的版本号为sqoop-1.4.5-cdh5.6.0,安装Sqoop的步骤非常简单,主要就是修改配置文件,并且Sqoop和Hive作为Hadoop的客户端,也只有一种运行方式,Sqoop可以被安装至集群任意一个节点(以主节点为例)。

将Sqoop安装包上传到/opt文件夹下,执行命令(hadoop用户,主节点执行):

tar -zxvf /opt/sqoop-1.4.5-cdh5.6.0.tar.gz

Sqoop的配置文件同样存放在/opt/sqoop-1.4.5-cdh5.6.0/conf目录下,但是安装过程中并不需要修改配置文件。我们需要修改/opt/sqoop-1.4.5-cdh5.6.0/bin目录下的configure-sqoop文件(hadoop用户执行),将其中关于Zookeep和HBase的行都注释掉,除非集群已经安装了Zookeeper和HBase。

例如:

…
#if [ -z "${HBASE_HOME}" ]; then
# HBASE_HOME=/usr/lib/hbase
#fi
…
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HBASE_HOME}" ]; then
# echo "Warning: $HBASE_HOME does not exist! HBase imports will fail."
# echo 'Please set $HBASE_HOME to the root of your HBase installation.'
#fi
...

全部注释掉即可。

最后修改环境变量(root用户,主节点执行),在/etc/profile文件末尾追加:

export SQOOP_HOME=/opt/sqoop-1.4.5-cdh5.6.0
export PATH=$PATH:$SQOOP_HOME/bin

追加后执行命令使环境变量立即生效:

source /etc/profile

验证安装是否成功的方式很简单,执行命令(以hadoop用户在主节点执行):

sqoop list-databases --connect jdbc:mysql://master:3306/ --username root

执行完成后,屏幕上会显示MySQL数据库中的所有数据库实例,例如在上一节新建的数据库Hive。

读到这里的时候,读者可能觉得安装Hadoop是一件比较麻烦的事情,特别是在需要安装的组件特别多、安装的主机特别多的情况下(例如几百台),这种安装方式就不太可取了。在CDH中,有一个特殊的组件Cloudera Manager,它正是考虑到用户的这种需求。它的主要功能有3个:集群自动化安装部署、集群监控和集群运维。

在CDH4时,Cloudera Manager还有集群规模限制,而在CDH5中,则去除了这个限制。这样中小企业在使用Cloudera Manager时就更加方便。利用Cloudera Manager安装Hadoop,只需在管理节点安装Cloudera Manager,然后启动Cloudera Manager的Web服务,通过可视化界面完成集群安装文件的分发以及集群服务的初始化,如图2-23所示。

图2-23 Cloudera Manager的集群安装向导

安装完成后,Cloudera Manager还提供了事无巨细的监控平台,这对集群维护来说,十分重要,有机器级别的也有服务级别的,如图2-24、图2-25和图2-26所示。

图2-24 机器负载监控

图2-25 服务监控(1)

图2-26 服务监控(2)

此外,Cloudera Manager还提供了常见运维行为的向导,如增加节点、卸载节点等,如图2-27所示。

图2-27 常见的运维向导

CDH基于社区版Hadoop、所以亦遵循开源协议,但是Cloudera Manager本身虽然免费使用,但却是不开源的,这点请想要在生产环境使用的读者需要注意。如果想使用类似的开源产品,可以考虑Apache Ambari。

本章主要安装Hadoop生态圈的各个组件,随着集群容量越来越多,手动方式其实是不可取的,利用批量安装部署的工具可以很快部署大量集群,但对于学习来和理解原理来说,这是必不可少的。


相关图书

Hadoop虚拟化
Hadoop虚拟化
大数据开发者权威教程:NoSQL、Hadoop组件及大数据实施
大数据开发者权威教程:NoSQL、Hadoop组件及大数据实施
Hadoop海量数据处理:技术详解与项目实战
Hadoop海量数据处理:技术详解与项目实战
Hadoop MapReduce实战手册
Hadoop MapReduce实战手册
Hadoop MapReduce性能优化
Hadoop MapReduce性能优化
Hadoop实战手册
Hadoop实战手册

相关文章

相关课程