Hadoop 是Apache开源组织的一个分布式开源框架,他是一个在大型集群上运行的应用程序框架。Hadoop框架透明的提供应给用程序以可靠性和数据处理方案。Hadoop实现了MapReduce计算范式,它将应用程序分成许多小片段进行工作,每一个片段都能在集群中的任何一个node上执行或者重新执行。此外,Hadoop提供了一个分布式的文件系统HDFS(Hadoop Distributed File System),用于存储计算节点上的数据,在集群中提供高聚集的带宽。MapReduce 和 HDFS两部分的设计都能保证节点上的错误能够被Hadoop这个框架自动解决。
上面说的仅仅是在wiki上对于Hadoop这个框架的简单定义,虽然不甚清楚,但是有两个值得关注的设计,就似乎MapReduce和HDFS。
一、MapReduce
MapReduce这种设计的核心思想就是“对任务进行分解,对结果进行汇总”。MapReduce中最重要的两个词:Map(映射) and Reduce(规约)。简单的来说,Map是把一组数据映射为另外一组数据,其映射规则由一个函数指定,比如从[1,2,3,4]映射到[2,4,,6,8];Reduce则是对一组数据进行规约,比如[1,2,3,4]进行和规约得到10,进行积规约得到24。换种说法来说,Map就是对任务进行分解成subtasks,Reduce就是对任务分析结果进行汇总得到最终结果。关于MapReduce的详细的内容参看建议看看孟岩的这篇MapReduce:The Free Lunch Is Not Over!。
![MapReduce结构示意图](http://a2.att.hudong.com/23/32/01300000276699123260320493304.gif)
MapReduce结构示意图
通过上面的这个示意图,我们能够基本了解这个MapReduce的大致过程,当产生一个较大input file的时候,input会被split成为许愿的小part也就是FileSplits,这个分割并不能让我们知道这个input file的内部逻辑结构。之后,每个小part也就是FileSplits会被映射到一个新建立的任务也就是Map Task。
对于Map来说:当一个单独的Map Task开始的时候,这个map task会使用RecordReader去读取从某一指定的InputFormat那里获得到的FileSplit。InputFormat通过对输入的解析产生一些key-value pairs(键值对)。由于key-value pairs是通过RecordReader读取,并被传递给指定的Mapper。用户能够根据自己的需求使用提供的Mapper处理输入参数的键值对,同时通过调用OutputCollector.collect方法和某些键值对进行所需要的用户处理。
说了这么多,简而言之,在Map阶段 N个input files将生成M个map tasks,而这些个map tasks将会根据系统配置的reduce tasks的数目生成相应数量的output files,每一个output file将对应于一个指定的reduce task,这也就是map映射的具体意义所在,在经历split过程的output files与reduce的形成多对一对应,根据这种被记录的映射,指定的output file也会被路由到相对应的reduce task。
对于Reduce来说:当一个reduce task开始的时候,他的input是分散在cluster的不同的node上的运行Map task所产生的文件,所以这就需要将这些input在本地的文件系统中产生一个副本,一旦本地的数据已经完整的时候(仅仅是内容上的完整,还是杂乱的),对本地的数据文件进行merge sort,使这些处理好的键值对形成连续的状态。这样这些键值对通过一个iterator被顺序的传递给reduce task的method中去,知道对于reduce的input都被处理完,每个reduce task都对应会产生一个output。
在MapReduce的过程中有个叫做Combine的关键步骤,提到这个不得不提的就是Map和Reduce的输入输出都是相对的,也都是临时文件。Combine的意思根据官方文档的介绍应该就是在Map和Reduce之间的一些性能一些memory的一些相关的优化操作。具体看去查查文档的介绍。
二、HDFS
HDFS故名思议就是Hadoop Distributed File System,也就是说他是一个分布式的文件系统。
HDFS同现存的许多分布式系统都有很多相似之处。但是相比于其他分布式文件系统,HDFS的不同之处是十分有意义的~HDFS有着能够高度容错的特性,而且能够部署在低成本硬件上的,这使得分布式文件系统搭建的硬件成本变的低廉。同时HDFS能够为应用程序数据提供高吞吐量的接口,适合那种有着大量数据处理的应用程序。
下面重点说一下HDFS的架构。HDFS具有着master/slave的架构,一个HDFS集群是由一个Namenode(一台用来管理文件系统的Namespace以及调节client的文件获取的master Server),一系列的Datanodes(文件存储的基本单元),一些client(获取分布式系统文件的app)组成。
图中的Metadata是存储在NameNode的server的内存中,包括了文件信息,每个文件存在对于Datanode中的file block中。File block就是图中的Block,它存储在Datanode中,同时他的相关meta-data在Datanode也有一份copy,Datanode会周期性的将所有存在block的信息发送给Namenode,保持信息的同步。
图中包含了HDFS的三个主要的操作:
(1)Read(读)
Client向Namenode发起文件读取请求,Namenode返回存储文件的Datanode信息,Client从不同的Datanode读取Block形成文件信息。
(2)Write(写)
Client向Namenode发起文件写入请求,Namenode根据的文件的大小和文件块的配置情况,返回Client它所管理部分的DataNode的信 息。Client将文件进行划分,形成Blocks,根据获得到的DataNode的信息(地址),顺序写入到各个DataNode。
(3)Replication(复制)
Namenode发现部分Block不符合最小复制数或者部分DataNode失效,通知Datanode互相复制Block,DataNode开始直接互相复制。
根据这两个结构图,我们稍稍认识了hadoop最核心的MapReduce以及HDFS,其中关于HDFS的很多核心设计都没有仔细的介绍,但是可以通过阅读官方的文档去自习的了解他的一些特性,比如safe mode,Cluster rebalance等等等。
之后详细描述Hadoop的搭建。