2.2 Hadoop的诞生
在2004年,顺着谷歌论文的思路,Doug Cutting用Java语言“克隆”了一套开源分布式文件系统,取名为Hadoop。
在2006年1月,Doug Cutting加入雅虎公司,而雅虎公司为他提供了一个专门的团队和资源将Hadoop发展成一个可在网络上正式运行的完善系统。在2006年2月,Apache Hadoop项目正式启动。
发展到现在,Hadoop已经成为Apache基金会的一个顶级开源项目。Apache基金会是一个以支持开源软件为目的的组织,它的官方网址是http://www.apache.org/。在第3章中我们介绍的所有项目几乎都是Apache基金会的子项目。
HDFS、HBase和MapReduce是Hadoop的三个核心组件,分别来源于Google公司的GFS文件系统、MapReduce和BigTable。
2.2.1 从GFS到HDFS
HDFS(Hadoop File System)是Hadoop系统中的底层文件系统,就像文件系统是操作系统的核心部件一样, HDFS也是Hadoop系统上最核心的部件。和传统的文件系统不同,HDFS的目的不是让你对文件进行随意的操作,而是“一次写入,无数次读取”。
基于这个思想,HDFS和普通的文件系统相比,其差异如下。
(1)文件量相对不大,不过单文件会比较大(平均文件大小在500MB以上)。
(2)文件中间的内容不可以被篡改,只能添加在尾部。
(3)只能对文件进行创建、删除、重命名、修改属性以及在尾部添加等操作。
在HDFS上有两个基本概念:
(1)Block,数据块;
(2)Replication Factor,复制因子。
HDFS上的所有文件都被切成block,该词在原来的Google系统中被称为Chunk,指的是“数据块”。
在HDFS上,复制因子的数值表示Hadoop系统中每个block会有的备份数字。复制因子越大,每个数据块在系统中的备份的数量越大,因而也会相对越安全;不过,复制因子越大,系统的冗余度也就越大,资源的浪费也会相对比较大。
2.2.2 Hadoop的基础计算框架MapReduce
简单来说,MapReduce改变了以往把数据集中在一起的计算方式,而是把计算作为一项任务推送到存放的数据之上。MapReduce框架运用了计算机算法中最常用的一个概念Divide and Conquer(分而治之),也就是把一个大的问题切割成多个小问题,处理完成之后,再把答案汇总到一起。
MapReduce框架的应用有一个前提,就是所有的数据节点之间有高速的网络连接。在MapReduce框架中,我们尽量把数据存储在计算节点上,这样访问本地数据会快很多。而就近存储数据,或者说数据本地化(data locality)也是MapReduce框架的一大特性。
对于Map和Reduce这两个步骤来说:
(1)Map(映射)所做的就是把一个问题域中所有的数据在一个或多个节点中转化成Key-value(键-值)对,然后对这些Key-value对进行Map操作,生成零个或多个新的Key-Value对,最后按Key值排序,同样的Key值被排到一起,合并生成一个新的Key-value列表。
(2)Reduce(简化)做的是收集工作,把Map步骤中生成的新的Key-value列表按照Key值放到一个或多个子节点中用编写的Reduce操作处理,归并后合成一个列表,得到最终的输出结果。
换成公式的话,MapReduce可以这样表示:
Map(k1, v1) → list(k2, v2) Reduce(k2, list (v2))→list(v3)
输入的是(k1, v1)代表的Key-value对列表,而输出的是v3列表。
图2-4是MapReduce的功能示意图。
图2-4 MapReduce示意
MapReduce的步骤如下。
(1)Map,工作节点对本地的数据应用map()函数(程序)。
(2)Shuffle,根据map()的结果重新分配数据组。
(3)Reduce,所有节点同时处理所有的数据组。
下面我们再看图2-5,展示的数据主要分为三类,用1、2、3来标注。通过Map和Shuffle阶段,各个类别的数据被分别处理,然后再合并。
图2-5 Map、Shuffle、Reduce示意
在图2-5中,Hadoop会把MapReduce的输入数据划分成同等长度的小数据块,称作split(输入分片)。
Shuffle的英文含义是洗牌,而在MapReduce过程中Shuffle指的是把数据从Map的输出导入到负责Reduce的程序的过程。
2.2.3 从BigTable到HBase
在Hadoop系统的框架中,HBase是一个核心组件,它是Hadoop可以快速实时访问超大规模数据集的关键应用。
在2.1节中我们介绍过Google的BigTable,而HBase其实就是BigTable在Hadoop系统上的一个实现版本。
借鉴Google对BigTable的定义,HBase会有下面这些特点。
(1)永久保存的(Persistent)。就这点来说,HBase和其他数据库系统没有什么区别。
(2)分布式的(Distributed)。HBase的实现接住了HDFS,也就是说所有的数据是分开存储在不同的数据节点上的。
(3)稀疏的(Sparse)。比如说对应于某一个顾客可能有120个数据点,不过系统中大部分的顾客数据只有其中的一小部分,大部分的字段是空白或者缺失的。
(4)多维度排序的匹配图(multidimensional sorted map)。HBase其实就是一个key-value的集合,整个集合是基于key排序的,而每一个value可能有不同的数值,且每一个value都有不同的时间戳与其对应。