江湖传说永流传:谷歌技术有"三宝",GFS、MapReduce和大表(BigTable)!
谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年SOSP的GFS,04年OSDI的MapReduce,和06年OSDI的BigTable。SOSP和OSDI都是操作系统领域的顶级会议,在计算机学会推荐会议里属于A类。SOSP在单数年举办,而OSDI在双数年举办。
那么这篇博客就来介绍一下MapReduce。
1. MapReduce是干啥的
GFS和BigTable已经为我们提供了高性能、高 并发的服务,但是并行编程可不是所有程序员都玩得转的活儿,如果我们的应用本身不能并发,那GFS、BigTable也都是没有意义的。 MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。
简单概括的说,MapReduce是将一个大作业拆分为多个小作业的框架(大作业和小作业应该本质是一样的,只是规模不同),用户需要做的就是决定拆成多少份,以及定义作业本身。
下面用一个贯穿全文的例子来解释MapReduce是如何工作的。
2. 例子:统计词频
如果我想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那我收集好论文后,该怎么办呢?
方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。
这种方法在数据集比较小时,是非常有效的,而且实现最简单,用来解决这个问题很合适。
方法二:写一个多线程程序,并发遍历论文。
这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件。当我们的机器是多核或者多处理器,方法二肯定比方法一高效。但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件。
方法三:把作业交给多个计算机去完成。
我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。
方法四:让MapReduce来帮帮我们吧!
MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的。我们只要定义好这个任务(用户程序),其它都交给MapReduce。
在介绍MapReduce如何工作之前,先讲讲两个核心函数map和reduce以及MapReduce的伪代码。
3. map函数和reduce函数
map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。
- map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
- reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。
统计词频的MapReduce函数的核心代码非常简短,主要就是实现这两个函数。
- map(String key, String value):
- // key: document name
- // value: document contents
- for each word w in value:
- EmitIntermediate(w, "1");
- reduce(String key, Iterator values):
- // key: a word
- // values: a list of counts
- int result = 0;
- for each v in values:
- result += ParseInt(v);
- Emit(AsString(result));
在统计词频的例子里,map函数接受的键是文件名,值是文件 的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就 是单词w,值是一串"1"(最基本的实现是这样,但可以优化),个数等于键为w的键值对的个数,然后将这些“1”累加就得到单词w的出现次数。最后这些单 词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。
4. MapReduce是如何工作的
上图是论文里给出的流程图。一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。图中执行的顺序都用数字标记了。
- MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。
- user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。
- 被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
- 缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
- master 通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区), 当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个 Reduce作业(谁让分区少呢),所以排序是必须的。
- reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
- 当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
所有执行完毕后,MapReduce输出放在了R个分区的输出文件 中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是 来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意 Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值 对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。
我更喜欢把流程分为三个阶段。第一阶段是准备阶段,包括1、2,主 角是MapReduce库,完成拆分作业和拷贝用户程序等任务;第二阶段是运行阶段,包括3、4、5、6,主角是用户定义的map和reduce函数,每 个小作业都独立运行着;第三阶段是扫尾阶段,这时作业已经完成,作业结果被放在输出文件里,就看用户想怎么处理这些输出了。
5. 词频是怎么统计出来的
结合第四节,我们就可以知道第三节的代码是如何工作的了。假设咱们定义M=5,R=3,并且有6台机器,一台master。
这幅图描述了MapReduce如何处理词频统计。由于map worker数量不够,首先处理了分片1、3、4,并产生中间键值对;当所有中间值都准备好了,Reduce作业就开始读取对应分区,并输出统计结果。
6. 用户的权利
- an input reader。这个函数会将输入分为M个部分,并且定义了如何从数据中抽取最初的键值对,比如词频的例子中定义文件名和文件内容是键值对。
- a partition function。这个函数用于将map函数产生的中间键值对映射到一个分区里去,最简单的实现就是将键求哈希再对R取模。
- a compare function。这个函数用于Reduce作业排序,这个函数定义了键的大小关系。
- an output writer。负责将结果写入底层分布式文件系统。
- a combiner function。实际就是reduce函数,这是用于前面提到的优化的,比如统计词频时,如果每个<w, "1">要读一次,因为reduce和map通常不在一台机器,非常浪费时间,所以可以在map执行的地方先运行一次combiner,这样 reduce只需要读一次<w, "n">了。
- map和reduce函数就不多说了。
相关推荐
【完整课程列表】 大数据云计算技术 Hadoop集群监控与Hive高可用-暴风影音技术团队...大数据云计算技术 云计算介绍-划时代的技术(共83页).pptx 大数据云计算技术 云计算与数据挖掘 云计算与数据分析(共114页).pptx
赠送jar包:hadoop-mapreduce-client-jobclient-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-jobclient-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-jobclient-2.6.5-sources.jar; 赠送...
- 这些应用场景展示了云计算与大数据技术在实际工作中带来的巨大价值。 #### 十三、总结 通过本次论坛的学习,我们可以深刻认识到云计算与大数据对于推动行业发展的重要性。未来,随着技术的不断进步,这些领域的...
2.3 大数据时代的思维变革 3.1 大数据相关技术基础(1) 3.2 大数据相关技术基础(2) 3.3 大数据相关技术基础(3) 4.1 大数据来源 4.2 大数据采集 4.3 大数据预处理 4.4 大数据集成 5.1 hadoop简介之一 5.2 hadoop简介之...
hadoop-mapreduce-examples-2.7.1.jar
赠送jar包:hadoop-mapreduce-client-jobclient-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-jobclient-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-jobclient-2.6.5-sources.jar; 赠送...
福建师范大学精品大数据导论课程系列 (2.3.1)--1.3 《大数据时代的思维变革》PPT.pdf 福建师范大学精品大数据导论课程系列 (3.1.1)--2.1 《大数据相关技术基础(1)》PPT.pdf 福建师范大学精品大数据导论课程系列 ...
赠送jar包:hadoop-mapreduce-client-app-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-app-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-app-2.6.5-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hadoop-mapreduce-client-app-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-app-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-app-2.6.5-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hadoop-mapreduce-client-core-2.6.5.jar 赠送原API文档:hadoop-mapreduce-client-core-2.6.5-javadoc.jar 赠送源代码:hadoop-mapreduce-client-core-2.6.5-sources.jar 包含翻译后的API文档:...
赠送jar包:hadoop-mapreduce-client-core-2.5.1.jar; 赠送原API文档:hadoop-mapreduce-client-core-2.5.1-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-core-2.5.1-sources.jar; 赠送Maven依赖信息文件:...
标题中的“大数据云计算技术”指的是在处理海量数据时所采用的一种计算模式,它结合了分布式计算、并行处理和大规模存储等技术。云计算是提供计算资源和服务的一种方式,通过网络按需分配,无需用户直接管理硬件设施...
在当今的信息时代,大数据和云计算已经成为了信息技术领域的核心组成部分。淘宝网作为中国最大的电子商务平台,其背后的数据处理能力是其成功的关键之一。本篇将深入探讨Hadoop这一大数据处理框架在淘宝网中的应用,...
云计算导论-习题答案-第六章-云计算与大数据 大数据是指无法在一定时间内通过常用的软件工具进行捕获、存储、管理和处理的数据集。根据维基百科的定义,大数据泛指大规模、超大规模的数据集,因可从中挖掘出有价值...
当前,大数据处理多采用Google的MapReduce框架等云计算架构,这些架构使得数据处理和存储更加分散、灵活,但同时也带来了测试上的复杂性。软件测试不仅要关注代码层面的正确性,还要关注整个云计算环境下的数据处理...
目前最流行的云计算架构为Google的MapReduce。其包含Map和Reduce两个环节,对数据进行分布式处理。如果程序设计不能与架构功能一致,将导致测试结果无效。因此,软件测试程序需要创新,以符合大数据云计算时代的要求...
《Hadoop分布式集群大数据云计算源码视频教程》是一套深入解析Hadoop技术栈及大数据云计算实践的综合学习资源。该教程旨在帮助学习者理解和掌握Hadoop在分布式集群环境中的核心概念、工作原理以及实际应用,从而提升...
通过深入分析当前的挑战,并利用大数据技术的优势,软件测试可以进一步优化测试方法,提高测试效率和质量,以适应大数据云计算时代的发展需求。这不仅需要测试人员具备专业的技能,还需要测试工具和测试环境的不断...
3. **技术架构**:iData采用Hadoop MapReduce进行大规模数据处理,HDFS作为主要的数据存储系统。同时,平台还包括DBSync、TTHive、Hbase等工具进行数据集成和即席查询。报表需求主要通过淘数据和Business Preview...
标题中的“云计算与大数据技术-Hadoop分布式大数据系统”揭示了我们即将探讨的核心主题:Hadoop在云计算环境中的应用,以及它如何处理和分析大规模数据。Hadoop是Apache软件基金会的一个开源项目,它提供了一个...