hadoop 前世今生
hadoop最早起源于开源收缩引擎nutch,由dong cutting 贡献,但由于nutch最初的设计不能解决数10亿级别的文件存储和索引而遇到了严重的可扩展性问题,直到2003年google发表了分布式文件系统(GFS)的论文。nutch很快便根据论文实现了NDFS,2004年google 发表了分布式计算框架MapReduce的论文,nutch的开发人员又完成了一个mapReduce 的开源实现,由于mapReduce 和NDFS不仅适用于收索领域,项目组把他移出了nutch,成立了hadoop。
hadoop HDFS
HDFS 是一个具有高度容错性的分布式文件系统,它能提供高吞吐量的数据访问,HDFS 的架构如图 2-4 所示,总体上采用了 master/slave 架构,主要由以下几个组件组成 :Client、 NameNode、 Secondary NameNode 和 DataNode。下面分别对这几个组件进行介绍。
(1)Client
Client(代表用户)通过与 NameNode 和 DataNode 交互访问 HDFS 中的文件。Client提供了一个类似 POSIX 的文件系统接口供用户调用。
(2)NameNode
整个 Hadoop 集群中只有一个 NameNode。它是整个系统的“总管” ,负责管理 HDFS的目录树和相关的文件元数据信息。这些信息是以“fsimage” (HDFS 元数据镜像文件)和 “editlog” (HDFS 文件改动日志)两个文件 形式存放在本地磁盘,当 HDFS 重启时重新构造出来的。此外,NameNode 还负责监控各个 DataNode 的健康状态,一旦发现某个DataNode 宕掉,则将该 DataNode 移出 HDFS 并重新备份其上面的数据。
(3)Secondary NameNode
Secondary NameNode 最重要的任务并不是为 NameNode 元数据进行热备份,而是定期合并 fsimage 和 edits 日志,并传输给 NameNode。这里需要注意的是,为了减小 NameNode压力,NameNode 自己并不会合并 fsimage 和 edits,并将文件存储到磁盘上,而是交由Secondary NameNode 完成。
(4)DataNode
一般而言,每个 Slave 节点上安装一个 DataNode,它负责实际的数据存储,并将数据信息定期汇报给 NameNode。DataNode 以固定大小的 block 为基本单位组织文件内容,默认情况下 block 大小为 64MB。当用户上传一个大的文件到 HDFS 上时,该文件会被切分成若干个 block,分别存储到不同的 DataNode ;同时,为了保证数据可靠,会将同一个 block以流水线方式写到若干个(默认是 3,该参数可配置)不同的 DataNode 上。这种文件切割后存储的过程是对用户透明的。
Hadoop MapReduce
hadoop mapReduce 的主要设计思想包括简化编程接口、高扩展性、提高系统容错性等,其对外提供了5个标准的可编程接口,InputFormat,Mapper,Partitioner,Reducer,OutputFormat。
一、mapReduce 编程实例
mapReduce 能解决的问题往往都有一个共同特征,这类问题能被分解成子任务并行执行,比如top(K) 问题,比如从海量日志中统计词频最高的词,由两个mapReduce完成,一个完成完成分词,一个完成统计。
二、架构设计
Hadoop MapReduce 架构也采用了 Master/Slave(M/S)架构,具体如图 2-5所示。它主要由以下几个组件组成 :Client、JobTracker、 TaskTracker 和 Task。下面分别对这几个组件进行介绍。
三、生命周期
Hadoop MapReduce处理的数据一般位于底层的分布式文件系统之中,该系统往往将文件分成若干的block存储在不同的节点上。默认情况下,每个task只处理一个block。MapReduce 主要由4个组件组成,分别是Client、JobTracker、Task、TaskTracker,一个MapReduce作业的运行周期是用户通过client将作业提交到jobTracker上,jobTracker会启动若干个task进行监控和调度,而task的运行环境准备和资源消耗情况则是由taskTracker负责,比如启动单独的jvm保障task运行资源的隔离性,而task的执行进度也是由task先汇报给taskTracker 再由taskTracker 通过RPC汇报给jobTracker的。TaskTracker 周期性地通过 Heartbeat 向 JobTracker 汇报本节点的资源使用情况,一旦出现空闲资源,JobTracker 会按照一定的策略选择一个合适的任务使用该空闲资源,这由任务调度器完成。任务调度器是一个可插拔的独立模块,且为双层架构,即首先选择作业,然后从该作业中选择任务,其中,选择任务时需要重点考虑数据本地性。此外,JobTracker 跟踪作业的整个运行过程,并为作业的成功运行提供全方位的保障。首先,TaskTracker 或者Task 失败时,转移计算任务 ;其次,当某个 Task 执行进度远落后于同一作业的其他 Task 时,为之启动一个相同 Task,并选取计算快的 Task 结果作为最终结果。