HBase是Google的BigTable的开源实现,BigTable文中对其描述如下:
A Bigtable is a sparse, distributed, persistent multidimensional sorted map. The map is indexed > by a row key, column key, and a timestamp.
所以说:
map是一组key, value对的集合, 一个key关联一个value. HBase也是一个map, 其在底层存储了大量key, value对的集合. map示例如下所示
{
"BIDU" : "百度",
"HK00700" : "腾讯",
"BABA" : "阿里巴巴",
}
多维map, 2维map即map的key和1维一样, 而value则又是一个map.
关系数据库的表, 可以理解为一个2维map, primary key和列共同决定1个value. 一个主键为股票代码, 同时有列name和列price的表, 可表示为如下所示的2维map.
股票代码 | name | price |
---|---|---|
BAIDU | 百度 | 198.44 |
HK00700 | 腾讯 | 144.10 |
BABA | 阿里巴巴 | 83.36 |
{
"BIDU" : {
"name" : "百度",
"price" : "198.44"
},
"HK00700" : {
"name" : "腾讯",
"price" : "144.10"
},
"BABA" : {
"name" : "阿里巴巴",
"price" : "83.36"
}
}
HBase的表则为3维map, 3个维度分别为
上面的表在HBase中可能是这样的
{
"BABA" : {
"info:name" : {
"20140919" : "阿里巴巴",
},
"price:USD" : {
"20150728" : "83.36",
"20150729" : "79.80"
}
},
"BIDU" : {
"info:name" : {
"20050805" : "百度"
},
"price:USD" : {
"20150728" : "198.44",
"20150729" : "165.36"
}
},
"HK00700" : {
"info:name" : {
"20040616" : "腾讯",
},
"price:HKD" : {
"20150728" : "141.00",
"20150729" : "144.10"
}
}
}
其中, cloumn为info:name表示, family为info, qualifier为name.
HBase的map, 其key由rowkey, column(family:qualifier), timestamp组成, value为用户存储的具体内容
HBase的map是按照key来排序的, 其将key转换为byte[], 然后顺序进行存储. 见上面的示例map.
如果某列没有内容, 那就可以不在map中存储, 不占用任何物理空间, 所以说HBase的表是稀疏的. 同时, 也可以为某个rowkey添加多个列, 而不影响其它行. 如下面这张表
{
"BABA" : {
"info:boss" : {
"20140919" : "马云",
},
"price:USD" : {
"20150728" : "83.36",
"20150729" : "79.80"
}
},
"BIDU" : {
"info:location" : {
"20050805" : "北京"
}
},
"HK00700" : {
"info:name" : {
"20040818" : "腾讯",
},
"price:HKD" : {
"20150729" : "144.10"
}
}
}
如果你以关系数据库的观念来看待这张表的话, 其是这样的
股票代码 | info:name | info:boss | info:location | price:USD | price: HKD |
---|---|---|---|---|---|
BABA | 1:2 | 马云 | 3:2 | 83.36 | |
BAIDU | 1:3 | 2:3 | 北京 | ||
HK00700 | 腾讯 | 2:4 | 3:4 | 144.10 |
HBase可以通过指定split key来将map切分多个region, 而不同region则可以分布在不同的机器上提供服务.
随着数据量的增加, 可以根据新的split key来将数据切分为更多的region, 同时添加更多的机器来服务这些region, 做到可扩展
HBase底层靠HDFS实现数据的持久化存储
HBase基本存储单元是column下的cell. 上面所示的map, 在HBase中存储为6个key,value对, 即6个cell
"BABA", "info:boss", "20140919" : "马云"
"BABA", "price:USD", "20150728" : "83.36"
"BABA", "price:USD", "20150729" : "79.80"
"BIDU", "info:location", "20050805" : "北京"
"HK00700", "info:name", "20040616" : "腾讯"
"HK00700", "price:HKD", "20150729" : "144.10"
综上所述, HBase的数据模型是一个稀疏的, 分布式的, 持久化的, 多维, 排序的map. 同时map靠row key, column key, 和时间戳来进行索引. 喜欢英文阅读的童鞋可参考英文博客: Understanding HBase and BigTable