要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就是将一个复杂的问题分解成多组相同或相似的子问题,对这些子问题再分,而后再分。直到最后的子问题能够简单得求解。算法
要具体介绍分治算法,那就不得不说一个很经典的排序算法 -- 归并排序。这里不说它的具体算法代码,只说明它的主要思想。而归并排序的思想正是分治思想。数据库
归并排序采用递归的方式,每次都将一个数组分解成更小的两个数组,再对这两个数组进行排序,不断递归下去。直到分解成最简单形式的两个数组的时候,再将这一个个分解后的数组进行合并。这就是归并排序。编程
下面有一个取自百度百科的具体例子能够看看:数组
<img src="https://img2018.cnblogs.com/blog/1011838/201811/1011838-20181116211517312-2140382336.jpg" width="65%" align="center" />分布式
咱们能够看到,初始的数组是:{10,4,6,3,8,2,5,7}函数式编程
第一次分解后,变成两个数组:{10,4,6,3},{8,2,5,7}函数
分解到最后为 5 个数组:{10},{4,6},{3,8},{2,5},{7}工具
而后分别合并并排序,最后排序完成:{2,3,4,5,6,7,8,10}oop
上述的例子这是比较简单的状况,那么咱们想一想看,当这个数组很大的时候又该怎么办呢?好比这个数组达到 100 GB大小,那么在一台机器上确定是没法实现或是效率较为低下的。搜索引擎
那一台机器不行,那咱们能够拆分到多台机器中去嘛。恰好使用分治算法将一个任务能够拆分红多个小任务,而且这多个小任务间不会相互干扰,能够独立计算。那么咱们能够拆分这个数组,将这个数组拆分红 20 个块,每一个的大小为 5 GB。而后将这每一个 5 GB的块分散到各个不一样的机器中去运行,最后再将处理的结果返回,让中央机器再进行一次完整的排序,这样无疑速度上会提高不少。
上述这个过程就是 MapReduce 的大体原理了。
Map 和 Reduce 实际上是函数式编程中的两个语义。Map 和循环 for 相似,只不过它有返回值。好比对一个 List 进行 Map 操做,它就会遍历 List 中的全部元素,而后根据每一个元素处理后的结果返回一个新的值。下面这个例子就是利用 map 函数,将 List 中每一个元素从 Int 类型 转换为 String 类型。
val a:List[Int] = List(1,2,3,4) val b:List[String] = a.map(num => (num.toString))
而 Reduce 在函数式编程的做用则是进行数据归约。Reduce 方法须要传入两个参数,而后会递归得对每个参数执行运算。仍是用一个例子来讲明:
val list:List[Int] = List(1,2,3,4,5) //运算顺序是:1-2 = -1; -1-3 = -4; -4-4 = -8; -8-5 = -13; //因此结果等于 -13 list.reduce(_ - _)
Hadoop MapReduce 和函数式中的 Map Reduce 仍是比较相似的,只是它是一种编程模型。咱们来看看 WordCount 的例子就明白了。
在这个 wordcount 程序中,MapReduce 会对输入先进行切分,这一步其实就是分治中分的过程。切分后不一样部分就会让不一样的机器去执行 Map 操做。然后即是 Shuffle,这一阶段会将不相同的单词加到一块儿,最后再进行 Reduce 。
这个 WordCount 程序是官方提供的一个简易的 Demo,更复杂的任务须要本身分解成 MapReduce 模型的代码而后执行。
所谓 MapReduce 的意思是任何的事情只要都严格遵循 Map Shuffle Reduce 三个阶段就好。其中Shuffle是系统本身提供的而Map和Reduce则用户须要写代码。
当碰到一个任务的时候,咱们须要将它解析成 Map Reduce 的处理方式而后编写 MapReduce 代码来实现。我看过一个比喻很贴切,MapReduce 这个东西这就像是说咱们有一把大砍刀,一个锤子。世界上的万事万物均可以先砍几刀再锤几下,就能搞定。至于刀怎么砍,锤子怎么锤,那就算我的的手艺了。
从模型的角度来看,MapReduce 是比较粗糙的,不管什么方法都只能用 Map Reduce 的方式来运行,而这种方式无疑不是万能的,不少应用场景都很难解决。而从作数据库的角度来看,这无非也就是一个 select + groupBy() 。这也就是为何有了后面 Spark 基于 DAG 的 RDD 概念的崛起。
这里不得很少说一句,Hadoop 的文件系统 Hdfs 才是 MapReduce 的基础,由于 Map Reduce 最实质的支撑其实就是这个 Hdfs 。没有它, Map Reduce 不过是空中阁楼。你看,在 MapReduce 式微的今天,Hdfs 还不是活得好好的,Spark 或是 Hive 这些工具也都是以它为基础。不得不说,Hdfs 才牛逼啊。
好了,接下来咱们来探究一下为何会出现 MapReduce 这个东西。
MapReduce 在 Google 最大的应用是作网页的索引。你们都知道 Google 是作搜索引擎起家的,而搜索引擎的基本原理就是索引,就是爬去互联网上的网页,而后对创建 单词->文档 的索引。这样什么搜索关键字,才能找出对应网页。这也是为何 Google 会以 WordCount 做为 MapReduce 的例子。
既然明白搜索引擎的原理,那应该就明白自 2000 年来互联网爆发的年代,单台机器确定是不够存储大量的索引的,因此就有了分布式存储,Google 内部用的叫 Gfs,Hadoop Hdfs 其实能够说是山寨 Gfs 来的。而在 Gfs 的基础上,MapReduce 的出现也就天然而然了。