本章重点介绍hadoop本身的架构,包括分布式数据存储系统HDFS和计算框架mapreduce。
2.1. Hadoop背景介绍
Hadoop的架构灵感来源于谷歌工程师Jeff Dean和Sanjay Ghemawat开发并发布的GFS(谷歌文件系统)和GMR(谷歌mapreduce),前者是一个高容错的分布式文件系统,后者是一个适用于大规模并行处理的计算框架。Apache Hadoop的HDFS和MapReduce有着和前者类似的功能,是前者的开源实现。借助开源社区的力量,目前hadoop正在不断进化并补充新鲜血液,随着其周边环境(HBase, Hive, Pig,Sqoop,ZooKeeper等)的日志壮大,一个完整的生态系统已经形成,触及了大数据处理的方方面面。
2.2. HDFS
HDFS被设计为运行在普通低配置硬件上的分布式文件系统。HDFS的特点在于假设存储数据的硬件设备是不可靠的,也假设存储的数据量非常大,硬件设备会随时动态扩展,基于以上假设,HDFS提出了以下几个重要特性(实际上是从GFS借鉴而来):
- 第一个是文件块的概念,数据存储时会被切分成大小固定的数据块,并以pipes方式被并行复制为相同的三份,从而降低集群丢块的现象。
- 第二个是主从架构,NameNode节点存放着集群里所有块的元信息,包括块大小和被存放的节点位置,DataNode节点存储具体的块数据。NameNode作为所有DataNode的管理者,负责为所有数据块指定存放的DataNode, 并通过心跳连接实时监控所有的DataNode,若有写入失败,则动态切换DataNode。
- 此外,HDFS具有其它优秀的特性,比如机架感知和一致性模型。机架感知特性允许用户自定义脚本,为不同的ip指定从0开始的距离标示,HDFS将客户端所在节点当做本地节点,先在本地复制一份数据块,之后通过检测DataNode所属的ip地址从近到远的优先级分配剩余副本;一致性模型要求存储在集群的海量数据符合"一次写入,多次读取"这样就保证集群可以承受数据的高吞吐量。
2.3. MapReduce
MapReduce是一个分布式变成框架,有适用范围,但其最大的好处在于能够对海量数据做并行计算。大数据处理的难点并不是编程复杂,而在于数据量太大,就一个简单的文件排序而言,若数据量多大TB,无论多高配置的服务器,都无法满足其对内存的需求,而使用hadoop的mapreduce计算框架,若计算节点足够多,对文件按key进行适当的分割,则可以轻松地在几分钟之内完成。
Hadoop的MapReduce框架实现的核心概念在于倒排索引。mapper端将输入的键值对做处理并以用户自定义键值对输出,数据输入reducer端前会对键值对进行排序和合并,key相同的多个键值对会被合并为一个,key对应一个tupple,内含所有该key对应的value,类似如下过程:(mapper输出3个键值对)-><k1,v1>, <k1,v2>, <k1, v2> ->(mr框架自动处理后)<k1, <v1,v2,v3>>(reducer输入1个键值对)。