云计算与大数据技术人民邮电出版社王鹏黄焱安俊秀张逸琴编著目录第1章云计算与大数据基础第2章云计算与大数据的相关技术第3章虚拟化技术第4章集群系统基础第5章MPI—面向计算第6章Hadoop—分布式大数据系统第7章HPCC—面向数据的高性能计算集群系统第8章Storm—基于拓扑的流数据实时计算系统第9章服务器与数据中心第10章云计算大数据仿真技术CONTENTS第6章Hadoop—分布式大数据系统第6章Hadoop—分布式大数据系统《云计算与大数据技术》2019/8/1并行计算实验室—分布式大数据系统6.1Hadoop概述6.2HDFS—6.2.1HDFS文件系统的原型GFS—6.2.2HDFS文件的基本结构—6.2.3HDFS的存储过程6.3MapReduce编程框架—6.3.1MapReduce的发展历史—6.3.2MapReduce的基本工作过程—6.3.3LISP中的MapReduce—6.3.4MapReduce的特点6.4实现Map/Reduce的C语言实例6.5建立Hadoop开发环境—6.5.1相关准备工作—6.5.2JDK的安装配置—6.5.3下载、解压Hadoop,配置Hadoop环境变量—6.5.4修改Hadoop配置文件—6.5.5将配置好的Hadoop文件复制到其他节点—6.5.6启动、停止Hadoop—6.5.7在Hadoop系统上运行测试程序WordCount2019/8/1并行计算实验室Hadoop是由Apache软件基金会研发的一种开源、高可靠、伸缩性强的分布式计算系统,主要用于对大于1TB的海量数据的处理。Hadoop采用Java语言开发,是对Google的MapReduce核心技术的开源实现。目前Hadoop的核心模块包括系统HDFS(HadoopDistributedFileSystem,Hadoop分布式文件系统)和分布式计算框架MapReduce,这一结构实现了计算和存储的高度耦合,十分有利于面向数据的系统架构,因此已成为大数据技术领域的事实标准。2019/8/1并行计算实验室Hadoop设计时有以下的几点假设:—服务器失效是正常的;—存储和处理的数据是海量的;—文件不会被频繁写入和修改;—机柜内的数据传输速度大于机柜间的数据传输速度;—海量数据的情况下移动计算比移动数据更高效。2019/8/1并行计算实验室Hadoop是Apache开源组织的分布式计算系统,其分为第一代Hadoop和第二代Hadoop。第一代Hadoop包含0.20.x、0.21.x、0.22.x三个版本,0.20.x最后演化成了1.0.x版本,第二代Hadoop包含0.23.x和2.x两个版本,2.x本版比0.23.x版本增加了NameNodeHA和Wire-compatibility两个特性,版本发展如图6.1所示。图6.1Hadoop本版发展路线2019/8/1并行计算实验室Hadoop与MPI在数据处理上的差异主要体现在数据存储与数据处理在系统中位置不同,MPI是计算与存储分离,Hadoop是计算向存储迁移,如图6.2所示。存储节点MPI计算存储分离计算节点计算节点计算节点Hadoop计算向存储迁移计算存储计算存储计算存储HDFS文件系统图6.2Hadoop与MPI在数据处理上的差异2019/8/1并行计算实验室在MPI中数据存储的节点和数据处理的节点往往是不同的,一般在每次计算开始时MPI需要从数据存储节点读取需要处理的数据分配给各个计算节点对数据进行处理,因此MPI中数据存储和数据处理是分离的。对于计算密集型的应用MPI能表现出良好的性能,但对于处理TB级数据的数据密集型应用由于网络数据传输速度很慢,MPI的性能会大大降低,甚至会到不可忍受的地步,所以对于构建在MPI上的并行计算系统网络通讯速度一直是一个重要的性能指标,用“计算换通信”也是MPI并行程序设计中的基本原则。2019/8/1并行计算实验室在Hadoop中由于有HDFS文件系统的支持,数据是分布式存储在各个节点的,计算时各节点读取存储在自己节点的数据进行处理,从而避免了大量数据在网络上的传递,实现“计算向存储的迁移”。2019/8/1并行计算实验室Hadoop系统实现对大数据的自动并行处理,是一种数据并行方法,这种方法实现自动并行处理时需要对数据进行划分,而对数据的划分在Hadoop系统中从数据的存储就开始了,因此文件系统是Hadoop系统的重要组成部分,也是Hadoop实现自动并行框架的基础。Hadoop的文件系统称为HDFS(HadoopDistributedFileSystem)。2019/8/1并行计算实验室Hadoop中的HDFS原型来自Google文件系统(GoogleFileSystem,GFS),为了满足Google迅速增长的数据处理要求,Google设计并实现了GFS。Google文件系统是一个可扩展的分布式文件系统,用于对大量数据进行访问的大型、分布式应用。它运行于廉价的普通硬件上,但可以提供容错功能。它可以给大量的用户提供总体性能较高的服务,也可以提供容错功能。我们认为GFS是一种面向不可信服务器节点而设计的文件系统。谷歌“三宝”是“Google文件系统”、“BigTable大表”、“MapReduce算法”,有了自己的文件系统,谷歌就可以有效地组织庞大的数据、服务器和存储,并用它们工作。作为谷歌“三宝”的其中之一,GFS的技术优势不言而喻。2019/8/1并行计算实验室GFS为分布式结构,它是一个高度容错网络文件系统,主要由一个Master(主)和众多chunkserver(大块设备)构成的,体系结构如图6.3所示。图6.3GFS的体系结构2019/8/1并行计算实验室下面简单描述一下GFS的工作过程。(1)客户端使用固定大小的块将应用程序指定的文件名和字节偏移转换成文件的一个块索引,向Master发送包含文件名和块索引的请求。(2)Master收到客户端发来的请求,Master向块服务器发出指示,同时时刻监控众多chunkserver的状态。chunkserver缓存Master从客户端收到的文件名和块索引等信息。2019/8/1并行计算实验室(3)Master通过和chunkserver的交互,向客户端发送chunk-handle和副本位置。其中文件被分成若干个块,而每个块都是由一个不变的、全局惟一的64位的chunk-handle标识。Handle是由Master在块创建时分配的。而出于安全性考虑,每一个文件块都要被复制到多个chunkserver上,一般默认3个副本。(4)客户端向其中的一个副本发出请求,请求指定了chunkhandle(chunkserver以chunkhandle标识chunk)和块内的一个字节区间。(5)客户端从chunkserver获得块数据,任务完成。2019/8/1并行计算实验室通常Client可以在一个请求中询问多个chunk的地址,而Master也可以很快回应这些请求。GFS是可以被多个用户同时访问的,一般情况下,Application和chunkserver是可以在同一台机子上的,主要的数据流量是通过Application和chunkserver之间,数据访问的本地性极大地减少了Application与Master之间的交互访问,减少了Master的负荷量,提高了文件系统的性能。2019/8/1并行计算实验室客户端从来不会从Master读和写文件数据。客户端只是询问Master它应该和哪个chunkserver联系。Client在一段限定的时间内将这些信息缓存,在后续的操作中客户端直接和chunkserver交互。由于Master对于读和写的操作极少,所以极大地减小了Master的工作负荷,真正提高了Master的利用性能。Master保存着三类元数据(metadata):文件名和块的名字空间、从文件到块的映射、副本位置。所有的metadata都放在内存中。操作日志的引入可以更简单、更可靠地更新Master的信息。2019/8/1并行计算实验室为GFS的控制和神经系统,副本为Master的备份,Chunk主要用来和用户交换数据。网络中的主机瘫痪,不会对整个系统造成大的影响,替换上去的主机会自动重建数据。即使Master瘫痪,也会有Shadow作为替补,并且Shadow在一定时候也会充当Master来提供控制和数据交换。Google每天有大量的硬盘损坏,但是由于有GFS,这些硬盘的损坏是允许的。有人形象地比喻:分布式的文件系统被分块为很多细胞单元,一旦细胞损坏,神经系统(Master)会迅速发现并有相应的冗余措施来使系统正常运行,这些细胞可以看作很多GFS主机。这一工作方式就是人类大脑的工作方式。2019/8/1并行计算实验室当然,作为Google的技术基石,GFS可以给大量的用户提供总体性能较高的服务,具有以下优势:(1)Google采用的存储方法是大量、分散的普通廉价服务器的存储方式,极大降低了成本。(2)对大文件数据快速存取,这个毫无疑问是可以达到的。(3)容易扩展,它是成本很低的普通电脑,支持动态插入节点;(4)容错能力强,它的数据同时会在多个chunkserver上进行备份,具有相当强的容错性;(5)高效访问,它是通过Bigtable来实现的,它是GoogleFileSystem上层的结构。GFS在实现分布式文件系统的做法上面很多都是简单的,但是确实非常高效。(6)GFS相对于HDFS稳定性是无庸置疑的,并在Google系统中得到了采用且稳定的运行。2019/8/1并行计算实验室HDFS是一种典型的主从式的分布式文件系统,该文件系统完全是仿照Google的GFS文件系统而设计的,HDFS的架构如图6.4所示。图6.4HDFS的架构2019/8/1并行计算实验室HDFS由一个名叫Namenode的主节点和多个名叫Datanode的子节点组成。Namenode存储着文件系统的元数据,这些元数据包括文件系统的名字空间等,向用户映射文件系统,并负责管理文件的存储等服务,但实际的数据并不存放在Namenode。Namenode的作用就像是文件系统的总指挥,并向访问文件系统的客户机提供文件系统的映射,这种做法并不是Google或Hadoop的创新,这和传统并行计算系统中的单一系统映像(SingleSystemImage)的做法相同。HDFS中的Datanode用于实际对数据的存放,对Datanode上数据的访问并不通过Namemo