本节和大家一起学习一下分布式计算开源框架Hadoop,本节主要内容有Hadoop概念的介绍和Hadoop相关计算方法,希望通过本节的学习,大家对Hadoop的分布式计算有一定的认识。

分布式计算开源框架Hadoop介绍

引用
Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、Facebook和Yahoo等等。对于我 来说,最近的一个使用点就是服务集成平台的日志分析。服务集成平台的日志量将会很大,而这也正好符合了分布式计算的适用场景

什么是Hadoop?
搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做)。但很多开发的朋友在做了多年项目以后,都习惯是先How,然后What,最后才是Why,这样只会让自己变得浮躁,同时往往会将技术误用于不适合的场景。

Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的, 简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统 (HadoopDistributedFileSystem)的缩写,为分布式计算存储提供了底层支持。

MapReduce从它名字上来看就大致可以看出个缘由,两个动词Map和Reduce,“Map(展开)”就是将一个任务分解成为多个任 务,“Reduce”就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。这不是什么新思想,其实在前面提到的多线程,多任务的设计就可以找到这 种思想的影子。不论是现实社会,还是在程序设计中,一项工作往往可以被拆分成为多个任务,任务之间的关系可以分为两种:一种是不相关的任务,可以并行执 行;另一种是任务之间有相互的依赖,先后顺序不能够颠倒,这类任务是无法并行处理的。回到大学时期,教授上课时让大家去分析关键路径,无非就是找最省时的 任务分解执行方式。在分布式系统中,机器集群就可以看作硬件资源池,将并行的任务拆分,然后交由每一个空闲机器资源去处理,能够极大地提高计算效率,同时 这种资源无关性,对于计算集群的扩展无疑提供了最好的设计保证。(其实我一直认为Hadoop的卡通图标不应该是一个小象,应该是蚂蚁,分布式计算就好比 蚂蚁吃大象,廉价的机器群可以匹敌任何高性能的计算机,纵向扩展的曲线始终敌不过横向扩展的斜线)。任务分解处理以后,那就需要将处理以后的结果再汇总起 来,这就是Reduce要做的工作。

MapReduce结构示意图

集群上的并行计算

MapReduce计算模型非常适合在大量计算机组成的大规模集群上并行运行。图一中的每一个Map任务和每一个Reduce任务均可以同时运行于一个单独的计算结点上,可想而知其运算效率是很高的,那么这样的并行计算是如何做到的呢?

数据分布存储

Hadoop中的分布式文件系统HDFS由一个管理结点(NameNode)和N个数据结点(DataNode)组成,每个结点均是一台普通的计算 机。在使用上同我们熟悉的单机上的文件系统非常类似,一样可以建目录,创建,复制,删除文件,查看文件内容等。但其底层实现上是把文件切割成Block, 然后这些Block分散地存储于不同的DataNode上,每个Block还可以复制数份存储于不同的DataNode上,达到容错容灾之目的。 NameNode则是整个HDFS的核心,它通过维护一些数据结构,记录了每一个文件被切割成了多少个Block,这些Block可以从哪些 DataNode中获得,各个DataNode的状态等重要信息。如果你想了解更多的关于HDFS的信息,可进一步阅读参考资 料:TheHadoopDistributedFileSystem:ArchitectureandDesign

分布式并行计算

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

本地计算

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

Hadoop分布存储与并行计算

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

Partition

把Map任务输出的中间结果按key的范围划分成R份(R是预先定义的Reduce任务的个数),划分时通常使用hash函数如:hash(key)modR,这样可以保证某一段范围内的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个最终结果又可以做为另一个计算任务 的输入,开始另一个并行计算任务。就是MapReduce大致的结构图,在Map前还可能会对输入的数据有Split(分割)的过程,保证任务并行效率, 在Map之后还会有Shuffle(混合)的过程,对于提高Reduce的效率以及减小数据传输的压力有很大的帮助。后面会具体提及这些部分的细节。

HDFS是分布式计算的存储基石,Hadoop的分布式文件系统和其他分布式文件系统有很多类似的特质。分布式文件系统基本的几个特点:
对于整个集群有单一的命名空间。
数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前无法看到文件存在。
文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且根据配置会由复制文件块来保证数据的安全性。本节关于分布式计算开源框架Hadoop方面的内容介绍完毕。