Hadoop是Apache开源软件基金会的一个项目的总称,它包含了HDFS,MapReduce,Hive,Hbase,Pig等组件,它是基于Googel GFS和MapReduce的论文发展起来的开源软件项目,而HDFS和Hadoop MapReduce是它的核心。

  HDFS是一个开源的分布式文件系统,和单机文件系统一样,它也使用目录树结构,和单机文件系统不同的是,它的文件系统是跨越整个Hadoop集群的,下图是它的架构


  HDFS集群是主从架构,它由一台Namenode节点(Master)和多台Datanode节点(Slaver)构成。Namenode节点和Datanode节点都是标准的x86。Datanode节点采用DAS存储的方式,即x86内置多块大容量硬盘,Datanode节点可以多达上千台。

  HDFS通常用于存储大文件,在HDFS中每个文件都被切割为固定大小的数据块,然后被分散存放于多台Datanode的硬盘上。并且每个数据块都会有副本存放于远端机架的Datanode上,副本数一般设置为三个。Namenode节点不存放实际的文件,而只存放整个文件系统的目录树等元数据。当客户端需要访问存储于HDFS的某个文件时,首先需要访问Namenode节点,以取得文件存放的位置信息(哪几台Datanode,以及在Datanode硬盘上的具体地址),然后根据这些目的地址对各Datanode上存放的数据并行地进行访问。

  HDFS的这种分布式存储架构,主要有几个好处:1、当存储空间不够时,只要简单增加Datanode节点,而系统自动会把数据块分配到新Datanode节点上,而无需人工干预。从而使得Hadoop集群存储的扩展性非常好。2、当客户访问某一文件时,由于该文件存放于多台设备上,因此是由多台Datanode并行处理的,这样大大增加了整个系统的吞吐量。3、HDFS的数据都有多个副本,HDFS 系统在后台自动检测数据的一致性,并能在发生错误时,自动恢复数据,因此系统有很好的可用性。4、由于Hadoop中硬盘是顺序读写的,因此读写硬盘的性能很好。

  但是需要注意的是:Namenode节点为了加快对客户端的响应速度,是把文件目录树等元数据缓存于主内存中的,因此整个文件系统的容量受限于Namenode节点的内存大小,所以说理论上Hadoop集群的扩展性也并非无限的,但相对于传统存储系统,Hadoop的容量已经很大了,据说目前Facebook已经有容量超过100PB的HDFS集群。

  Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。

  一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

  通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。

  Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。

  这张是Hadoop的MapReduce任务调度图:


  这张是MapReduce的工作机制图


  MapReduce简单的理解,就是Master节点(Jobtracker)把客户端提交的任务,分割成很多个小任务,然后交给各Datanode节点(TaskTracker)并行执行Map,Reduce计算,最终提交给客户一个完整的结果。

  我认为MapReduce有几个非常重要的的特点:1多节点并行计算,2大量需要计算的数据在本地,只有计算产生的中间结果或结果才在网络里传输,大大减少了网络流量。

  最后再简单介绍下Hadoop HBase和Hive。

  HBase是构架于HDFS之上的面向列的实时分布式数据库(非关系型),HBase 的设计目的之一是支持高并发用户数的高速读写访问。这是通过两方面来实现的。首先数据行被水平切分并分布到多台服务器上,在大量用户访问时,访问请求也被分散到了不同的服务器上,虽然每个服务器的服务能力有限,但是数千台服务器汇总后可以提供极高性能的访问能力。其次,HBase 设计了高效的缓存机制,有效提高了访问的命中率,提高了访问性能。

  Hive 是一种建立在Hadoop 之上的数据仓库架构。它提供了:

  • 一套方便的实施数据抽取(ETL)的工具。

  • 一种让用户对数据描述其结构的机制。

  • 支持用户对存储在Hadoop 中的海量数据进行查询和分析的能力。

  Hive 的基本特点是它采用HDFS 进行数据存储并利用MapReduce 框架进行数据操作。所以从本质上来说,Hive 就是个编译器,它把用户的操作(查询或者ETL)变换成MapReduce任务,利用MapReduce 框架执行这些任务以对HDFS 上的海量数据进行处理。

  Hive 定义了一种简单的类SQL 查询语言HiveQL,让熟悉SQL 的用户可以非常容易的进行查询。与此同时,HiveQL 也允许熟悉MapReduce 框架的程序员在查询中插入自定义的mapper和reducer 脚本以扩展Hive 内嵌的功能,完成更复杂的分析。