从Hadoop和MapReduce谈海量数据处理

sina

从Hadoop和MapReduce谈海量数据处理_第1张图片
sina
mapreduce是一种模式,hadoop是一种框架,是一个实现了mapreduce模式的开源的分布式并行编程框架,程序员可以借助Hadoop 编写程序,将所编写的程序运行于计算机机群上,从而实现对海量数据的处理。


mapreduce模式

一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。
它是一种云计算的核心计算模式,一种分布式运算模式,也是简化的分布式编程模式。其主要思想是将自动分割要执行的问题拆解成map(映射)和reduce(化简)的方式。

从Hadoop和MapReduce谈海量数据处理_第2张图片
Paste_Image.png

在数据被分割后通过Map 函数的程序将数据映射成不同的区块,分配给计算机机群处理达到分布式运算的效果,在通过Reduce 函数的程序将结果汇整,从而输出开发者需要的结果。
MapReduce 借鉴了函数式程序设计语言的设计思想,其软件实现是指定一个Map 函数,把键值对(key/value)映射成新的键值对(key/value),形成一系列中间结果形式的key/value 对,然后把它们传给Reduce(规约)函数,把具有相同中间形式key 的value 合并在一起。Map 和Reduce 函数具有一定的关联性。函数描述如下表所示:

从Hadoop和MapReduce谈海量数据处理_第3张图片
Paste_Image.png
从Hadoop和MapReduce谈海量数据处理_第4张图片
Paste_Image.png

如上图所示,其中map阶段,当map task开始运算,并产生中间数据后并非直接而简单的写入磁盘,它首先利用内存buffer来对已经产生的buffer进行缓存,并在内存buffer中进行一些预排序来优化整个map的性能。而上图右边的reduce阶段则经历了三个阶段,分别Copy->Sort->reduce。我们能明显的看出,其中的Sort是采用的归并排序,即merge sort。
使用MapReduce, 用户首先创建一个Map 函数处理一个基于key/value pair 的数据集合,输出中间的基于key/value pair 的数据集合;然后再创建一个Reduce 函数用来合并所有的具有相同中间key 值的中间value 值。
采用MapReduce 架构可以使那些没有并行计算和分布式处理系统开发经验的程序员有效利用分布式系统的丰富资源。

例子:
每个主机的检索词向量:检索词向量用一个(词,频率)列表来概述出现在文档或文档集中的最重要的一些词。Map函数为每一个输入文档输出(主机名,检索词向量),其中主机名来自文档的URL。Reduce 函数接收给定主机的所有文档的检索词向量,并把这些检索词向量加在一起,丢弃掉低频的检索词,输出一个最终的(主机名,检索词向量)。
倒排索引:Map 函数分析每个文档输出一个(词,文档号)的列表,Reduce 函数的输入是一个给定词的所有(词,文档号),排序所有的文档号,输出(词,list(文档号))。所有的输出集合形成一个简单的倒排索引,它以一种简单的算法跟踪词在文档中的位置。
分布式排序:Map 函数从每个记录提取key,输出(key,record)。Reduce 函数不改变任何的值。这个运算依赖分区机制和排序属性。

从Hadoop和MapReduce谈海量数据处理_第5张图片
Paste_Image.png

上图展示了我们的MapReduce 实现中操作的全部流程。
1.用户程序首先调用的MapReduce 库将输入文件分成M 个数据片度,每个数据片段的大小一般从16MB 到64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在机群中创建大量的程序副本。
2.这些程序副本中的有一个特殊的程序--master。副本中其它的程序都是worker 程序,由master 分配任务。有M个Map 任务和R 个Reduce 任务将被分配,master 将一个Map 任务或Reduce 任务分配给一个空闲的worker。
3.被分配了map 任务的worker 程序读取相关的输入数据片段,从输入的数据片段中解析出key/value pair,然后把key/value pair 传递给用户自定义的Map 函数,由Map 函数生成并输出的中间key/value pair,并缓存在内存中。
4.缓存中的key/value pair 通过分区函数分成R 个区域,之后周期性的写入到本地磁盘上。缓存的key/value pair 在本地磁盘上的存储位置将被回传给master,由master 负责把这些存储位置再传送给Reduce worker。
5.当Reduce worker 程序接收到master 程序发来的数据存储位置信息后,使用RPC 从Map worker 所在主机的磁盘上读取这些缓存数据。当Reduce worker 读取了所有的中间数据后,通过对key 进行排序后使得具有相同key 值的数据聚合在一起。由于许多不同的key 值会映射到相同的Reduce 任务上,因此必须进行排序。如果中间数据太大无法在内存中完成排序,那么就要在外部进行排序。
6.Reduce worker 程序遍历排序后的中间数据,对于每一个唯一的中间key 值,Reduce worker 程序将这个key 值和它相关的中间value 值的集合传递给用户自定义的Reduce 函数。Reduce 函数的输出被追加到所属分区的输出文件。
7.当所有的Map 和Reduce 任务都完成之后,master 唤醒用户程序。在这个时候,在用户程序里的对MapReduce调用才返回。

Master数据结构
Master 持有一些数据结构,它存储每一个Map 和Reduce 任务的状态(空闲、工作中或完成),以及Worker 机器(非空闲任务的机器)的标识。
Master 就像一个数据管道,中间文件存储区域的位置信息通过这个管道从Map 传递到Reduce。因此,对于每个已经完成的Map 任务,master 存储了Map 任务产生的R 个中间文件存储区域的大小和位置。当Map 任务完成时,Master接收到位置和大小的更新信息,这些信息被逐步递增的推送给那些正在工作的Reduce 任务。

容错
因为MapReduce 库的设计初衷是使用由成百上千的机器组成的集群来处理超大规模的数据,所以,这个库必须要能很好的处理机器故障。
worker 故障
master 周期性的ping 每个worker。如果在一个约定的时间范围内没有收到worker 返回的信息,master 将把这个worker 标记为失效。所有由这个失效的worker 完成的Map 任务被重设为初始的空闲状态,之后这些任务就可以被安排给其他的worker。同样的,worker 失效时正在运行的Map 或Reduce 任务也将被重新置为空闲状态,等待重新调度。
当worker 故障时,由于已经完成的Map 任务的输出存储在这台机器上,Map 任务的输出已不可访问了,因此必须重新执行。而已经完成的Reduce 任务的输出存储在全局文件系统上,因此不需要再次执行。当一个Map 任务首先被worker A 执行,之后由于worker A 失效了又被调度到worker B 执行,这个“重新执行”的动作会被通知给所有执行Reduce 任务的worker。任何还没有从worker A 读取数据的Reduce 任务将从worker B 读取数据。
master 失败
如果master 失效,就中止MapReduce 运算。客户可以检查到这个状态,并且可以根据需要重新执行MapReduce 操作。
在失效方面的处理机制
当一个Map 任务完成时,worker 发送一个包含R 个临时文件名的完成消息给master。如果master 从一个已经完成的Map 任务再次接收到到一个完成消息,master 将忽略这个消息;否则,master 将这R 个文件的名字记录在数据结构里。
当Reduce 任务完成时,Reduce worker 进程以原子的方式把临时文件重命名为最终的输出文件。如果同一个Reduce任务在多台机器上执行,针对同一个最终的输出文件将有多个重命名操作执行。我们依赖底层文件系统提供的重命名操作的原子性来保证最终的文件系统状态仅仅包含一个Reduce 任务产生的数据。


hadoop框架

hadoop提供一个分布式文件系统(HDFS)及分布式数据库(HBase)用来将数据存储或部署到各个计算节点上。所以,可以简单地将hadoop理解为hadoop = HDFS(文件系统,数据存储技术相关)+HBase(数据库)+MapReduce(数据处理)。框架图如下:

从Hadoop和MapReduce谈海量数据处理_第6张图片
Paste_Image.png

借助Hadoop 框架及云计算核心技术MapReduce 来实现数据的计算和存储,并且将HDFS 分布式文件系统和HBase 分布式数据库很好的融入到云计算框架中,从而实现云计算的分布式、并行计算和存储,并且得以实现很好的处理大规模数据的能力。

hadoop的组成部分
我们已经知道,Hadoop是Google的MapReduce一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。Hadoop主要由HDFS、MapReduce和HBase等组成。具体的hadoop的组成如下图:

从Hadoop和MapReduce谈海量数据处理_第7张图片
Paste_Image.png

由上图,得知:
1、HDFS是GFS的开源实现,主要应用场景是作为并行计算环境(mapreduce)的基础组件,同时也是BigTable(HBase、HyperTable)的底层分布式文件系统。HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanode组成。Namenode是一个中心服务器,负责管理文件系统的namespace和客户端对文件的访问。Datanode在集群中一般是一个节点一个,负责管理节点上它们附带的存储。在内部,一个文件其实分成一个或多个block,这些block存储在Datanode集合里。如下(HDFS体系结构图):

从Hadoop和MapReduce谈海量数据处理_第8张图片
Paste_Image.png

2、hadoop mapreduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上TB级别的数据集。
一个MapReduce作业(job)通常会把输入的数据集切分为若干独立的数据块,由 Map任务(task)以完全并行的方式处理它们。框架会对Map的输出先进行排序,然后把结果输入给Reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。如下图所示(Hadoop MapReduce处理流程图):

从Hadoop和MapReduce谈海量数据处理_第9张图片
Paste_Image.png

3、Hive是基于Hadoop的一个数据仓库工具,处理能力强而且成本低廉。
主要特点:
存储方式是将结构化的数据文件映射为一张数据库表。提供类SQL语言,实现完整的SQL查询功能。可以将SQL语句转换为MapReduce任务运行,十分适合数据仓库的统计分析。
不足之处:
采用行存储的方式(SequenceFile)来存储和读取数据。效率低:当要读取数据表某一列数据时需要先取出所有数据然后再提取出某一列的数据,效率很低。同时,它还占用较多的磁盘空间。
4、HBase
HBase是一个分布式的、面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。HBase使用和 BigTable非常相同的数据模型。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列,一个或多个列组成一个ColumnFamily,一个Family下的列位于一个HFile中,易于缓存数据。表是疏松的存储的,因此用户可以给行定义各种不同的列。在HBase中数据按主键排序,同时表按主键划分为多个HRegion,如下图所示(HBase数据表结构图):

从Hadoop和MapReduce谈海量数据处理_第10张图片
Paste_Image.png

总的hadoop内部结构图:

从Hadoop和MapReduce谈海量数据处理_第11张图片
Paste_Image.png

你可能感兴趣的:(从Hadoop和MapReduce谈海量数据处理)