`
sole
  • 浏览: 141832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我们为什么要关注MapReduce?

阅读更多

1.什么是MapReduce?

       MapReduce 是由Google公司的Jeffrey Dean 和 Sanjay Ghemawat 开发的一个针对大规模群组中 的海量数据处理的分布式编程模型。MapReduce实现了两个功能。Map把一个函数应用于集合中的所有成员,然后返回一个基于这个处理的结果集。而 Reduce是把从两个或更多个Map中,通过多个线程,进程或者独立系统并行执行处理的结果集进行分类和归纳。Map() 和 Reduce() 两个 函数可能会并行运行,即使不是在同一的系统的同一时刻。

        Google 用MapReduce来索引每个抓取过来的Web页面。它取代了2004开始试探的最初索引算法,它已经证明在处理大量和 非结构化数据集时更有效。用不同程序设计语言实现了多个MapReduce,包括 Java, C++, Python, Perl, Ruby和C,  其它语言。在某些范例里,如Lisp或者Python, Map() 和Reduce()已经集成到语言自身的结构里面。通常,这些函数可能会如下定义:

List2 map(Functor1, List1);
Object reduce(Functor2, List2);
 

Map()函数把大数据集进行分解操作到两个或更多的小“桶”。而一个“桶”则是包含松散定义的逻辑记录或者文本行的集合。每个线程,处理器或者系统在独 立的“桶”上执行Map()函数,去计算基于每个逻辑记录处理的一系列中间值。合并的结果值就会如同是单个Map()函数在单个“桶”上完全一致。Map ()函数的通常形式是:

 map(function, list) {
  foreach element in list {
    v = function(element)
    intermediateResult.add(v)
  }
} // map
 

Reduce()函数把从内存,磁盘或者网络介质提取过来的一个或多个中间结果列表,对列表中的每个元素逐一执行一个函数。完成操作的最终结果是通过对所有运行reduce()操作的处理结果进行分类和解释。Reduce()函数的通常形式是:

 reduce(function, list, init) {
  result = init
  foreach value in list {
    result = function(result, value)
  }
  outputResult.add(result)
}
MapReduce的实现把业务逻辑从多个处理逻辑中分离出来了,map()和reduce()函数跨越多个系统,通过共享池和部分RPC的形式来达到彼 此之间的同步和通信。这里的业务逻辑是由用户自定义的函数子实现,并且这些函数子只能用在逻辑记录处理的工作上,而不用关心多个处理操作的问题。这样一旦 MapReduce框架就位,就能通过大量的处理器快速的转变为应用系统的并行处理。因为开发人员可以把精力花在写函数子上面了。MapReduce簇可 以通过替换函数子和提供新的数据源来重新使用,而无需每次都对整个应用进行编译,测试和部署。

2.实现MapReduce

       MapReduce()的目的是为了大型集群的系统能在大数据集上进行并行工作。 

图1显示了一个运行在一个主系统上的主程序,协调其它实例进行map()或者reduce()操作,然后从每个reduce操作中收集结果。


【图 1】

主应用程序负责把基础的数据集分解到“桶”中。桶的最佳大小依赖于应用,结点的数量和可用的I/O带宽。这些“桶”通常存储在磁盘,但有必要也可能分散到主存中,这依赖于具体的应用。“桶”将作为map()函数的输入。

       主应用程序也负责调度和分散几个MapReduce的核心备份,除了控制者给空闲的处理器或线程分配了调整map()和reduce()任 务之外,它们是完全相致的。控制者会持续跟踪每个map()和reduce()任务的状态,并且可以作为map()和reduce()任务之间路由中间结 果的管道。每个map() 任务处理器完全指派给“桶”,然后产生一个存到共享存储区域的中间结果集。共享存储可以设计成分布缓存,磁盘或其它设备等形 式。当一个新的中间结果写入共享存储区域后,任务就向控制者发出通知,并提供指向其共享存储位置的句柄。

       当新的中间结果可用时,控制者分配reduce()任务。这个任务通过应用独立的中间键值来实现排序,使相同的数据能聚集在一起,以提供更 快的检索。大块的结果集可以进行外部排序,reduce()任务遍历整个排序的数据,把每个唯一的键和分类的结果传递到用户的reduce() 函数子进 行处理。

      通过map()和reduce()实例终端的处理,当所有的“桶”都用完,然后全部的reduce()任务就通知控制者,以说明它们的结果已 经产生了。控制者就向主应用程序发出检索这个结果的信号。主应用程序可能就直接操作这些结果,或者重新分配到不同的MapReduce控制者和任务进行进 一步的处理,

       显示情况下MapReduce的实现可能通常分配给控制者,map()和reduce()任务分配给单独的系统。Google操作模型是基 于跨越大量的廉价硬件设备上组成的集群或者白盒子上面部署MapReduce应用。为了处理它自己的桶的需要,每个白盒子都有本地存储装置,一个合理数量 的私有内存(2到4GB RAM)和至少两个处理内核。白盒子是可互相交换的,主应用程序可能把集群中的任何机器指派为控制者,而这个机器就把map() 和reduce()任务分派给其它连接的白盒子。

 

3.基于Java的MapReduce 实现

       Google的环境是为它自己的需求定制和适应它们的操作环境。比如,为了它的MapReduce实现更好的执行这种类型的操作,使其更优 化,Google使用了专有的文件系统用来存储文件。相反,企业应用系统都是建立在Java或类似的技术上面的,它们依赖于已有的文件系统,通信协议和应 用栈。

       一个基于Java的MapReduce实现应该考虑到已存在的数据存储设备,将来部署到的结构里面支持那种协议,有哪些内部API和支持部署那种第三方产品(开源的或商业的)。图2显示了通常的架构是如何通过映射到已有的、健壮的Java开源架构来实现的。


【图 2】

这个架构采用了已有的工具,比如Terracotta和Mule,它们经常出现在很多企业系统的组织里面。已物理或虚拟系统形成存在的白盒子通过有效简单 的配置和部署,设计成MapReduce群组中的一部分。为了效率,一个很大的系统可以分解到几个虚拟机器上,如果需要可以分配更多的结点。可以根据容量 的问题和处理器的有效利用赖决定是否在群集中使用物理“白盒子”,虚拟机或者它们两者的结合。

       Terracotta 集群技术是map()和reduce()任务之间共享数据的很好选择,因为它把map()和reduce()之间的通信过程,包括共享文件或者使用RPC调用已初始处理结构都做了抽象。

从前面章节的描述知道,Map()和reduce()任务是在同一个核心应用中实现的。用来共享中间结构集的数据结构可以保持在内存的数据结构中,通过Terracotta透明的共享交换。

       由跨域集群的MapReduce产生的进程内通信问题,自从Terracotta运行时掌管着这些共享数据结构后就不存在了。不同于实现一个复杂的信号系统,所有的map()任务需要标记内存中的中间结构集,然后reduce()任务就直接提取它们。

       控制者和主应用程序都会在同时处在等待状态一段时间,即使是MapReduce集群有大量可用的并行处理能力。这两个组件之间以及当归并完 成后的reduce()任务和控制者之间,都是通过Mule的ESB传递信号的。通过这种方式,为了其它应用的处理,输出结构可以排到队列,或者像前面章 节讲的一样,为了其他MapReduced的处理,一个Mule服务对象(or UMO)可以把这些输出结果分解到“桶”中。

       通过主流的企业应用协议或者完全的原始TCP/IP Sockets,Mule支持在内存中进行同步和异步的数据传输. Mule可以用于 在同一台机器执行的应用系统,跨域不同的数据中心或者在完全不同地方且被程序员分开标识的本地终端结点互相传递输出结构集。其它基于Java的实现可以通 过Hadoop, 是一个用于运行应用程序在大型集群的廉价硬件设备上的框架, 它是基于lucene框架。Hadoop是一个开源,点对点,通用的 MapReduce实现。

 

4.结论

       不管使用什么技术,索引大量非结构化数据是一件很艰难的任务。应用传统的算法和启发式方法很难维护,因为随着时间的推移,系统的性能下降使 系统变得难以控制。RDBMS 能有效的用于索引和检索大量的结构化数据集合,但不适合用于非结构化的数据。MapReduce为并行系统的数据处理,提 供了一个简单,优雅的解决方案,优势有:

l         归并成本

l         程序员的高产出,因为用并行的代码独立实现了业务逻辑

l         比传统RDBMS技术更好的性能和更优的结果。

l         使用Java企业框架和开发着都熟悉的已有的技术和工具赖更易部署

    

    用MapReduce, Google有令人印象深刻的跟踪记录,而且每天出现的工具都能轻易的融入到这个体系中。在企业级的应用系统中,如果你 准备开始一个快速,简单的任务,例如根据IP地址分析请求的拥堵模型到你的web集群中,或者类似的东西。一个这样的练习将会很大程度上提高你对关键系统 面临的问题和挑战的认识,MapReduce则就是为这些而准备的。

 

英文原址:http://www.theserverside.com/tt/knowledgecenter-tc/knowledgecenter-tc.tss?l=MapReduce

分享到:
评论
2 楼 zoutm 2010-04-17  
文章写得深入浅出,顶
1 楼 jaybaijie 2008-11-25  
看帖留言

相关推荐

    MapReduce的实现细节

    ### MapReduce的实现细节 #### 一、MapReduce框架概述 MapReduce是一种广泛应用于大数据处理领域的分布式编程模型,最初由Google提出并在其内部系统中得到广泛应用。随着开源社区的发展,尤其是Apache Hadoop项目...

    Google MapReduce(一)

    Google MapReduce 为什么能够成功?Google 为了方便用户使用系统,提供给了用户很少的接口,去解决复杂的问题。Map 函数接口处理一个基于 key/value 的数据集合,同时也输出基于 kv 的数据集合;Reduce 函数接口用来...

    python hadoop mapreduce 相似用户|mapreduce.rar

    本文将深入探讨如何使用Python来编写Hadoop MapReduce程序,以实现微博关注者之间的相似用户分析。这个任务的关键在于理解并应用分布式计算原理,以及熟悉Python编程语言在大数据环境下的应用。 首先,Hadoop ...

    大数据实验5实验报告:MapReduce 初级编程实践

    在这个实验中,我们关注的是如何利用MapReduce来实现文件的合并与去重操作。MapReduce是一种分布式计算模型,由Google提出,由Hadoop框架进行实现。在这个实验中,我们使用了Hadoop 3.2.2版本。 实验的目标是合并两...

    MapReduce 2.0

    MapReduce的工作流程通常是从HDFS(Hadoop Distributed File System)中读取输入数据,将其分割为InputSplits,然后由Map任务处理,之后进行Shuffle和Sort过程,将中间结果排序后传递给Reduce任务,最终生成输出结果...

    基于Java实现的简易MapReduce框架.zip

    《基于Java实现的简易MapReduce框架》 在大数据处理领域,Hadoop是一个不可或缺的重要工具,它为海量数据的存储和处理提供了分布式计算框架。而MapReduce是Hadoop的核心组件之一,用于处理和生成大规模数据集。这个...

    MapReduce应用开发

    在华为提供的培训资料中,我们得到了关于MapReduce应用开发的详细说明,包括它的定义、应用场景、开发过程以及一个典型程序——WordCount的实现。 首先,MapReduce定义上可以被理解为三层含义的集合。它是一个基于...

    MapReduce.docx

    通过WordCount案例,我们可以直观地理解MapReduce的工作流程。在这个例子中,Map阶段将文本文件中的每一行视为一个键值对,键为空字符串,值为整行内容。Mapper将每一行内容拆分成单词,每个单词成为新的键值对的键...

    MapReduce Online译文PDF

    通过以上内容,我们可以看出MapReduce Online不仅保留了原有MapReduce框架的优点,如容错处理和分布式执行,而且还通过管道传输机制增加了实时处理的能力,这对于现代大数据处理来说是非常重要的改进。

    用mapreduce进行文本处理

    - **文档聚类**:使用 MapReduce 可以有效地将文档划分为不同的类别,有助于信息组织和检索。 #### 四、MapReduce 的实现与工具 ##### 4.1 Hadoop Hadoop 是目前最流行的 MapReduce 实现之一,它提供了一整套用于...

    MapReduce设计模式

    MapReduce作为一种分布式海量数据处理的编程框架,已经得到业界的广泛关注。随着Hadoop的普及,MapReduce目前已经成为海量数据处理的最基础但也是最重要的方法之一。, 《MapReduce设计模式》是一本关于设计模式的书...

    MapReduce 编程模型

    2004年,Google的两位工程师Jeffrey Dean和Sanjay Ghemawat共同提出了一种名为MapReduce的数据处理框架,旨在简化大型集群上的数据处理流程。MapReduce不仅提供了一种高效的并行计算模型,还为开发者提供了易于使用...

    关于mapreduce最早的文章,英文原文和中文翻译

    MapReduce是一种分布式计算模型,由Google在2004年的一篇名为《MapReduce: Simplified Data Processing on Large Clusters》的技术论文中首次提出。这篇论文详细阐述了MapReduce的设计理念、实现方式以及其在大规模...

    MapReduce2.0源码分析与实战编程

    MapReduce2.0是Hadoop生态系统中的核心组件之一,它为大数据处理提供了并行计算模型。本书《MapReduce2.0源码分析与实战编程》深入解析了MapReduce的工作原理和实现机制,同时通过实战案例帮助读者提升编程技能。...

    MapReduce中文文档翻译

    在实现上,MapReduce库处理了数据分片、机器调度、故障恢复和负载均衡等复杂细节,使得程序员只需关注业务逻辑。此外,系统通过数据冗余和任务重试来保证容错性,确保计算的正确性。 论文中提到的案例——词频统计...

    MapReduce_paper

    与此同时,以MapReduce为代表的非关系型技术兴起,不仅在Web搜索领域取得成功,也开始逐渐渗透到传统上由RDBMS占据主导地位的应用领域。这两种技术之间存在着竞争与合作的关系:一方面,MapReduce以其高可用性、高...

Global site tag (gtag.js) - Google Analytics