Google的分布式计算模型Map Reduce

map函数将输入分割成key/value对
服务器君一共花费了213.326 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map Reduce,这里再单独拿出来了解一下。

并行计算简介

计算机的早期阶段,程序都是serial(连续的),类似于批处理程序。

并行计算的程序中,进程将一个任务分割成多个部分parts,每个“部分“都是能够并行处理的,每个“部分”可以同时运行在不同的cpu上,这些cpus可以是同一台机器上,也可以是通过网络运行在不同机器的cpu上。

如果一个程序想要通过并行来实现,第一步的工作是需要将待处理的工作分割成一系列的任务task,并且这些任务是能够并行的运行在处理器上,当然一些情况下,待处理的工作是没有办法分割成这样的一些列的任务的,例如对于计算Fibonacci这个工作:

Fk+2 = Fk + Fk+1

该工作是不能被分割为这样的一系列的任务的,因为每个计算的值是需要依赖上次计算的结果的。

下面给出一个能够被“并行”的例子:

如果有大量的数据需要被处理,如果这些数据能够被分割为等大小的小块(partitions)。更加具体话的说,对于下面的数组:

如果我们需要对于上面数组的每个元素都进行处理,并且每个计算是相对独立的话,任务之间不需要交互,这是一个使用master/worker的基本实现:

Master:

  1. 初始化该数组,并且将该数组分割成各个部分subarray
  2. 将每个subarray发送到各个worker
  3. 如果各个worker完成了对于数组元素的计算的话,master将接受各个worker的计算结果

Worker:

  1. 接受subarray
  2. 处理该subarray
  3. 将计算结构传递给master

什么是MapReduce? 

在lisp语言中,map作为一个输入函数接受一个序列,然后处理每个序列中value值,然后reduce将最终的map计算出来的结果整理成最终程序输出。这就是MapReduce最初的思想来源,通过用户定义的map函数将输入分割成key/value对,然后处理该数据,最终通过Reduce函数将处理完成的记过合并。

下面是一个简单的示例程序:

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));

MapReduce是如何运行的? 

Map/Reduce模型计算示意图

1. MapReduce Library首先将输入文件切割成多个小片的文件pieces,然后MapReduce Library将启动复制操作,将用户程序复制到各个a cluster of machines上。

2. 在这些a cluster of machines中,其中一个比较特殊称之为master,其他的machine被称之为worker,master选择空闲的worker并将任务(map任务或者是reduce任务)分配给这些空闲的worker任务。

3. 一个worker如果被master分配了map任务的话,该worker首先读取该key/value对,然后执行用户定义的map函数,这些处理完成的key/value对被缓存到内存中。

4. 然后,将这些key/value对写入本地磁盘,然后worker通知master。

5. 如果master接收到了worker在第4步的通知之后,master将这个信息传递给reduce worker,该reduce worker通过远程系统调用的形式读取该worker磁盘上存储的处理完的数据。

如果reduce worker读取完了所有的数据的话,然后该reduce worker将读取到的数据排序,如果数据量比较大的话,无法全部放在内存中,那么排序将使用外部排序来实现。

6. Reduce worker遍历已排序的数据,然后将数据传递到用户定义的Reduce函数。

7. 当所有的map和reduce完成之后,然后master唤醒用户程序。

通过整个程序的运行过程,我们可以看出用户程序仅仅需要编写Map函数和Reduce函数即可,MapReduce库首先通过调用用户自定义的Map函数,将输入文件分割,如果数据处理完成,将调用Reduce函数将结果合并起来。

本文地址:http://www.nowamagic.net/librarys/veda/detail/1768,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1768

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《UNIX编程艺术》 姜宏 (作者)

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为本书贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。

更多计算机宝库...