MapReduce浅析

 用 Mapeduce 来处理大数据集的过程, 这个 MapReduce 的计算过程简而言之,就是将大数据集分解为成百上千的小数据集,每一个(或若干个)数据集分别由集群中的一个结点(通常就是一台普通的计算机)进行处理并生成中间结果,而后这些中间结果又由大量的结点进行合并, 造成最终结果。 程序员

    计算模型的核心是 Map 和 Reduce 两个函数这两个函数由用户负责实现,功能是按必定的映射规则将输入的 <key, value> 对转换成另外一个或一批 <key, value> 对输出。 编程


                                表 Map 和 Reduce 函数 网络

函数 输入 输出 说明
Map <k1, v1> List(<k2,v2>) 1. 将小数据集进一步解析成一批 <key,value> 对,输入 Map 函数中进行处理。 
2. 每个输入的 <k1,v1> 会输出一批 <k2,v2>。 <k2,v2> 是计算的中间结果。
Reduce <k2,List(v2)> <k3,v3> 输入的中间结果 <k2,List(v2)> 中的 List(v2) 表示是一批属于同一个 k2 的 value

   基于 MapReduce 计算模型编写分布式并行程序很是简单,程序员的主要编码工做就是实现 Map 和 Reduce 函数,其它的并行编程中的种种复杂问题,如分布式存储,工做调度,负载平衡,容错处理,网络通讯等,均由 MapReduce 框架(好比 Hadoop )负责处理,程序员彻底不用操心。 框架

本地计算 分布式

   数据存储在哪一台计算机上,就由这台计算机进行这部分数据的计算,这样能够减小数据在网络上的传输,下降对网络带宽的需求。在 Hadoop 这样的基于集群的分布式并行系统中,计算结点能够很方便地扩充,而因它所可以提供的计算能力近乎是无限的,可是由是数据须要在不一样的计算机之间流动,故网络带宽变成了瓶颈,是很是宝贵的,“本地计算”是最有效的一种节约网络带宽的手段,业界把这形容为“移动计算比移动数据更经济”。 ide

任务粒度 函数

   把原始大数据集切割成小数据集时,一般让小数据集小于或等于 HDFS 中一个 Block 的大小(缺省是 64M),这样可以保证一个小数据集位于一台计算机上,便于本地计算有 M 个小数据集待处理,就启动 M 个 Map 任务,注意这 M 个 Map 任务分布于 N 台计算机上并行运行,Reduce 任务的数量 R 则可由用户指定。 oop

Partition 大数据

   把 Map 任务输出的中间结果按 key 的范围划分红 R 份( R 是预先定义的 Reduce 任务的个数),划分时一般使用 hash 函数,如: hash(key) mod R,这样能够保证某一段范围内的 key,必定是由一个 Reduce 任务来处理,能够简化 Reduce 的过程。 编码

Combine

   在 partition 以前,还能够对中间结果先作 combine,即将中间结果中有相同 key的 <key, value> 对合并成一对。combine 的过程与 Reduce 的过程相似,不少状况下就能够直接使用 Reduce 函数,但 combine 是做为 Map 任务的一部分,在执行完 Map 函数后紧接着执行的。Combine 可以减小中间结果中 <key, value> 对的数目,从而减小网络流量。

Reduce 任务从 Map 任务结点取中间结果

    Map 任务的中间结果在作完 Combine 和 Partition 以后,以文件形式存于本地磁盘。中间结果文件的位置会通知主控 JobTracker, JobTracker 再通知 Reduce 任务到哪个 DataNode 上去取中间结果。注意全部的 Map 任务产生中间结果均按其 Key 用同一个 Hash 函数划分红了 R 份,R 个 Reduce 任务各自负责一段 Key 区间。每一个 Reduce 须要向许多个 Map 任务结点取得落在其负责的 Key 区间内的中间结果,而后执行 Reduce 函数,造成一个最终的结果文件。

任务管道

   有 R 个 Reduce 任务,就会有 R 个最终结果,不少状况下这 R 个最终结果并不须要合并成一个最终结果。由于这 R 个最终结果又能够作为另外一个计算任务的输入,开始另外一个并行计算任务。

相关文章
相关标签/搜索