从分治算法到 Hadoop MapReduce

从分治算法提及

要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就是将一个复杂的问题分解成多组相同或相似的子问题,对这些子问题再分,而后再分。直到最后的子问题能够简单得求解。html

要具体介绍分治算法,那就不得不说一个很经典的排序算法 -- 归并排序。这里不说它的具体算法代码,只说明它的主要思想。而归并排序的思想正是分治思想。算法

归并排序采用递归的方式,每次都将一个数组分解成更小的两个数组,再对这两个数组进行排序,不断递归下去。直到分解成最简单形式的两个数组的时候,再将这一个个分解后的数组进行合并。这就是归并排序。数据库

下面有一个取自百度百科的具体例子能够看看:编程

咱们能够看到,初始的数组是:{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}函数

上述的例子这是比较简单的状况,那么咱们想一想看,当这个数组很大的时候又该怎么办呢?好比这个数组达到 100 GB大小,那么在一台机器上确定是没法实现或是效率较为低下的。工具

那一台机器不行,那咱们能够拆分到多台机器中去嘛。恰好使用分治算法将一个任务能够拆分红多个小任务,而且这多个小任务间不会相互干扰,能够独立计算。那么咱们能够拆分这个数组,将这个数组拆分红 20 个块,每一个的大小为 5 GB。而后将这每一个 5 GB的块分散到各个不一样的机器中去运行,最后再将处理的结果返回,让中央机器再进行一次完整的排序,这样无疑速度上会提高不少。oop

上述这个过程就是 Hadoop MapReduce 的大体原理了。

函数式的 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

Hadoop MapReduce 和函数式中的 Map Reduce 仍是比较相似的,只是它是一种编程模型。咱们来看看 WordCount 的例子就明白了。

在这个 wordcount 程序中,Hadoop MapReduce 会对输入先进行切分,这一步其实就是分治中的过程。切分后不一样部分就会让不一样的机器去执行 Map 操做。然后即是 Shuffle,这一阶段会将不相同的单词加到一块儿,最后再进行 Reduce 。

WordCount

这个 WordCount 程序是官方提供的一个简易的 Demo,更复杂的任务须要本身分解成 Hadoop MapReduce 模型的代码而后执行。

所谓 MapReduce 的意思是任何的事情只要都严格遵循 Map Shuffle Reduce 三个阶段就好。其中Shuffle是系统本身提供的而Map和Reduce则用户须要写代码。

当碰到一个任务的时候,咱们须要将它解析成 Map Reduce 的处理方式而后编写 Hadoop MapReduce 代码来实现。我看过一个比喻很贴切,Hadoop MapReduce 这个东西这就像是说咱们有一把大砍刀,一个锤子。世界上的万事万物均可以先砍几刀再锤几下,就能搞定。至于刀怎么砍,锤子怎么锤,那就算我的的手艺了。

从模型的角度来看,Hadoop MapReduce 是比较粗糙的,不管什么方法都只能用 Map Reduce 的方式来运行,而这种方式无疑不是万能的,不少应用场景都很难解决。而从作数据库的角度来看,这无非也就是一个 select + groupBy() 。这也就是为何有了后面 Spark 基于 DAG 的 RDD 概念的崛起。

这里不得很少说一句,Hadoop 的文件系统 Hadoop Hdfs 才是 Hadoop MapReduce 的基础,由于 Map Reduce 最实质的支撑其实就是这个 Hadoop Hdfs 。没有它, Map Reduce 不过是空中阁楼。你看,在 Hadoop MapReduce 式微的今天,Hadoop Hdfs 还不是活得好好的,Spark 或是 Hive 这些工具也都是以它为基础。不得不说,Hadoop Hdfs 才牛逼啊。

为何会出现 Hadoop MapReduce

好了,接下来咱们来探究一下为何会出现 Hadoop MapReduce 这个东西。

MapReduce 在 Google 最大的应用是作网页的索引。你们都知道 Google 是作搜索引擎起家的,而搜索引擎的基本原理就是索引,就是爬去互联网上的网页,而后对创建 单词->文档 的索引。这样什么搜索关键字,才能找出对应网页。这也是为何 Google 会以 WordCount 做为 MapReduce 的例子。

既然明白搜索引擎的原理,那应该就明白自 2000 年来互联网爆发的年代,单台机器确定是不够存储大量的索引的,因此就有了分布式存储,Google 内部用的叫 Gfs,Hadoop Hdfs 其实能够说是山寨 Gfs 来的。而在 Gfs 的基础上,Hadoop MapReduce 的出现也就天然而然了。


推荐阅读:

大数据存储的进化史 --从 RAID 到 Hdfs

相关文章
相关标签/搜索