MapReduce介绍

 Introduction
-------------
MapReduce是一个最先由Google提出的分布式计算软件构架,它可以支持大数据量的分布式处理。这个架构最初起源于函数式程式的map和reduce两个函数组成,但它们在MapReduce架构中的应用和原来的使用上的大相径庭。

OverView
---------
MapReduce架构是用来解决大数据量的分布式计算问题,然后把计算后的结果放入文件系统或者数据库中。

"Map":主结点读入输入数据,把它分成可以用相同方法解决的小数据块(这里是一个分而治之的思想),然后把这些小数据块分发到不同的工作节点上(worder nodes)上,每一个工作节点(worder node)循环做同样的事,这就行成了一个树行结构(分布式计算中的很多模型都和图论有关,pageRank也是),而每一个叶子节点有来处理每一个具体的小数据块,再把这些处理结果返回给父节点。

"Reduce":主结节得到所有子节点的处理结果,然后把所有结果组合并且返回到输出。

MapReduce的一个特点是可以用map和reduceion方法来处理分布式计算的问题(这里有一个移动计算而不是移动数据的概念,因为移动计算比移动数据代价更小)。这里的每一个mapping操作都是相对独立的,所有的maps都是并行运行的,虽然实践中会受到数据源和cpu个数的影响。同样的,这里用一个reducer集合来执行reduction操作,所有带有相同key的map输出会聚集到同一个reducer。虽然这个过程看上去没有串行计算来得高效,但是MapReduce能够处理一般服务器所不能处理的大数据量处理问题。大型的服务器集群可以在几个小时内处理petabyte数据量的排序问题。而并行处理可以提供部分容错和出错恢复的功能。当一个mapper或reducer失效时,整个工作就会被重新安排,从而不会影响工作的连续性。

Logical view
------------
MpaReduce的Map和Reduce过程都定义了数据结构(key,value)对,Map操作在一个数据域中用一种类型表达一个数据对,然后在另一个不同的域中返回一个数据队列:
Map(k1,v1) -> list(k2,v2)
Map过程并行应用于每一个输入的数据集,每一次调用都会产生一个(k2,v2)的队列。然后,MapReduce构架收集输出队列中有相同key的数据对,把它们聚集在一起,因为构建了一个不同key的数据对集合。

Reduce方法应用于上面产生的每一个数据对集合,从而产生相同域中的数据集合。
Reduce(k2,list(v2)) -> list(v3)
每一个被调用的Reduce方法产生一个v3数据集或者一个空集,这里也可以返回多个value。所有返回的调用结果组成一个结果队列。

Example
---------
 void map(String name, String document):
  // name: document name
  // document: document contents
  for each word w in document:
    EmitIntermediate(w, 1);
 
 void reduce(String word, Iterator partialCounts):
  // word: a word
  // partialCounts: a list of aggregated partial counts
  int result = 0;
  for each pc in partialCounts:
    result += ParseInt(pc);
  Emit(result);

这里,每一个文档被分成了一个个词,通过调用Map方法,每一个词都初始化的个数为1。MapReduce架构把所有相同的词聚合在一起,把它们传送给Reduce,Reduce计算所有同相词的出现个数。

Dataflow
--------
MapReduce架构的操作模块:
1. 输入流模块:输入模块负责把输入数据分成16MB或者128MB的小数据块,然后把它们传给Map模块
2. Map模块:Map模块得到每一个key/value对,处理后产生一个或多个key/value对。这里的输入key/value对与输出key/value对是不一样的。
3. Partition模块:它用于负责把上面输出的key映射到不同的reduce方法中去
4. comapre模块:对reduce所读入的数据进行比较
5. Reduce模块:对上面已经排好序的并且带有相同key的数据进行迭代计算
6. 输出模块:把reduce的输出结果写到存储系统中去,一般都会用分布式文件系统,如GFS

Distribution and reliability
----------------------------
MapReduce通过把大工作分成不同的小工作再分发给不同的工作者来实现数据的可靠性。每一个单独的工作者处理分发的工作,然后把结果和状态返回给父节点。如果一个节点失效了,主节点会发现和记录这个失效的节点,把分配给这个节点的工作再分发给别的节点。

而实践中也不一定都是高可靠性的,如Hadoop的NameNode是一个单节点的文件系统,一但JobTracker失效,所有的工作都会丢失。

Educational Courses
--------------------

    * Cluster Computing and MapReduce course from Google Code University contains video lectures and related course materials from a series of lectures that was taught to Google software engineering interns during the Summer of 2007.
    * MapReduce in a Week course from Google Code University contains a comprehensive introduction to MapReduce including lectures, reading material, and programming assignments.
    * MapReduce course, taught by engineers of Google Boston, part of 2008 Independent Activities Period at MIT.
    * Cloudera's Hadoop Course, taught by Ex-Google Employees and other Apache Hadoop Project Committers

你可能感兴趣的:(Hadoop)