MapReduce:在大型集群上简化数据处理

概要

MapReduce是一种编程模型,它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后,再指定一个reduce函数, 它用来合并所有的具有相同中间key的中间value 。现实生活中有许多任务可以通过该模型进行表达,具体案例会在论文中展现出来。

以这种函数式风格编写的程序能够在一个大型商用机器集群上自动并行执行。这个系统在运行时只关心:如何分割输入数据,在大量计算机所组成的集群上的调度问题,集群中计算机的故障处理,管理集群中计算机之间的必要通信。使用MapReduce编程模型可以让那些没有并行计算和分布式系统开发经验的程序员有效的使用分布式系统的资源。

我们实现的MapReduce可以在一个大型的商用计算机集群上运行,并且具备高度扩展性:一个标准的MapReduce计算可以在数千台机器上处理TB级的数据。程序员会觉得该系统易于使用。目前在谷歌已经实现了数以百计的MapReduce程序,在谷歌的集群上,每天都有1000多个MapReduce的工作在执行。

1 简介

在过去五年里,作者以及许多其他在谷歌工作的人已经实现了数百种用于特殊目的的计算。它们可以用来处理大量原始数据,例如:爬取的文档,网页请求日志等等。并以此来计算出各种衍生数据,例如:倒排索引,Web文档的各种图表示,每台主机所抓取页面数的摘要,以及特定某天中最频繁的查询集等等。大部分这种计算从概念上来讲都很简单。但是,输入的数据量通常非常巨大,并且为了能在一个合理的时间内完成,计算任务也不得不分配给成百上千台机器去执行。如何并行化计算,分配数据以及处理故障的问题,所有的问题都纠缠在一起,这就需要大量的代码来对它们进行处理。因此,这也使得原本简单的计算变得极为复杂,而且难以处理。

为了应对这种复杂性,我们设计了一种新的抽象,它可以让我们表达我们所试图执行的简单计算,但该库中隐藏了并行化,容错,数据分发以及负载均衡这些混乱的细节。我们这种抽象的设计灵感来源于Lisp和许多其他函数式语言中存在的map和reduce原语。我们意识到,大多数计算都涉及到对输入中的每个逻辑记录进行_map_操作,以便于计算出一个中间键值对的集合。然后,为了恰当的整合衍生数据,我们对共用相同键的所有值进行_reduce_操作。通过使用具备用户所指定的_map_和_reduce_操作的函数式模型,这使得我们能够轻松并行化大型计算,并且使用重新执行的结果作为容错的主要机制。

这项工作的主要贡献在于提供了一个简单而强大的接口,该接口可实现大规模计算的自动并行化和分布式执行。通过使用该接口的实现,从而在大型商用计算机集群上获得了高性能。

本文的第2章节描述了该基础编程模型并给出了一些案例。第3章节则是关于我们针对集群的计算环境所量身定制的MapReduce接口的实现。第4章节介绍了我们所找到的对于该编程模型的一些有用改进。第5章节则是关于我们通过一系列任务对我们所实现的MapReduce进行的性能测试。第6章节则探索了MapReduce在谷歌中的一些应用,这其中包括了我们使用它来重写我们的索引系统的一些经验。第7章节讨论了一些相关以及日后要做的工作。

2 编程模型

该计算任务将一个键值对集合作为输入,并生成一个键值对集合作为输出。MapReduce这个库的用户将这种计算任务以两个函数进行表达,即 Map 和 Reduce 。

由用户所编写的 Map 函数接收输入,并生成一个中间键值对集合。MapReduce这个库会将所有共用一个键的值组合在一起,并将它们传递给 Reduce 函数。

Reduce函数也是由用户所编写。它接受一个中间键以及该键的值的集合作为输入。它会将这些值合并在一起,以此来生成一组更小的值的集合。通常每次调用 Reduce 函数所产生的值的结果只有0个或者1个。中间值通过一个迭代器来传递给用户所编写的 Reduce 函数。这使得我们可以处理这些因为数据量太大而无法存放在内存中的存储值的list列表了。

2.1 案例

我们可以思考下这样一个场景,我们要从大量的文档中计算出每个单词的出现次数。用户将会编写出类似于下方伪代码的代码:

map(  Stringkey,Stringvalue):

// key: document name 

 // value: document contents 

 foreach word winvalue:

  EmitIntermediate(w,"1"); 

 reduce(Stringkey,Iteratorvalues):

// key: a word  

// values: a list of counts

  intresult =0;

foreach vinvalues: 

 result += ParseInt(v); 

 Emit(AsString(result));

map 函数会返回一个单词加上它出现的次数的键值对(在这个例子中,返回的出现次数就是1)。 reduce 函数会将该单词的出现次数统计在一起。

此外,用户通过编写代码,传入输入和输出文件的名字,以及可选的调节参数来创建一个符合MapReduce模型规范的对象。接着,用户调用 MapReduce 函数,并将这个对象传入该函数。用户的代码和MapReduce库(该库是由C++实现的)链接在一起,附录A中会提供该案例的完整代码。

2.2 类型

尽管在前面的伪代码中的输入和输出的类型都是String,但是从概念上来说,用户所提供的 map 和 reduce 函数都有相关联的类型。

map(k1,v1) -->list(k2,v2)  

reduce(k2,list(v2)) -->list(v2)

例如,输入的键和值与输出的键和值来自于不同的地方。此外,中间的键和值与输出的键和值在类型上相同。

在我们的C++实现中,我们使用String类型作为用户所定义的函数的输入和输出的类型,用户在自己的代码中对字符串进行适当的类型转换。

2.3 更多案例

此处有一些可以很容易使用MapReduce模型来表示的简单例子:

分布式过滤器: Map 函数会发出(emit)匹配某个规则的一行。 Reduce 函数是一个恒等函数,即把中间数据复制到输出。(虚生花注:恒等函数是数学中是一种没有任何作用的函数,它的输入等于输出,即f(x)=x)。

计算URL的访问频率: map 函数用来处理网页请求的日志,并输出(URL,1)。 reduce 函数则用于将相同URL的值全部加起来,并输出 (URL, 访问总次数) 这样的键值对结果。

倒转网络链接图: map 函数会在源页面中找到所有的目标URL,并输出这样的键值对。 reduce 函数会将给定的目标URL的所有链接组合成一个列表,输出这样的键值对。

每台主机上的检索词频率:term(这里是指搜索系统里的某一项东西,这里指检索词)vector(这里指数组)将一个文档或者是一组文档中出现的最重要的单词概括为_<单词,频率>_ 这样的键值对列表,对于每个输入文档,map函数会输出这样一对键值对 <hostname, term vector> (其中hostname是从文档中的URL里提取出来的)。Reduce函数接收给定主机的所有每一个文档的term vector。它会将这些term vector加在一起,并去除频率较低的term,然后输出一个最终键值对 <hostname, term vector> 。

倒排索引: map 函数会对每个文档进行解析,并输出这样的键值对序列。 reduce 函数所接受的输入是一个给定词的所有键值对,接着它会对所有文档ID进行排序,然后输出。所有输出键值对的集合可以形成一个简单的倒排索引。我们能简单的计算出每个单词在文档中的位置。

分布式排序: map 函数会从每条记录中提取出一个key,然后输出这样的键值对。 reduce 函数对这些键值对不做任何修改,直接输出。这种计算任务依赖分区机制

上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注,哈哈~各位小伙伴关注我后私信【Java】就可以免费领取哒

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容