http://blog.chinaunix.net/uid/16979052.html
全部博文(286)
分类: HADOOP
2013-03-19 09:39:34
Hadoop是Apache开源组织的一个分布式计算开源框架,基于 Hadoop可以轻松地编写可处理海量数据的分布式并行程序,并将其运行于由成百上千个结点组成的大规模计算机集群上。Hadoop 由Doug Cutting(道格·卡廷)在2004年开始开发并于2005年秋天作为Nutch的一部分被正式引入到Apache。Hadoop由HDFS、MapReduce、HBase、Hive和ZooKeeper等成员组成。其中,HDFS 和MapReduce 是两个最基础最重要的成员。Hadoop子项目的组成如下图所示:
图 7-1 Hadoop子项目组成图
Core
一系列分布式文件系统和通用I/O的组件和接口(序列化、Java RPC和持久化数据结构),2009年7月core被更名为common。
Avro
一种提供高效、跨语言RPC的数据序列系统,持久化数据存储。(在本书写作期间,Avro只是被当作一个新的子项目创建,而且尚未有其他Hadoop子项目在使用它。)
MapReduce
分布式数据处理模式和执行环境,运行于大型商用机集群。
HDFS
分布式文件系统,运行于大型商用机集群。
Pig
一种数据流语言和运行环境,用以检索非常大的数据集。Pig运行在MapReduce和HDFS的集群上。
Hbase
一个分布式的、列存储数据库。HBase使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询(随机读取)。
ZooKeeper
一个分布式的、高可用性的协调服务。ZooKeeper提供分布式锁之类的基本服务用于构建分布式应用。
Hive
分布式数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言(由运行时引擎翻译成MapReduce作业)用以查询数据。
Chukwa
分布式数据收集和分析系统。Chukwa运行HDFS中存储数据的收集器,它使用MapReduce来生成报告。
MapReduce是一种用于数据处理的编程模型,适合于大规模数据(TB 级)的计算。Map 和Reduce 是它的主要思想,来源于函数式编程语言,它的原理如下图所示:
Map 负责将数据打散,Reduce负责对数据进行聚集,用户只需要实map 和reduce 两个接口,即可完成TB 级数据的计算,常见的应用包括:日志分析和数据挖掘等数据分析应用。另外,还可用于科学数据计算,如圆周率PI 的计算等。Hadoop MapReduce 的实现也采用了Master/Slave 结构。Master 叫做JobTracker,而Slave 叫做TaskTracker。用户提交的计算叫做Job,每一个Job 会被划分成若干个Tasks。JobTracker负责Job 和Tasks 的调度,而TaskTracker负责执行Tasks。
HDFS 是Google GFS 的开源版本,一个高度容错的分布式文件系统,它能够提供高吞
吐量的数据访问,适合存储海量(PB 级)的大文件(通常超过64M),其原理如下图所示:
HDFS采用Master/Slave 结构。NameNode 维护集群内的元数据,对外提供创建、打开、删除和重命名文件或目录的功能。DataNode 存储数据,并提负责处理数据的读写请求。ataNode定期向NameNode 上报心跳,NameNode 通过响应心跳来控制DataNode。
HBase是一个开源的、分布式的、面向列的存储系统,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Googl文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。
数据模型
Hbase是一个类似Bigtable的分布式数据库,大部分特性和Bigtable一样,是一个稀疏的,长期存储的{存在硬盘上},多维度的,排序的映射表。这张表的索引是行关键字,列关键字和时间戳。每个值是一个不解释的字符数组,数据都是字符串,没类型。
用户在表格中存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储的,所以同一张表里面的每一行数据都可以有截然不同的列。
列名字的格式是"
Hbase把同一个family里面的数据存储在同一个目录底下,而Hbase的写操作是锁行的,每一行都是一个原子元素,都可以加锁。
所有数据库的更新都有一个时间戳标记,每个更新都是一个新的版本,而hbase会保留一定数量的版本,这个值是可以设定的。客户端可以选择获取距离某个时间最近的版本,或者一次获取所有版本。
概念视图:
一个表可以想象成一个大的映射关系,通过主键,或者主键+时间戳,可以定位一行数据,由于是稀疏数据,所以某些列可以是空白的,下面就是数据的概念视图:
Row Key |
Time Stamp |
Column "contents:" |
Column "anchor:" |
Column "mime:" |
|
"com.cnn.www" |
t9 |
|
"anchor:cnnsi.com" |
"CNN" |
|
t8 |
|
"anchor:my.look.ca" |
"CNN.com" |
|
|
t6 |
"..." |
|
|
"text/html" |
|
t5 |
"..." |
|
|
|
|
t3 |
"..." |
|
|
|
上图是一个存储Web网页的范例列表片断。行名是一个反向URL{即com.cnn.www}。contents列族{原文用 family,译为族,详见列族}存放网页内容,anchor列族存放引用该网页的锚链接文本。CNN的主页被Sports Illustrater{即所谓SI,CNN的王牌体育节目}和MY-look的主页引用,因此该行包含了名叫“anchor:cnnsi.com”和 “anchhor:my.look.ca”的列。每个锚链接只有一个版本{由时间戳标识,如t9,t8};而contents列则有三个版本,分别由时间 戳t3,t5,和t6标识。
物理视图
虽然从概念视图来看每个表格是由很多行组成,但是在物理存储上面,它是按照列来保存的,这点在数据设计和程序开发的时候必须牢记。
上面的概念视图在物理存储的时候应该表现成下面那样子:
Row Key |
Time Stamp |
Column "contents:" |
"com.cnn.www" |
t6 |
"..." |
t5 |
"..." |
|
t3 |
"..." |
Row Key |
Time Stamp |
Column "anchor:" |
|
"com.cnn.www" |
t9 |
"anchor:cnnsi.com" |
"CNN" |
t8 |
"anchor:my.look.ca" |
"CNN.com" |
Row Key |
Time Stamp |
Column "mime:" |
"com.cnn.www" |
t6 |
"text/html" |
需要注意的是在概念视图上面有些列是空白的,这样的列实际上并不会被存储,当请求这些空白的单元格的时候,会返回null值。
如果在查询的时候不提供时间戳,那么会返回距离现在最近的那一个版本的数据。因为在存储的时候,数据会按照时间戳排序。