HBase基于Apache Hadoop的应用,是谷歌Bigtable的开源实现,运行在HDFS文件系统之上。尤其适合于存储海量数据。
关于Hbase的文献
HBase参照谷歌的论文 Bigtable: A distributed storage system for structured data,进行的开源实现。了解Bigtable就意味着了解了HBase,不过其中术语名称有了改变。
HBase官网的Apache HBase Reference Guide是HBase研发团队提供的最权威的HBase详细介绍,随着版本的不断更新,文档也是同步更新的。
HBase的基础知识
1. 表(table)
HBase数据访问和存储通过表进行。数据存储在数据表中,没有数据类型,全部作为字节处理。数据表中的数据存储在HDFS文件系统中。
2. 行(row)
行的唯一标示是rowkey,rowkey同样不具有数据类型,总是被当做byte数组对待。行按照rowkey的字典顺序排序,HBase分表时按照行进行负载。
A row must never exhibit so-called "time-travel" properties.
在HBase中提供的行操作具有原子性,不会产生数据的幻读。
3. 列族(column family)
其实列族是列的集合,一个列族包含有多个列(column qualifier)。在基本的列概念上,将一些列整合为列族。
列族影响着HBase中的物理存储,在表中每行数据,即使部分列族没有数据仍会具有相同的列族,这点与列不同。
4. 列(column qualifier)
列属于某一个列族中,不需要提前确定,在数据写入时可以动态增加,所以不同的行可以具有不同的列。这一个特点也是HBase适用于大数据存储的原因,因为不需要的字段在不写入的情况下不占用任何空间。
5. 单元(cell)
HBase中存储数据的最小单位。每个单元数据都具有一个写入时的时间戳,不同版本的值按照时间戳排序,这样最新版本的数据总可以先读到。单元中数据value被赋值之后,可以由rowkey,列族,列和时间戳查询。
6. 时间戳(timestamp)
每个cell写入时都会伴随一个时间戳的写入,也就是意味着一个cell中保存着不同版本的值(可以设定保留的版本个数),API获取是最新时间戳的值。
7. 三个主要的操作
Get:读取操作
Put:写入操作
Scan:表遍历操作
8. rowkey是写入行时确定的,与MySql数据库不同,不能通过指定哪个列为主键而改变rowkey。
9. key-value结构
在HBase的使用中,把数据看做key-value结构进行理解,例如:rowkey为key,则行数据为value;rowkey,列族,列为key,则cell的值为value。
10. rowkey的定义最重要
rowkey是查询行的唯一标识,负载时分配region又是以行为基础。rowkey的设计直接关系到region的热点情况,如果查询量大的rowkey集中在少数一个或几个region上,那么这些region就会成为热点,建议使用哈希值。另外rowkey组成的成分要有意义,这样可以指定区间scan出特定数据。
11. 原子性操作在row层面上,不存在多row的事务性操作
12. 列是动态添加的
13. 推荐使用较短的列族名
因为在读写HBase时,必定传输列族,过长的列族名会增大I/O开销
写在最后
就开发者而言,上面的13条足够应付平时工作。