Hadoop海量数据处理:技术详解与项目实战(第2版)
上QQ阅读APP看书,第一时间看更新

第1章 绪论

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

——狄更斯《双城记》

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

1.1 Hadoop和云计算

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

1.1.1 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所示)。

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

图1-1 Hadoop的LOGO

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

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

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

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

1.1.2 Hadoop生态圈

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

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

图1-2 Hadoop生态圈

●Hadoop Common是Hadoop体系最底层的一个模块,为Hadoop各子项目提供各种工具,如系统配置工具Configuration、远程过程调用RPC、序列化机制和日志操作等,是其他模块的基础。

●HDFS(Hadoop Distributed File System, Hadoop分布式文件系统)是Hadoop的基石。HDFS是一个具有高度容错性的文件系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

●YARN(Yet Another Resource Negotiator,另一种资源协调器)是统一资源管理和调度平台,它解决了上一代Hadoop资源利用率低和不能兼容异构的计算框架等多种问题。它提供了资源隔离方案和双调度器的实现。

●MapReduce是一种编程模型,利用函数式编程的思想,将对数据集处理的过程分为Map和Reduce两个阶段。MapReduce的这种编程模型非常适合进行分布式计算。Hadoop提供了MapReduce的计算框架,实现了这种编程模型,用户可以通过Java、C++、Python、PHP等多种语言进行编程。

●Spark是加州伯克利大学AMP实验室开发的新一代计算框架,对迭代计算很有优势,和MapReduce计算框架相比性能提升明显,并且都可以与YARN进行集成,Spark也提供支持SQL的组件SparkSQL等。

●HBase来源于谷歌的Bigtable论文,HBase是一个分布式的、面向列族的开源数据库。采用了Bigtable的数据模型——列族。HBase擅长大规模数据的随机、实时读写访问。在所有分布式系统中,都需要考虑一致性的问题,ZooKeeper作为一个分布式的服务框架,基于Fast Paxos算法,解决了分布式系统中一致性的问题。ZooKeeper提供了配置维护、名字服务、分布式同步、组服务等。

●Hive最早是由Facebook开发并使用,是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,提供简单的SQL查询功能,并将SQL语句转换为MapReduce作业运行。其优点是学习成本低,对于常见的数据分析需求不必开发专门的MapReduce作业,十分适合大规模数据统计分析。Hive对于Hadoop来说是非常重要的模块,大大降低了Hadoop的使用门槛。

●Pig和Hive类似,也是对大型数据集进行分析和评估的工具,不过与Hive提供SQL接口不同的是,它提供了一种高层的、面向领域的抽象语言:Pig Latin, Pig也可以将Pig Latin脚本转化为MapReduce作业。与SQL相比,Pig Latin更加灵活,但学习成本稍高。

●Impala由Cloudera公司开发,可以对存储在HDFS、HBase的海量数据提供交互式查询的SQL接口。除了和Hive使用相同的统一存储平台,Impala也使用相同的元数据、SQL语法、ODBC驱动程序和用户界面。Impala还提供了一个熟悉的面向批量或实时查询的统一平台。Impala的特点是查询非常迅速,其性能大幅领先于Hive。从图1-2可以看出,Impala并没有基于MapReduce的计算框架,这也是Impala可以大幅领先Hive的原因,Impala的定位是OLAP,是Google的新三驾马车之一Dremel的开源实现。

●Mahout是一个机器学习和数据挖掘库,它利用MapReduce编程模型实现了k-means、Native Bayes、Collaborative Filtering等经典的机器学习算法,并使其具有良好的可扩展性。

●Flume是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

●Sqoop是SQL to Hadoop的缩写,主要作用在于在结构化的数据存储(关系型数据库)与Hadoop之间进行数据双向交换。也就是说,Sqoop可以将关系型数据库(如MySQL、Oracle等)的数据导入到Hadoop的HDFS、Hive,也可以将HDFS、Hive的数据导出到关系型数据库中。Sqoop充分利用了Hadoop的优点,整个导出导入都是由MapReduce计算框架实现并行化,非常高效。

●Kafka是一种高吞吐量的分布式发布订阅消息系统,具有分布式、高可用的特性,在大数据系统里面被广泛使用,如果把大数据平台比作一台机器的话,那么Kafka这种消息中间件就类似于前端总线,它连接了平台里面的各个组件。

说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

1.1.3 云计算的定义

云计算自从诞生之日起,短短几年就在各个行业产生了巨大的影响,而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也对云计算高度关注的原因。

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

1.1.4 云计算的类型

云计算按照服务类型大致可以分为基础设施即服务(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比较清晰地表明云计算和服务集成之间的关系。

图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.1.5 Hadoop和云计算

在谷歌提出“云计算”的概念之前,谷歌工程师在全球顶级计算机会议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作为云计算领域的一颗明星,目前已经得到越来越广泛的应用。

1.2 Hadoop和大数据

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

1.2.1 大数据的定义

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

现在来看看我们如何被数据包围着。在现实的生活中,一分钟或许微不足道,或许连200字也打不了,但是数据的产生却是一刻也不停歇的。来看看一分钟到底会有多少数据产生:YouTube用户上传48小时的新视频,电子邮件用户发送204166677条信息,Google收到超过2000000个搜索查询,Facebook用户分享684478条内容,消费者在网购上花费272070美元,Twitter用户发送超过100000条微博,苹果公司收到大约47000个应用下载请求,Facebook上的品牌和企业收到34722个“赞”, Tumblr博客用户发布27778个新帖子,Instagram用户分享36000张新照片,Flicker用户添加3125张新照片,Foursquare用户执行2083次签到,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.2.2 大数据的结构类型

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

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

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

表1-1 结构化数据

半结构化数据:具有可识别的模式并可以解析的文本数据文件,例如自描述和具有定义模式的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)、准结构化数据(网站地址字符串)和非结构化数据带来了不同的挑战,需要使用不同的技术来分析。

1.2.3 大数据行业应用实例

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

1.你能一直赢吗?

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

2.你喜欢这个吗?

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

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

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

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

1.2.4 Hadoop和大数据

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

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

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

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

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

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

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

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

3.列族存储——HBase

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

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

1.2.5 其他大数据处理平台

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.3 数据挖掘和商业智能

图1-9 Apache Spark

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

1.3.1 数据挖掘的定义

先来看一个例子,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-11 知识发现的过程

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

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

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

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

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

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

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

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

1.3.2 数据仓库

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

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

面向主题的(subject-oriented):数据仓库围绕一些重要的主题,如顾客、供应商、产品和销售组织。数据仓库关注决策者的数据建模和分析,而不是单位的日常操作和事务处理。因此数据仓库通常排除对于决策无用的数据,提供特定主题的简明视图。

集成的(integrated):通常,构造数据仓库是将多个异构数据源,如关系型数据库、一般文件和联机事务处理记录集成在一起。使用数据清理和数据集成技术,确保命名约定、编码结构、属性度量等的一致性。

时变的(time-variant):数据仓库从历史的角度(如过去5~10年)提供信息。数据仓库中的关键结构都隐式地或显式地包含时间元素。

非易失的(nonvolatile):数据仓库总是物理地分离存放数据,这些数据源于操作环境下的应用数据。由于这种分离,数据仓库不需要事务处理、恢复和并发控制机制。数据的易失性在于操作型系统是一次访问和处理一个记录,可以对操作环境中的数据进行更新。但是数据仓库中的数据呈现出非常不同的特性,数据仓库中的数据通常是一次载入和多次访问的,但在数据仓库环境中并不进行一般意义上的数据更新。通常,它只需要两种数据访问操作:数据的初始化装入和数据访问。

1.3.3 操作数据库系统和数据仓库系统的区别

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

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

用户和系统的面向性:OLTP是面向客户的,用于办事员、客户和信息技术专业人员的事务和查询处理。OLAP是面向市场的,用于知识工人(包括经理、主管和分析人员)的数据分析。

数据内容:OLTP系统管理当前数据。通常,这种数据太琐碎,很难用于决策。OLAP系统管理大量历史数据,提供汇总和聚集机制,并在不同的粒度层上存储和管理信息。

●这些特点使得数据更容易用于有根据的决策。

视图:OLTP系统主要关注一个企业或部门内部的当前数据,而不涉及历史数据或不同单位的数据。相比之下,由于单位的演变,OLAP系统常常跨越数据库模式的多个版本。OLAP系统还要处理来自不同单位的信息,以及由多个数据库集成的信息。由于数据量巨大,OLAP系统的数据通常也存放在多个存储介质上。

访问模式:OLTP系统主要由短的原子事务组成。这种系统需要并发控制和恢复机制。

●然而,对OLAP系统的访问大部分是只读操作(由于大部门数据仓库存放历史数据,而不是最新数据),尽管这其中的许多操作可能是复杂的查询。

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

1.3.4 为什么需要分离的数据仓库

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

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

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

1.3.5 商业智能

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

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

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

图1-12 商业智能系统

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

1.3.6 大数据时代的商业智能

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

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

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

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

1.4 小结

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