Hadoop是一个实现了MapReduce计算模型的开源分布式并行编程框架,借助于Hadoop,程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成海量数据的计算。



Hadoop 简介:



     包含一个分布式文件系统HDFS(Hadoop Distributed File System)。



     基于Hadoop的开源项目Pig,海量数据集分析的分布式计算程序。



    Amazon公司基于Hadoop推出了AmazonS3(Amazon Simple Storage Service),提供可靠,快速,可扩展的网络存储服务,以及一个商用的云计算平台Amazon EC2(Amazon Elastic Compute Cloud)。在IBM公司的云计算项目--"蓝云计划"中,Hadoop也是其中重要的基础软件。Google正在跟IBM合作,共同推广基于Hadoop的云计算。



    基于多核的多线程并发编程以及基于大规模计算机集群的分布式并行编程是将来软件性能提升的主要途径。



    谷歌使用MapReduce的并行编程模型进行分布式并行编程,运行在叫做GFS (Google File System)的分布式文件系统上,为全球亿万用户提供搜索服务。



    Hadoop实现了Google的MapReduce编程模型,提供了简单易用的编程接口,也提供了它自己的分布式文件系统HDFS



MapReduce计算模型



    MapReduce是Google公司的核心计算模型,它将复杂的运行于大规模集群上的并行计算过程高度的抽象到了两个函数,Map和 Reduce,适合用MapReduce来处理的数据集(或任务)有一个基本要求:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。图 1. MapReduce 计算流程




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



 集群上的并行计算:



      MapReduce计算模型非常适合在大量计算机组成的大规模集群上并行运行。



      数据分布存储:HDFS由一个管理结点(NameNode)和N个数据结点(DataNode)组成,其底层实现上是把文件切割成Block,然后这些Block分散地存储于不同的DataNode上,每个Block还可以复制数份存储于不同的 DataNode上,达到容错容灾之目的。NameNode则是整个HDFS的核心,它通过维护一些数据结构,记录了每一个文件被切割成了多少个 Block,这些Block可以从哪些DataNode中获得,各个DataNode的状态等重要信息。



     分布式并行计算:作为主控的JobTracker,用于调度和管理其它的TaskTracker,JobTracker可以运行于集群中任一台计算机上。TaskTracker负责执行任务,必须运行于DataNode上,即DataNode既是数据存储结点,也是计算结点。JobTracker 将Map任务和Reduce任务分发给空闲的TaskTracker,让这些任务并行运行,并负责监控任务的运行情况。如果某一个TaskTracker出故障了,JobTracker会将其负责的任务转交给另一个空闲的TaskTracker重新运行。



      本地计算:数据存储在哪一台计算机上,就由这台计算机进行这部分数据的计算,这样可以减少数据在网络上的传输,降低对网络带宽的需求。计算结点可以很方便地扩充,数据需要在不同的计算机之间流动,故网络带宽变成了瓶颈,“本地计算”是最有效的一种节约网络带宽的手段,“移动计算比移动数据更经济”。  图 2. 分布存储与并行计算




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



      Partition:把 Map任务输出的中间结果按key的范围划分成R份(预先定义任务个数),划分时使用hash函数: hash(key) mod R



      Combine:在 partition之前,还可以对中间结果先做 combine,即将中间结果中有相同key的<key, value>对合并成一对。



       Reduce任务从 Map 任务结点取中间结果: 以文件形式存于本地磁盘。JobTracker再通知 Reduce,R个Reduce 任务各自负责一段Key区间。每个Reduce需要向许多个Map任务结点取得落在其负责的 Key 区间内的中间结果,然后执行Reduce函数,形成结果文件。



       任务管道: 有R个Reduce任务,就会有R个最终结果