第 3 章 Hadoop入门 本章介绍Hadoop分布式文件系统(HadoopDistributedFileSystem, HDFS)及MapReduce编程模型的基本原理。Hadoop已经从1.0版发展到2.0版、 3.0版,在介绍Hadoo0的基础上,本章对Had0进行了初步介绍。 p1. op2. ..3.1 Hadoop 简介 ApacheHadoop是存储和处理大数据的开源软件框架。Hadoop项目由 DougCuting和MikeCafarela于2005年创建,其最初的目标是提供Nutch搜 索引擎的分布式处理能力。目前,DougCuting是Cloudera公司的首席架构 师,Cloudera是一家基于Hadoop开源软件、提供增值开发和服务的创业公司。 在扩展性(Scalability)方面,Hadoop能够在上千台机器组成的集群上运 行。大规模集群的可靠性,不能仅仅靠硬件来保证,因为节点的失败、网络的失 败等状况不可避免。为了能够在大规模集群上顺利运行,Hadoop的所有模块, 其设计原则都基于这样的基本假设,即硬件的失败在所难免,每个节点都没有 那么可靠,可能发生节点失败状况,软件框架应该能够自动检测和处理这些失 败情况。Hadoop 通过软件,在大规模集群上提供高可用性(High Availability)。 Hadop软件框架使用简单的编程模型MapRdcop1.用 oeue。在Hado0中, 户只需以Map函数和Reduce函数的形式提供数据处理逻辑,就可以在大规模 集群上对大数据进行处理。系统的可靠性、扩展性,以及分布式处理等功能,由 系统软件层提供,用户无须关心。 2013年,Hadop已经从1.0(op3. o0演化发展到2.YARN①)。目前,Hado0 已经处于Geeaalbe状态, op2.3版为准进行介绍。在 nrlAvial本书仍以Hado7. oooop1.oop2. 介绍Hadp软件时,首先介绍Had0的关键技术,然后对Had0的 新特性做详细的介绍。 Hadoop软件框架,包含如下主要模块。 (1)HadoopCommon。这个模块包含了其他模块需要的库函数和实用 ① YARN全称YetAnotherResourceNegotiator。 30 Hadop与Spark入门 函数。 (2)HDFS 。这是在由普通服务器组成的集群上运行的分布式文件系统,支持大数 据的存储。通过多个节点的并行I/O,提供极高的吞吐能力。 (3)HadoopMapReduce。一种支持大数据处理的编程模型。 (pYARN 。这是Had0的基础模块,它本质上是一个资源管理和任 4)Hadoooop2. 务调度软件框架。它把集群的计算资源管理起来,为调度和执行用户程序提供支持。 值得指出的是,HDFS和MapReduce分别是受到Google文件系统(GoogleFile System,GFS )、GoogleMapReduce计算模型的启发,对其进行模仿实现的开源软件。 ..3.2 HDFS HDFS是一个分布式的、高可扩展的文件系统。它使用Java语言进行编写,具有良 好的可移植性。 一个HDFS集群一般由一个NameNode和若干DataNode组成,分别负责元信息的 管理和数据块(Block)的管理,如图3-1所示。 图3- 1 HDFS架构 NameNode是HDFS中的管理者。它负责管理文件系统的命名空间,维护文件系统 的文件树以及文件树中全部的文件和文件夹的元数据。这些信息存储在NameNode维 护的两个本地磁盘文件里:命名空间镜像文件(FsImage)和编辑日志文件(EditLogs)。 同时,NameNode中还保存了每个文件及其数据块所在的DataNode的对应关系,这些信 息被用于其他功能组件查找文件(数据块)所在的DataNode。 DataNode是HDFS中保存数据的节点。 HDFS支持太字节(TB)级甚至拍字节(PB)级大小文件的存储,它把文件划分成数 据块,分布到多台机器上进行存储。为了保证系统的可靠性,HDFS把数据块在多个节点 上进行复制(Replicate)。 如果HDFS采用的复制因子(ReplicateFactor)为3,那么每个数据块有3个副本,被 保存到3个节点上,其中的两个节点在同一个机架内,另一个节点一般在其他机架上。 DataNode之间可以复制数据副本,从而重新平衡每个节点存储的数据量,并且保证系统 的可靠性(保证每个数据块都有足够的副本)。DataNode定期向NameNode报告其存储 的数据块列表,以备用户通过直接访问DataNode获得相应的数据。 HDFS一般存储不可更新的文件,只能对文件进行数据的追加。Hadoop大数据处 理系统一般用来支持大数据的分析型处理,数据一旦装载,一般无须进行更新。 第3章Hadop入门31 由于HDFS是用Java编写的,所以它内生地支持Java应用程序接口(Application ProgramInterface,API )。此外,HDFS还支持各种流行的编程语言,包括C++、Python、 Ruby和C#等。 Hadoop的上层模块,如MapReduce计算模型的运行时(Runtime),根据NameNode 上的元信息就可以知道每个数据块有多少副本,这些副本分别存放到哪些节点上,于是可 以把计算任务分配到这些节点上执行。把计算移动到数据上,而不是移动数据本身,大大 减少了大数据处理过程中的数据移动开销,加快计算过程。 3.1 写文件 2. 为了进行文件数据的读写,客户端询问NameNode,了解到它应该存取哪些 DataNode,然后客户端直接和DataNode进行通信,数据的传输使用DataTransfer协议, 这是一个流数据传输协议,可以提高数据传输的效率。 所有NameNode和DataNode之间的通信,包括DataNode的注册、心跳信息、报告数 据块的元信息等,都是由DataNode发起请求,NameNode被动应答并完成管理。 当创建一个文件时,客户端把文件数据缓存在一个临时的本地文件。当本地文件累 积了超过一个数据块大小的数据时,客户端程序联系NameNode。NameNode更新文件 系统的命名空间(Namespace),并且返回新分配的数据块的位置信息。客户端程序根据 这个信息把文件块数据从本地临时文件发送给(Flush)DataNode进行保存。当文件关闭 (Close)时,剩下的最后一个数据块传输到DataNode进行保存。 接下来介绍HDFS如何创建一个文件,把数据写入后关闭文件。整个过程涉及7个 主要的步骤,如图3-2所示。 图3- 2 HDFS文件的写入过程 (1)客户端程序调用DistributedFileSystem的create方法。 (2)DistributedFileSystem向NameNode发起一个远程过程调用(RemoteProcedure Cal,RPC),由其在其文件系统的命名空间里创建一个新文件。这时,该文件还没有任何数 据块。 NameNode进行一系列的检查,保证文件并未存在(才可以新建),而且客户端有权限 创建该文件。如果检查通过,那么NameNode为新文件创建一个新的记录,保存其信息, 否则文件创建失败。 32 Hadop与Spark入门 如果文件创建成功,DistributedFileSystem返回FSDataOutputStream给客户端程 序,以便其开始写入数据。FSDataOutputStream包含一个DFSOutputStream对象,负 责和NameNode以及DataNode的通信。 (3)当客户端开始写入数据,DFSOutputStream把数据分解成数据包(Packet),并且 写入一个内部队列,称为数据队列(DataQueue)。DataStreamer消费这个数据队列,请 求NameNode为新的数据块分配空间,即选择一系列合适的DataNode,用于存放各个数 据块的副本。 ataNodPipelin (4)存放各个副本的De形成一个流水线(e),假设复制因子是3,于是 在流水线上有3个节点。DataStreamer把数据包发送到第一个DataNode,这个 DataNode保存数据包,并且转发给流水线上的第二个DataNode。 当写入数据已经超过一个数据块的大小时,DataStreamer向NameNode申请为新的 数据块分配空间。 第二个DataNode保存这个数据包,并且转发给第三个(最后一个)DataNode。 (5)DFSOupuSram同时维护一个数据包的内部队列(nenlQuu用于等待 ttteItraee), 接收DataNode的应答信息,称为AckQueue。当某个数据包已经被流水线上的所有 DataNode应答以后,它才被(从AckQueue上)删除。 (6)当客户端程序完成数据写入,它调用FSDataOutputStream数据流的close 方法。 (7)客户端把所有剩余的数据包发送到DataNode流水线上,并且等待应答信息,最 后联系NameNode,告诉它文件结束。 NameNode知道文件由哪些数据块构成(DataStreamer请求它为新的数据块分配空 间),它等待数据块的复制完成,然后返回文件创建成功。 3.2 读文件 2. 在进行文件读取时,首先客户端程序使用将要读取的文件名、读取范围(ReadRange)的 开始偏移量和读取范围的长度等信息,询问NameNode。NameNode返回落在读取范围内的 数据块的位置(Location)信息。每个数据块的位置信息条目,根据与客户端的临近性 (Proximity)进行排序。客户端一般选择最临近的DataNode,向其发送读取请求。 对整个文件进行读取的过程,如图3-3所示。 图3- 3 HDFS文件的读取过程 第3章Hadop入门33 客户端程序从HDFS读取整个文件的主要步骤如下。 (1)客户端程序通过调用Flsee获得DsrbtdFlse 类的一个实例。 ieSytm对象的opn方法打开文件, itiueieSytm (2)DistributedFileSystem通过远程过程调用NameNode,获得文件首批数据块的 位置信息。对于每个数据块来说,NameNode会返回拥有这个数据块副本的所有 DataNode的地址。DistributedFileSystem返回FSDataInputStream类的一个实例,这是 一个输入流(InputStream),支持文件的定位和数据的读取,使得客户端可以读取文件数 据。FSDataInputStream包含了一个DFSInputStream对象,负责管理客户端对HDFS 的DataNode和NameNode的存取。 (3)客户端程序从输入流上调用read函数。由于DFSInputStream已经保存了文件 首批若干数据块所在的DataNode的地址,DFSInputStream连接最近的(Closest) DataNode,读取文件的第一个数据块。 (4)数据从DataNode源源不断传送回客户端程序,而客户端程序则不断地调用数据 流的read方法。 (5)当到达数据块的末尾时,DFSInputStream将关闭DataNode的连接,然后寻找下 一个数据块最优的DataNode,以便进行后续数据块的读取。DataNode的选择对客户端 程序是透明的,客户端程序只是从一个连续的数据流进行读取。 客户端按照顺序读取各个数据块。当客户端不断读取数据流时,在数据块的边界, DFSInputStream不断创建到保存有后续数据块的DataNode的连接。DFSInputStream 同时向NameNode询问和提取下一批数据块的DataNode的位置信息。 (6)当客户端完成文件的读取,它调用FSDataInputStream实例的close方法。 3.3 ScnayNmNde介绍 2.eodraeo NameNode集中存储了HDFS的元信息。它负责执行命名空间的一些操作,如创 建、删除、修改、列出所有文件和目录等。它还执行数据块的管理操作,包括把文件映射到 所有的数据块、创建和删除数据块、管理副本的放置和进行重新复制操作等。 此外,NameNode还负责DataNode的成员管理,即接受其注册(Registration)和周期 性的心跳信息(HeartBeat)等。客户端和HDFS的数据传输是在客户端和DataNode之 间进行的,数据传输不经过NameNode。 为了支持高效的存取操作,NameNode把所有的元信息保存在内存中,包括文件命名 空间、文件到数据块的映射、每个数据块副本的位置信息等。这些信息,也持久化到 NameNode的本地文件系统。NameNode的本地文件包括FsImage文件和EditLogs文 件。FsImage文件保存这些元信息。EditLogs文件则是一个事务日志(TransactionLog)文 件,记录了对文件系统元信息的所有更新操作,如创建文件、改变文件的复制因子等。 当NameNode启动(或者重启)时,它装载FsImage文件,并且把EditLogs的所有事 务日志,应用到从FsImage文件装载的元信息上,得到文件系统元数据的一个新快照(即 新的FsImage),接着把这个新的FsImage(内存中)保存到磁盘,并且截短EditLogs。此 后,在NameNode运行过程中,EditLogs继续记录对文件系统的改动的日志序列。 34 Hadop与Spark入门 由于NameNode保存了HDFS的所有元信息,只有NameNode才知道如何从 DataNode的各个数据块重构一个文件。NameNode出故障,将引起整个HDFS不能提 供服务。 一般来讲,在生产系统中NameNode是很少重启的,于是NameNode运行了很长时 间之后,EditLogs文件会变得越来越大。如何存储越来越大的EditLogs文件是一个问 题,而且下次NameNode重启,会花费相当长的时间。因为EditLogs包含了很多改动, 需要合并到FsImage文件中。 SecondaryNameNode为解决上述问题而生。SecondaryNameNode的职责是合并 FsImage文件和EditLogs文件,生成新的快照(即新的FsImage)。 首先,当NameNode的EditLogs文件的大小达到一个临界值(默认是64MB)或者间 隔一段时间(默认是1h)时,它发出一个检查点(Checkpoint)指示给SecondaryNameNode。 然后,SecondaryNameNode 到NameNode 获取FsImage 和EditLogs。在 NameNode上,当触发一个Checkpoint操作时,NameNode会生成一个新的EditLogs,即 EditLogs(New)。 SecondaryNameNode把EditLogs应用到FsImage,得到新的FsImage(即Checkpoint) 文件以后,把它复制回NameNode中。NameNode用新的FsImage(即Checkpoint)和 EditLogs(New),替换原来的FsImage和EditLogs,保持EditLogs的规模可控。 NameNode在下次重启时,会使用这个新的FsImage文件,这样它需要处理的EditLogs 记录变少很多,减少了重启的时间。 可以看到,SecondaryNameNode的工作是定期合并FsImage和EditLogs。SecondaryNameNode需要在另一台机器上运行,它需要和NameNode一样规模的CPU计算能力 和内存空间,以便完成这个工作。 如果NameNode出现故障,这时可以准备另一台机器,硬件规格和NameNode类似,配 置文件一样。把SecondaryNameNode的Checkpoint复制过来,进行import操作,可以恢复 FsImage,于是可以把这台机器当作新的NameNode来使用。由于SecondaryNameNode不 是进行同步的备份,所以它会丢失故障的NameNode的部分EditLogs数据。 对SecondaryNameNode的改进是BackupNode,即备份节点。这个节点的运行模式 类似关系数据库管理系统(RelationalDatabaseManagementSystem,RDBMS)使用的主 从复制功能,NameNode可以实时地将日志传送给BackupNode,BackupNode及时把日 志合并到FsImage(在内存中),然后将内存中的FsImage保存到本地磁盘,并且重置 EditLogs。 当NameNode出故障时,BackupNode能够恢复出最新的FsImage。 ..3.3 MapReduce工作原理 下面从两方面介绍MapReduce:一方面是MapReduce作业(Job)是如何运行的;另 一方面是MapReduce编程模型是如何把一个计算任务表达成一个Map函数和一个 第3章Hadoop入门35Reduce函数的。 3.3.1MapReduce执行引擎 MapReduce执行引擎运行在HDFS之上,包括JobTracker和TaskTracker两个主 要的组成部分,分别运行在NameNode和DataNode上。用户提交的数据处理请求,称为 一个作业,由JobTracker分解为数据处理任务(Task),分发给集群里的相关节点上的 TaskTracker运行,如图3-4所示。 图3- 4 MapReduce执行引擎 客户端程序把作业提交给Jr以后,r把数据处理任务发送给整个 obTrackeJobTracke 集群各个节点的TaskTracker。发送任务的原则:尽量把任务推送到离数据最近的节点 上运行,甚至是推送到数据所在的节点上运行。 在HDFS里,r通过HDFSNameNode知道哪些节点包含将要处理的各个 JobTracke 数据块,也就是它了解数据块的存放位置。如果任务不能发送到数据块所在的节点,如因 为该节点目前的任务槽(TaskSlot,即每个TaskTracker可以运行的Task数量)已经用 完,那么系统优先把任务推送到同一机架里的其他节点,该节点保留了数据块的另外一个 副本(Replica)。这样的任务分发策略,避免或者减少了数据的网络传输(Network Transfer),进而减少集群核心骨干网络(BackboneNetwork)上的网络流量。 如果TaskTracker失败或者运行超时,它负责的任务就会被JobTracker重新调度到 其他的TaskTracker上。 t 在 ), TaskTracker运行过程中,它向JobTracker每隔几分钟发送 一个心跳信号(HeartBea以便报告其存活状态。JobTracker和TaskTracker的状态 信息,通过内置的一个HTTP服务器(Jety)报告出来,可以通过浏览器进行查看。 在Hadop0.JbTakr失败以后,所有的数据处理操作都丢失了。 o20以前的版本,orce 从Hadop0.op增加了作业处理过程的检查点(ekpitn功能。 o21版本开始,HadoChconig) JobTracker在HDFS里面,记录当前作业的进展程度。当新的JobTracker启动以后,它 可以根据这些检查点信息,从上次检查点位置,继续数据处理工作,而不是从头开始。这 个功能改善了作业的调度效率。 36Hadoop与Spark入门 图3-5把HDFS和MapReduce执行引擎的关系,清晰地展示出来。MapReduce和 HDFS运行在同一个集群上,它们是同一个集群上运行的不同软件模块,分别提供数据存 储和数据处理功能。图3-6则展示了MapReduce作业的运行过程。 图3-5HDFS与MapReduce的关系 图3- 6 MapReduce作业的运行过程 当一个MapRe作业提交到集群中,r负责确定其运行计划,包含需要处理 educJobTracke 哪些文件、分配Map和Reduce任务的运行节点、监控任务的运行、再一次分配失败的任务 等。每个Hadoop集群中仅有一个JobTracker。TaskTracker负责运行由JobTracker分配的 任务,每个TaskTracker能够启动一个或多个Map/Reduce任务。 被分配了任务的TaskTracker从HDFS中取出所需的文件,包括JAR程序文件和任 务相应的数据文件,存入本地磁盘,并启动一个TaskRunner程序实例准备执行任务。 TaskRunner在一个新的Java虚拟机中依据任务类型创建出MapTask或 ReduceTask进行运算。在新的Java虚拟机中执行MapTask和ReduceTask的原因是, 避免这些任务的执行异常影响TaskTracker的正常执行。MapTask和ReduceTask会定 时与TaskRunner进行通信报告进度,直到任务完毕。 每个TaskTracker节点可执行Map任务和Reduce任务的数量也是有限的,即每个 TaskTracker有两个固定数量的任务槽,分别响应Map任务和Reduce任务。在进行任 务分配时,JobTracker优先填满TaskTracker的Map任务槽,即只要有空暇Map任务 第3章Hadoop入门37 槽,就分配一个Map任务,Map任务槽满了之后,才分配Reduce任务。注意,一个 MapReduce作业的MapTasks和ReduceTasks有先后依赖关系。 MapReduce框架为了避免某个没有失败、但运行缓慢的任务影响整个作业的运行速 度,设计了备份任务机制。 3.3.2MapReduce计算模型 在MapReduce计算模型中,数据以键-值对进行建模。几乎所有的数 据都可以使用这个数据模型进行建模,Key和Value部分可以根据需要保存不同的数据 类型,包括字符串、整数或者更加复杂的类型。 MapReduce并行编程模型把计算过程分解为两个主要阶段,即Map阶段和Reduce 阶段。MapReduce程序的计算过程如图3-7所示。首先,保存在HDFS里的文件即数据 源,已经进行分块。这些数据块交给多个Map任务执行,Map任务执行Map函数,Map 函数根据特定规则对数据进行处理,写入本地硬盘。Map阶段完成后,进入Reduce阶 段,Reduce任务执行Reduce函数,把具有同样Key值的中间结果,从多个Map任务所在 的节点收集到一起(Shuffle)进行约减处理,并将输出结果写入本地硬盘(HDFS )。程序 的最终结果,可以通过合并所有Reduce任务的输出得到。需要注意的是,输入数据、中 间结果及最终结果,都是以的格式保存到HDFS中。 图3- 7 MapReduce程序的计算过程 Map函数处理键-值对,产生一系列的中间键-值对。Reduce函数合并所有具有相同 Key值的中间键-值对,计算最终结果。MapReduce计算模型,可以形式化地表达成 Map:→list,Reduce:→list。 下面通过WordCount实例,解释Map函数和Reduce函数如何对数据进行操作,以 及MapReduce程序如何对整个数据文件进行处理。 WordCount程序对整个文件里出现的不同单词进行计数。Map函数的功能是,对文 件块出现的每个单词,输出<单词,1>的键-值对,如图3-8所示;而Reduce函数,则把各 个Map函数输出的结果,按照单词进行分组,统计其出现的次数,如图3-9所示。 MapReduce执行引擎在执行WordCount程序时,JobTracker接收了WordCount程 序以后,根据文件的数据块所在的节点,在这些节点上启动TaskTracker后运行Map函 数,Map函数执行完毕后,把结果存放在各个节点的本地文件里。 38Hadoop与Spark入门 图3-8WordCount的Map函数功能图3-9WordCount的Reduce函数功能 接着JobTracker在各个节点上启动TaskTracker后运行Reduce函数,这些任务从 各个Map任务执行的各个节点上,把具有相同Key值(即相同单词)的中间结果,收集到 一起,就能够汇总出各个单词的计数。WordCount程序的执行过程如图3-10所示。 图3-10 WordCount程序的执行过程 3.3Hd0的应用 3.aop1. e计算模型是由Goe提出来的,Had0是对MapRe计算模型 MapReducogloop1.educ 的开源实现。根据上述描述,MapReduce计算模型看起来特别简单。实际上,在这种简 单的处理之上可以实现复杂的数据处理任务。 除了简单的SQL汇总之外,研究人员已经把联机分析处理、数据挖掘、机器学习、信 息检索、多媒体数据处理、科学数据处理、图数据处理等复杂的数据处理和分析算法,移植 到Hadoop平台上(即MapReduceJob)。 Hadoop不仅是一个处理非结构化数据的工具,当数据按照一定格式进行适当组织 后,Hadoop平台也可以处理结构化数据。Hadoop平台以及Hadoop上的各种工具构成 了一个生态系统,完成各种大数据集的处理任务。 ..3.4 Hadoop生态系统 在HDFS和MapReduce计算模型之上,若干工具一起构成了整个Hadoop生态系 统,如图3-11所示。下面对这些组件进行简单介绍。 第3章Hadoop入门39 图3-11Hadoop生态系统 Hive是Hadoop平台上的数据仓库,用于对数据进行离线分析。它提供了一种类似 SQL的Hive查询语言(HiveQueryLanguage,HQL )。Hive将SQL转化为MapReduce 作业并在Hadoop上执行。 HBase是GoogleBigTable在Hadoop平台上的开源实现。它是一个针对结构化数 据处理的、面向列分组的、可伸缩的、高度可靠的、高性能的分布式数据库。一般用于数据 服务(DataServing)应用场合。 Pig实现了数据查询脚本语言PigLatin。用PigLatin脚本语言编写的应用程序,被 翻译为MapReduce作业,在Hadoop上运行。在实际应用开发中,按照MapReduce计算 模型编写某些数据处理任务,如表格之间的连接操作,过于烦琐。PigLatin提供了连接 操作,还提供了其他原语操作,方便开发人员编写数据操作算法。像Hive一样,Pig一般 用于离线分析。二者的主要区别是,Hive使用声明性(Declarative)的语言HQL,而Pig 使用过程性(Procedure)的语言PigLatin。 Flume是一个可扩展的、高度可靠的、高可用的分布式海量日志收集系统,一般用于 把众多服务器上的大量日志聚合到某个数据中心。Flume提供对日志数据进行简单处理 的能力,如过滤、格式转换等。同时,Flume可以将日志写往各种目标(本地文件、 HDFS )。 Sqoop是SQLtoHadoop的缩写,主要用于在关系数据库或者其他结构化数据源和 Hadoop之间交换数据。例如,Sqoop可以把MySQL等数据库数据导入Hadoop里, 括HDFS 、HBase以及Hive;反过来,它也可以将Hadoop的数据导出到MySQL数据库(包) 中。数据的导入导出都通过MapReduce作业(应用程序)实现,充分利用了MapReduce 的并行化处理能力和容错性能。 Mahout是Hadoop平台上的机器学习软件包,它的主要目标是实现高度可扩展的机 器学习算法,以便帮助开发人员利用大数据进行机器学习模型训练。Mahout现在已经 包含聚类、分类、推荐引擎(协同过滤)、频繁集挖掘等经典数据挖掘和机器学习算法。 Oozie是一个工作流调度器(Scheduler)。Oozie协调运行的作业,属于一次性非循环 的作业,如MapReduce作业、Pig脚本、Hive查询、Sqoop数据导入导出作业等。Oozie基 40Hadoop与Spark入门 于时间和数据可用性进行作业调度,根据作业间的依赖关系协调作业的运行。 Zookeeper是模仿Google公司Chubby系统的开源实现,Chubby是一个分布式的锁 (Lock)服务。大部分分布式应用都需要这样一些公共服务,包括树状结构的统一命名服 务、状态同步服务(通过分布式共享锁)、配置数据的集中管理、集群管理(如集群中节点的 状态管理及状态变更通知,节点数据变更的消息通知)等。这些服务难以实现,也难以调 试。借助Zookeeper,人们就无须为每个分布式应用实现这些功能,从而加快分布式应用 的开发和部署。 在由一个Master节点和多个Slave节点组成的分布式软件框架中,单一的Master 节点有可能导致单点失败,影响整个系统的可靠性。用Zookeeper管理的若干Master节 点(其中一个节点是ActiveMaster)代替Master节点,就不必担心单点失败问题了。如 果ActiveMaster节点失败了,Zookeeper可以挑选其他Master节点来顶替。 传统的RDBMS,擅长处理关系数据,支持单一的应用,即单一平台、单一应用;而各 类NoSQL数据库软件,使用不同的数据模型和存储格式,针对不同的应用场景,属于多 平台、多应用。Hadoop及其生态系统则实现了单一平台、多种应用。Hadoop生态系统, 在底层利用HDFS实现各种数据的统一存储,在上层由很多组件/工具实现各种数据管 理和分析功能,满足各种应用场景的要求。 ..3.5Hadoop2.0 0的优势和局限 3.5.1 Hadop1. Hadop1.op已经被部署到 o0最重要的优势是它的可扩展性。在实际应用中,Hado 超大规模的集群上(超过3000个节点),对于传统的RDBMS,这是无法想象的。 为什么需要这么大规模的集群对数据进行处理呢? 因为当数据规模极大时,需要考 虑扩展性的代价及I/O瓶颈等因素。 第一个因素是是否能够很方便地对系统进行扩展。由于Hadoop能够运行在由普通 服务器构成的超大规模集群上,所以SQLonHadoop系统比传统的MPP数据库系统(如 Teradata、Vertica、Neteza等)具有更强的扩展能力。而传统的MPP数据库系统,需要 运行在高端服务器上,价格高昂,而且很难扩展到上千个节点。 第二个因素是处理大数据时的I/O瓶颈。当数据的规模足够大时,只有一部分数据 可以装载到内存中,剩下的数据必须保存在磁盘里。并且在处理过程中,需要从磁盘上不 断装载到内存中,进行后续处理。通过把I/O分散到大规模集群的各个节点上,可以大 大提高数据装载的速度,进而加快后续的处理。大规模集群把各个节点的I/O带宽聚集 起来,获得比高端服务器大几十倍甚至上百倍的I/O带宽,这无疑是一个廉价且有效的 大数据处理方案。 在2008年,Yahoo公司使用一个拥有910个节点的Hadoop集群,在209s内完成了 1TB数据的排序,打破了TerabyteSort评测基准的纪录(297s)。这个事件的重要意义在 于,这是用Java编写的开源程序首次赢得TerabyteSort评测基准。 第3章Hadoop入门41 在2011年3月,MediaGuardian媒体集团,把年度创新奖(InnovationAwardsofthe Year)颁发给了Hadoop项目。评审委员会认为,Hadoop项目是21世纪的瑞士军刀 (SwissArmyKnifeofthe21stCentury)。Hadoop平台已经成为大数据处理的标准工 具,它的重要作用被越来越多的人认识到。 虽然Hadoop已经在处理大数据方面获得了巨大的成功,但是它也有一些重要的缺 点。Hadoop1.0的主要局限如下。 (1)Hadoop1.0仅支持一种计算模型,即MapReduce。MapReduce计算模型的表达 能力有限。复杂的数据处理任务,如机器学习算法和SQL连接查询等,很难表达为一个 MapReduce作业,而是需要翻译成一系列的MapReduce作业,这些作业一个接一个地 执行。 (2)由于MapReduce作业在Map阶段和Reduce阶段执行过程中,需要把中间结果 存盘,而且在MapReduce作业间,也需要通过磁盘实现MapReduce作业之间的数据交 换。通过磁盘进行数据交换效率低下,影响查询的执行效率。在这个计算模型上,很难再 继续减小查询的响应时间。 (3)Hadoop1.0的任务调度方法远未达到优化资源利用率的效果。在Hadoop1.0 中,对任务的调度方法,即如何给TaskTracker分配任务的过程比较简单。每个 TaskTracker拥有一定数量的任务槽,每个活动的Map任务或者Reduce任务占用其中 一个任务槽。JobTracker把工作分配给最靠近数据的TaskTracker,这个TaskTracker 正好有可用的任务槽。在这个调度方法下,并未考虑将要被分配任务的机器当前的系统 负载是否过高。如果某个TaskTracker执行非常慢,它将会影响整个MapReduce作业的 执行,整个MapReduce作业等待最慢的任务完成才能结束。当然,可以通过猜测执行 (SpeculativeExecution)模式,在多个Slave节点上启动同一个任务(Task),只要有其中 一个任务完成即可。 3.5.2 从Hd0到Hadop2. aop1.0 Hadoop在大数据处理领域展现了强大的能力。人们自然希望把不同来源的数据, 不管它是结构化的还是非结构化的,都保存到Hadoop中,在这些数据上面执行各种各样 的分析。 Hadoop最初是为大数据的批处理设计的,它的关注点在于,以尽量高的吞吐量处理 这些数据。但是,人们希望Hadoop还能够支持交互式查询、数据的迭代式处理、流数据 处理及图数据处理等。其中,数据的迭代式处理是机器学习算法所必需的,即机器学习算 法一般需要对数据进行多遍扫描和处理。 在这种形势下,Hadop2.op2.是在整个软件架构 o0应运而生。Hado0的主要改变, 里划分出了资源管理框架YARN 。由于YARN是Hadop2.所以有 oop2. o0的重要组成部分, 时把YARN和Had0互换使用。 3.3 YARN 原理 5. YARN把资源管理(ResourceManagement)和作业调度/监控(JobScheduling/ 42 Hadop与Spark入门 g)模块分开。在Had0中,这两个功能都由Jr负责。 在Hadoo0中,系统仅能够支持一种计算模型,即MapReue。在Hadop2. Monitorinoop1.obTracke p1.dco0 中,系统可以支持更多的计算模型,包括流数据处理、图数据处理、批处理、交互式处理等, -oop2.educ 如图312所示。在Had0中,应用程序可以是传统的MapRe作业,也可以是 由一系列任务构成的一个有向无环图(DirectedAcyclicGraph,DAG)表达的作业,其中 DAG能够表达更加复杂的数据处理流程。 图30大数据处理框架里的Ma -12 Hadop2.pReduce 通过把资源管理功能单独划分出来,由ResourceManager进行管理,MapReduce在 0中仅需要完成其擅长的工作,即批量数据处理。于是,在Had0之上可 Hadoop2.oop2. 以运行其他类型的应用,它们使用的是同一个资源管理模块。 图3-13展示了Hadop20的主要组件及其关系。在新的架构里,包含ResourceManager 和NodeManager两个重要(.) 的组件。ResourceManager运行在Master节点上, NodeManager运行在Slave节点上,一起负责分布式应用程序的调度和运行。在Hadoop 0平台上,应用程序包括MapRe作业、Hie查询、g脚本及Giph查询等。2.educvPira 图30组件及其关系 -13 Hadop2. 第3章Hadoop入门43ResourceManager是为应用程序分配资源的最高权威。ResourceManager包含两个 组件,即Scheduler和ApplicationManager。 Scheduler负责为应用程序分配资源,它根据应用程序的资源需求及一些限制条件, 包括各个用户的限额等,完成资源的分配和调度。Scheduler使用资源容器(Container) 的概念,把CPU、内存、磁盘、网络带宽等资源整合起来。 ApplicationManager接收客户端应用程序提交的作业,向Scheduler为该应用程序 申请第一个容器,运行针对这个应用程序的ApplicationMaster,用于执行提交的作业(应 用程序),并且在发生失败的情况下,重新启动这个应用程序的ApplicationMaster。 ApplicationMaster从Scheduler为应用程序申请资源,和NodeManager一道,在分布式 环境下执行应用程序,并追踪其状态、监控作业的进展情况。执行应用程序时, ApplicationMaster监视容器直到其完成。当应用程序完成时,ApplicationMaster从 ResourceManager注销其容器,执行周期完成。 NodeManager运行在Slave节点上,它为应用程序启动容器,监控其资源使用情况(包括 CPU、内存、磁盘、网络带宽的使用情况),并且把这些信息报告给ResourceManager。 作业的调度过程如图3-14所示。 图30的作业调度 -14 Hadop2. 3.4 YARN 的优势 5. 相对于Hadoo0,Hado0(YARN)具有如下主要优势。 p1.op2. (1)扩展性:ResourceManager的主要功能是资源的调度工作。所以它能够轻松地 管理更大规模的集群系统,适应了数据量增长对数据中心的扩展性提出的挑战。 (2)更高的集群使用效率:ResourceManager是一个单纯的资源管理器,它根据资源 44Hadoop与Spark入门 预留要求、公平性、服务等级协定(ServiceLevelAgreement,SLA)等标准,优化整个集群 的资源,使之得到很好的利用。 (3)兼容Hadoop1.0:在Hadoop1.0平台上开发的MapReduce应用程序,无须修 改,可以直接在YARN上运行。 (4)支持更多的负载类型:当数据存储到HDFS以后,用户希望能够对数据以不同 的方式进行处理。除了MapReduce应用程序(主要对数据进行批处理),YARN支持更 多的编程模型(应用类型),包括图数据处理、迭代式处理、流数据处理、交互式查询等,如 图3-15所示。一般来讲,机器学习算法需要在数据集上经过多次迭代才能获得最终的计 算结果。 图3-15Hadoop2.0支持更多的编程模型 (5)灵活性:MapReduce等计算模型可以独立于资源管理层,单独演化和改进。使 得系统各个部件的演进和配合更加具有灵活性。 ..3.6 思考题 1.简述HDFS的原理及其读写过程。 2.简述MapReduce执行引擎JobTracker与TaskTracker的功能。 3.简述MapReduce计算模型与实例。 4.简述Hadoop的应用。 5.简述Hadoop的生态系统 。 6.Hadoop1.oop2.YARN) 0的局限与Had0(的原理是什么 ? 7.Hadoop2. 0的主要优势有哪些?