分布式计算Hadoop近期学习总结

GMCWXH 2013-01-14

Hadoop学习总结

Hadoop是什么东西?什么用?

(一)Hadoop是什么?

一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算。Hadoop框架中最核心设计就是:HDFS和MapReduce,HDFS实现存储,而MapReduce实现原理分析处理,这两部分是hadoop的核心。数据在Hadoop中处理的流程可以简单的按照下图来理解:数据通过Haddop的集群处理后得到结果,它是一个高性能处理海量数据集的工具。

(二)Hadoop为什么如此受欢迎,有什么用?

Hadoop开源系统实现了MapReduce编程模型,采用了分布式存储方式提高了读写速度,并扩大了存储容量。采用MapReduce来整合分布式文件系统上的数据,可保证分析和处理数据的高效。与此同时,Hadoop还采用存储冗余数据的方式保证了数据的安全性,Hadoop中的HDFS的高容错性,以及它是基于Java语言开发的,这使得Hadoop可以部署在低廉的计算机集群中,同时不限于某个操作系统。Hadoop中的HDFS的数据管理能力,MapReduce处理任务时的高效率,以及它的开源特性,使其在同类的分布式系统中大放异彩。MapReduce编程模型之所以受到欢迎和迅速得到应用,在技术方面有三方面的原因:

1.MapReduc所采用的是无共享大规模集群系统,集群系统具有良好的性价比和可伸缩性。

2.MapReduce编程模型简单,易于理解,易于使用。

3.虽然基本的MapReduce模型只提供一个过程性的编程接口,但是在海量的数据环境,需要保证可伸缩性的前提下,通过使用适合的查询优化和索引技术,MapReduce仍然能够提供相当好的数据处理性能。

Hadoop的优缺点介绍:

(一)优点:

(一)高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖;

(二)高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。

(三)高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

(四)高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。

(二)缺点:

(一)不适合低延迟数据访问。

(二)无法高效存储大量小文件。

(三)不支持多用户写入及任意修改文件。

Hadoop集群的组成介绍:

(一)Hadoop家族由以下几个子项目组成

整个Hadoop家族由以下几个子项目组成,现在Hadoop已经发展成为包含多个子项目的集合。虽然其核心内容是MapReduce和Hadoop分布式文件系统(HDFS),但是在Hadoop下的Common、Avro、Chukwa、Hive、HBase等子项目也是不可或缺的。他们在提供了互补性服务或在核心层上提供了更高层的服务。

1).Core/Common

从Hadoop0.20版本开始,HadoopCore项目便更名为Common。它是Hadoop体系最底层的一个模块,为Hadoop各子项目提供各种工具,如:FileSystem、RPC和串行化库,他们为在廉价的硬件上搭建云计算环境提供基本的服务,并且为运行在该平台上的软件开发提供了所需的API,配置文件和日志操作等。

2).Avro

Avro是用于数据序列化的系统。它提供了丰富的数据结构类型、快速可压缩

的二进制数据格式、存储持久性数据的文件集、远程调用RPC的功能和简单的动态语言集成功能。其中,代码生成器既不需要读写文件数据,也不需要使用或实现RPC协议,它只是一个可选的对静态类型语言的实现。

Avro系统依赖于模式(Schema),Avro数据的读和写是在模式之下完成的。这样就可以

减少写入数据的开销,提高序列化的速度并缩减其大小。同时,也可以方便动态脚本语言的使用,因为数据连同其模式都是自描述的。

在RPC中,Avro系统的客户端和服务端通过握手协议进行模式的交换。因此当客户端

和服务端拥有彼此全部的模式时,不同模式下的相同命名字段、丢失字段和附加字段等信息的一致性问题就得到了很好的解决。

3).Chukwa

Chukwa:Chukwa是开源的数据收集系统,用于监控和分析大型分布式系统的数据。

Chukwa是在Hadoop的HDFS和MapReduce框架之上搭建的,它同时继承了Hadoop的可扩展性和健壮性。Chukwa通过HDFS来存储数据,并依赖于MapReduce任务处理数据。

Chukwa中也附带了灵活且强大的工具,用于显示、监视和分析数据结果,以便更好地利用所收集的数据。

4).HBase

基于HadoopDistributedFileSystem,是一个开源的,基于列存储模型的分布式数据库。

5).HDFS

是一个分布式文件系统。由于HDFS具有高容错性(fault-tolerant)的特点,所以可以设计部署在低廉(low-cost)的硬件上。它可以通过提供高吞吐率(highthroughput)来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了可移植操作系统接口(POSIX,PortableOperatingSystemInterface)的要求,这样就可以实现以流的形式访问文件系统中的数据。HDFS原本是开源的Apache项目Nutch的基础结构,最后它成为了Hadoop的基础架构之一。

以下是HDFS的设计目标:

检测和快速恢复硬件故障。硬件故障是常见的问题,整个HDFS系统由数百台或数千

台存储着数据文件的服务器组成,而如此多的服务器意味着高故障率,因此,故障的

检测和自动快速恢复是HDFS的一个核心目标。

流式的数据访问。HDFS使应用程序能流式地访问它们的数据集。HDFS被设计成适

合进行批量处理,而不是用户交互式的处理。所以它重视数据吞吐量,而不是数据访

问的反应速度。

简化一致性模型。大部分的HDFS程序操作文件时需要一次写入,多次读取。一个文

件一旦经过创建、写入、关闭之后就不需要修改了,从而简化了数据一致性问题和高

吞吐量的数据访问问题。

通信协议。所有的通信协议都在TCP/IP协议之上。一个客户端和明确配置了端口的

名字节点(NameNode)建立连接之后,它和名称节点(NameNode)的协议便是客户

端协议(ClientProtocal)。数据节点(DataNode)和名字节点(NameNode)之间则

用数据节点协议(DataNodeProtocal)。

6).Hive

Hive最早是由Facebook设计的,是一个建立在Hadoop基础之上的数据仓库,

它提供了一些用于数据整理、特殊查询和分析存储在Hadoop文件中的数据集的工具。Hive

提供的是一种结构化数据的机制,它支持类似于传统RDBMS中的SQL语言来帮助那些熟悉SQL的用户查询Hadoop中的数据,该查询语言称为HiveQL。与此同时,那些传统的MapReduce编程人员也可以在Mapper或Reducer中通过HiveQL查询数据。Hive编译器会把HiveQL编译成一组MapReduce任务,从而方便MapReduce编程人员进行Hadoop应用的开发。

7).MapReduce

实现了MapReduce编程框架

8).Pig

Pig是一个对大型数据集进行分析和评估的平台。Pig最突出的优势是它的

结构能够经受住高度并行化的检验,这个特性让它能够处理大型的数据集。目前,Pig

的底层由一个编译器组成,它在运行的时候会产生一些MapReduce程序序列,Pig的语

言层由一种叫做PigLatin的正文型语言组成。

9).ZooKeeper

Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

(二)HDFS的体系结构

我们首先介绍HDFS的体系结构,HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据。从内部来看,文件被分成若干个数据块,而且这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。

NameNode和DataNode都被设计成可以在普通商用计算机上运行。这些计算机通常运行的是GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署NameNode和DataNode。一个典型的部署场景是集群中的一台机器运行一个NameNode实例,其他机器分别运行一个DataNode实例。当然,并不排除一台机器运行多个DataNode实例的情况。集群中单一的NameNode的设计则大大简化了系统的架构。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode。

Hadoop组成主要由NameNode,DataNode,SecondaryNameNode,JobTracker,TaskTracker组成。

(一)NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点,同时保存了文件系统运行的状态信息。(Block(块):一个文件分块,默认64M)

(二)DataNode中存储的是被拆分的blocks。

(三)SecondaryNameNode帮助NameNode收集文件系统运行的状态信息。

(四)JobTracker当有任务提交到Hadoop集群的时候负责Job的运行,负责调度多个TaskTracker。

(五)TaskTracker负责某一个map或者reduce任务。

(三)MapReduce的体系结构

接下来介绍MapReduce的体系结构,MapReduce是一种并行编程模式,这种模式使得

软件开发者可以轻松地编写出分布式并行程序。在Hadoop的体系结构中,MapReduce是一

个简单易用的软件框架,基于它可以将任务分发到由上千台商用机器组成的集群上,并以一

种高容错的方式并行处理大量的数据集,实现Hadoop的并行任务处理功能。MapReduce框

架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点上的TaskTracker共

同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主

节点监控它们的执行情况,并且重新执行之前失败的任务;从节点仅负责由主节点指派的任

务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等

分发给从节点,同时调度任务并监控TaskTracker的执行。

从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构

的核心。HDFS在集群上实现了分布式文件系统,MapReduce在集群上实现了分布式计算和

任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce

在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完

成了Hadoop分布式集群的主要任务。

(四)MapReduce并行运行原理

MapReduce计算模型非常适合在大量计算机组成的大规模集群上并行运行。每一个map任务和每一个reduce任务均可以同时运行于一个单独的计算节点上,可想而知,其运算效率是很高的,那么这样的并行计算是如何做到的呢?下面将简单介绍一下其原理。

1.数据分布存储

Hadoop分布式文件系统(HDFS)由一个名称节点(NameNode)和N个数据节点(DataNode)组成,每个节点均是一台普通的计算机。在使用方式上HDFS与我们熟悉的单机文件系统非常类似,它可以创建目录,创建、复制和删除文件,以及查看文件的内容等。但HDFS底层把文件切割成了Block,然后这些Block分散地存储于不同的DataNode上,每个Block还可以复制数份数据存储于不同的DataNode上,达到容错容灾的目的。NameNode则是整个HDFS的核心,它通过维护一些数据结构来记录每一个文件被切割成了多少个Block、这些Block可以从哪些DataNode中获得,以及各个DataNode的状态等重要信息。

2.分布式并行计算

Hadoop中有一个作为主控的JobTracker,用于调度和管理其他的TaskTracker,JobTracker可以运行于集群中的任意一台计算机上。TaskTracker则负责执行任务,它必须运行于DataNode上,也就是说DataNode既是数据存储节点,也是计算节点。JobTracker将map任务和reduce任务分发给空闲的TaskTracker,让这些任务并行运行,并负责监控任务的运行情况。如果某一个TaskTracker出了故障,JobTracker会将其负责的任务转交给另一个空闲的TaskTracker重新运行。

3.本地计算

数据存储在哪一台计算机上,就由哪台计算机进行这部分数据的计算,这样可以减少数

据在网络上的传输,降低对网络带宽的需求。在Hadoop这类基于集群的分布式并行系统中,计算节点可以很方便地扩充,它所能够提供的计算能力近乎无限,但是由于数据需要在不同的计算机之间流动,故网络带宽变成了瓶颈,“本地计算”是一种最有效的节约网络带宽的手段,业界把这形容为“移动计算比移动数据更经济”。

4.任务粒度

把原始大数据集切割成小数据集时,通常让小数据集小于或等于HDFS中一个Block的

大小(默认是64MB),这样能够保证一个小数据集是位于一台计算机上的,便于本地计算。有M个小数据集待处理,就启动M个map任务,注意这M个map任务分布于N台计算机上,它们会并行运行,reduce任务的数量R则可由用户指定。

5.数据分割(Partition)

把map任务输出的中间结果按key的范围划分成R份(R是预先定义的reduce任务的

个数),划分时通常使用hash函数(如:hash(key)modR),这样可以保证某一范围内的key一定是由一个reduce任务来处理的,可以简化Reduce的过程。

6.数据合并(Combine)

在数据分割之前,还可以先对中间结果进行数据合并(Combine),即将中间结果中有相

同key的<key,value>对合并成一对。Combine的过程与reduce的过程类似,很多情况下可以直接使用reduce函数,但Combine是作为map任务的一部分,在执行完map函数后紧接着执行的。Combine能够减少中间结果中<key,value>对的数目,从而降低网络流量。

7.Reduce

Map任务的中间结果在做完Combine和Partition之后,以文件形式存于本地磁盘

上。中间结果文件的位置会通知主控JobTracker,JobTracker再通知reduce任务到哪一个DataNode上去取中间结果。注意,所有的map任务产生的中间结果均按其key值用同一个hash函数划分成了R份,R个reduce任务各自负责一段key区间。每个reduce需要向许多个map任务节点取得落在其负责的key区间内的中间结果,然后执行reduce函数,形成一个最终的结果文件。

8.任务管道

有R个reduce任务,就会有R个最终结果,很多情况下这R个最终结果并不需要合并成一个最终结果,因为这R个最终结果又可以作为另一个计算任务的输入,开始另一个并行计算任务,这也就形成了任务管道。

(五)HDFS的数据管理

HDFS是分布式计算的存储基石,Hadoop分布式文件系统和其他分布式文件系统有很多类似的特质:

对于整个集群有单一的命名空间;

具有数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前是无法看到文件存在的;

文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且会根据配置由复制文件块来保证数据的安全性。

HDFS通过三个重要的角色来进行文件系统的管理:

NameNode、DataNode和Client。NameNode可以看做是分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Metadata存储在内存中,这些信息主要包括文件信息、每一个文件对应的文件块的信息和每一个文件块在DataNode中的信息等。DataNode是文件存储的基本单元,它将文件块(Block)存储在本地文件系统中,保存了所有Block的Metadata,同时周期性地将所有存在的Block信息发送给NameNode。Client就是需要获取分布式文件系统文件的应用程序。以下通过三个具体的操作来说明HDFS对数据的管理。

(1)文件写入

1)Client向NameNode发起文件写入的请求。

2)NameNode根据文件大小和文件块的配置情况,返回给Client它所管理的DataNode

的信息。

3)Client将文件划分为多个Block,根据DataNode的地址信息,按顺序将其写入每一

个DataNode块中。

(2)文件读取

1)Client向NameNode发起读取文件的请求。

2)NameNode返回文件存储的DataNode信息。

3)Client读取文件信息。

(3)文件块(Block)复制

1)NameNode发现部分文件的Block不符合最小复制数这一要求或部分DataNode失效。

2)通知DataNode相互复制Block。

3)DataNode开始直接相互复制。

HDFS作为分布式文件系统在数据管理方面还有几个值得借鉴的功能:

文件块(Block)的放置:一个Block会有三份备份,一份放在NameNode指定的

DataNode上,另一份放在与指定的DataNode不在同一台机器上的DataNode上,最

后一份放在与指定的DataNode在同一Rack上的DataNode上。备份的目的是为了数

据安全,采用这种配置方式主要是考虑同一Rack失败的情况,以及不同Rack之间的

数据拷贝会带来的性能问题。

心跳检测:用心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式

来保证数据的安全性。

数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和平衡

DataNode数据交互压力等情况):使用Hadoop时可以用HDFS的balancer命令配置

Threshold来平衡每一个DataNode的磁盘利用率。假设设置了Threshold为10%,那

么执行balancer命令的时候,首先会统计所有DataNode的磁盘利用率的平均值,然

后判断如果某一个DataNode的磁盘利用率超过这个均值,那么将会把这个DataNode

的block转移到磁盘利用率低的DataNode上,这对于新节点的加入来说十分有用。

数据校验:采用CRC32做数据校验。在写入文件Block的时候,除了写入数据外还

会写入校验信息,在读取的时候则需要校验后再读入。

单个NameNode:如果失败,任务处理信息将会记录在本地文件系统和远端的文件系

统中。

数据管道性的写入:当客户端要写入文件到DataNode上时,客户端首先会读取一个

Block,然后写到第一个DataNode上,接着由第一个DataNode将其传递到备份的

DataNode上,直到所有需要写入这个Block的DataNode都成功写入后,客户端才会

开始写下一个Block。

安全模式:分布式文件系统启动的时候会有安全模式(系统运行期间也可以通过命令

进入安全模式),当分布式文件系统处于安全模式时,文件系统中的内容不允许修改

也不允许删除,直到安全模式结束。安全模式主要是为了在系统启动的时候检查各

个DataNode上的数据块的有效性,同时根据策略进行必要的复制或删除部分数据块。

在实际操作过程中,若在系统启动时修改和删除文件会出现安全模式不允许修改的错

误提示,需要等待片刻即可恢复。

相关推荐