参考 http://hbase.apache.org/book.html#_architecturecss
HBase是一种"NoSQL"数据库。“NoSQL”通常指的是非关系型数据库,咱们知道,关系型数据库支持SQL,也就是说HBase不支持SQL。非关系型数据库有许多种,BerkeleyDB是一种本地非关系型数据库,然而,HBase是分布式数据库。从技术上来说,HBase更像是“Data Store”,而不是“Data Base”,由于它缺乏许多关系型数据库的特性,好比:列类型、辅助索引、触发器、查询语言等等。(PS:意思是,从技术的角度讲,HBase更像一个数据存储,而不像数据库)html
HBase集群扩展经过增长RegionServer来实现。若是一个集群从10扩展到20个RegionServer,那么,不只仅是存储容量增长一倍,连处理能力也会增长一倍。对于关系型数据库而言,也能够用scale作到这样,可是须要指出的是,这须要特别的硬件和存储设备。HBase特性以下:web
并非全部的问题都适合用HBasesql
第1、确保你有足够的数据。若是你有数以亿计的数据行,那么HBase是一个不错的选择。若是你只有数千或者百万的数据,那么使用传统的关系型数据库可能更好,由于事实上你的这些数据可能只须要一个或者两个节点就能处理得完,这样的话集群中的其它的节点就处于空闲状态。数据库
第2、确保你不须要用到关系型数据库的特性(好比:固定类型的列、辅助索引、事务、查询语言等等)。基于关系型数据库构建的应用不能经过简单的改变JDBC驱动来传输到HBase中。从RDBMS到HBase是彻底相反的两套设计。apache
第3、确保你有足够的硬件。由于当DataNode数量小于5的时候HDFS将不能正常工做了。编程
HDFS是一个分布式的文件系统,适合存储大文件,但它不能提供快速的个性化的在文件中查找。HBase是构建于HDFS基础之上的,而且它支持对大表的中的记录进行快速查找和更新。HBase内部将数据存放在HDFS中被索引的“StoreFiles”上以供快速查找。api
HMaster是Master Server的一个实现。Master Server负责监视集群中全部的RegionServer实例,而且它也是全部元数据改变的一个对外接口。在分布式集群中,典型的Master运行在NameNode那台机器上。缓存
HMasterInterface接口是操做元数据的主要接口,提供如下操做:app
HRegionServer是RegionServer的实现,它负责服务并管理regions。在分布式集群中,一个RegionServer一般运行在一个DataNode上。
HRegionRegionInterface既包含数据的操做也包含region维护的操做
region server处理写请求,它们被累积在内存中一个叫memstore的地方。一旦memstore文件满了,内容将被写到磁盘上做为store file。这个事件叫作memstore flush。随着store file的不断累积,RegionServer将合并它们成大文件,以减小store file的数量。在每次刷新或者合并之后,region中数据的数量会发生改变。RegionServer根据切分策略来查看是否region太大了或者应该被切分。
逻辑上,region切分的操做很简单。找一个合适的位置,将region中的数据切分红两个新的region。然而,这个处理的过程并不简单。当切分发生的时候,数据并非马上被重写到这个心建立的女儿region上。
在HBase中,数据被存储在表中,有行和列。这些术语和关系型数据有一些重叠,固然这不是一个很好的类比,可是它对咱们思考HBase的表示一个多维的map颇有帮助。
Table
由多行组成
Row
HBase中的行由一个row key和一个或多个列组成。Rows在存储的时候按照row key的字典序存储。正由于如此,row key的设计就显得很是重要。基于这一点,相关连的行相互之间存在附近。一般,row key是一个网站的域名。若是你的row key是域名,你应该以倒置的方式存储它们(好比:org.apache.www,org.apache.mail,org.apache.jira等等)。这样的话,全部的apache域名在表中是相近的位置,而不是被子域名的第一部分分开。
Column
HBase中的列由一个列簇和一个列修饰符组成,它们之间用冒号分隔(:)
Column Family
列簇由一系列的列和它们的值组成,这是基于性能考虑的。每个列簇都有一系列的存储属性,好比:是否它们的值应该被缓存到内存中,它们的数据怎样被压缩,它们的row key怎样被编码,等等。表中的每一行都有相同的列簇,即便一个给定的行在给定的列簇上没有存储任何数据。
Column Qualifier
一个列修饰符被添加到列簇中为了给指定的数据片断提供索引。假设,给定的列簇是content,那么,一个列修饰符多是content:html,其它的还有多是content:pdf。虽然,列簇在表建立的时候就固定了,可是列修饰符是不肯定的,并且不一样的行可能有不通的列修饰符。
Cell
Timestamp
一个timestamp被写在每一个value的旁边,它是一个value的版本修饰符。默认的,timestamp表明数据被RegionServer写入的时间,你也能够在写数据的时候指定一个不一样的timestamp值
在这个例子中,有一个表叫“webtable”,它包含两行数据(com.cnn.www和com.example.www)和三个列簇(contents,anchor,people)。对于第一行(com.cnn.www),anchor包含两列(anchor:cssnsi.com,anchor:my.look.ca),contents包含一列(contents:html)。row key为“com.cnn.www”的行有5个版本,而row key为“com.example.www”的行有1个版本。contents:html列包含整个网站的HTML。
在这个表格中的空的单元格并不占用空间
下图是一个模拟,目的在于解释说明上面咱们所说的,便于咱们理解:
虽然,在概念上,表看起来像是一行一行的,但物理上,它们是按照列簇被存储的。一个新的列修饰符能够在任意时刻被添加到列簇中。
在前面的概念视图中的空的单元格是不被存储的。所以,请求contents:html列而且timestamp为t8将返回没有值。然而,若是不指定timestamp,那么某个列的大部分值都会被返回。若是指定多个版本,只有找到的第一个会被返回,由于数据是按照timestamp降序存储的。
一个命名空间是表的一个逻辑分组
行按照row key字典升序存储
Columns in Apache HBase are grouped into column families.
列簇中全部的列成员都有相同的前缀。例如,列courses:history和courses:math都是courses这个列簇的成员。用冒号分隔列簇和列修饰符。列簇前缀必须由能够打印输出的字符组成。列修饰符能够由任意字节组成。列簇必须在表被定义的时候就声明好,所以列就不须要在表建立的时候定义了,而且能够随时新增。
物理上,全部的列簇成员被存储在一块儿。
A {row, column, version} tuple exactly specifies a cell
in HBase.
数据模型有4个主要操做,分别是Get、Put、Scan和Delete。这些操做是应用在表上的。
返回指定行的属性
添加新的行到表中,或者更新已经存在的行
扫描特定属性的多行
从表中删除一行
在HBase中,{row,column,version}能够肯定一个单元格。当行和列被压缩成字节的时候,版本用long类型指定。在HBase中,版本以降序存储,因此,最近的值老是最早被发现。
对于全部的数据模型操做,HBase以数据被存储时的顺序返回。首先按行排序,其次按列簇,再其次按列修饰符,最后是timestamp。(PS:前是三个是字典升序,最后一个timestamp是降序)
不存储列的元数据,所以,HBase能够支持每一行有许多列,行与行之间能够有多种不一样的列。
HBase不直接join操做,至少不支持关系型数据库那种join。在HBase中,读取数据经过Get和Scan。
HBase能够做为MapReduce做业的数据源。对于读写HBase的MapReduce做业,建议使用TableMapper和TableReducer。
若是你运行HBase做为数据源的MapReduce做业,你须要在配置文件中指定表和列名。
当你从HBase读取数据的时候,TableInputFormat请求regions的列表而且做为一个map。