泥土巢 - 数据库之HBase
https://www.nituchao.com/category/hbase/
HBase数据库的技术积累
-
HBase 数据模型
https://www.nituchao.com/hbase/hbase-data-model.html
2018-05-23T13:13:00+08:00
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.所以说:1, HBase的数据模型是一个稀疏的,分布式的,持久化的,多维的,排序的map。2, map靠row key, column key和时间戳来进行索引。mapmap是一组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.股票代码namepriceBAIDU百度198.44HK00700腾讯144.10BABA阿里巴巴83.36{
"BIDU" : {
"name" : "百度",
"price" : "198.44"
},
"HK00700" : {
"name" : "腾讯",
"price" : "144.10"
},
"BABA" : {
"name" : "阿里巴巴",
"price" : "83.36"
}
}HBase的表则为3维map, 3个维度分别为rowkey : 主键column : 由family:qualifier两部分组成, family为列族,可理解为一组列的逻辑组合,列族+qualifier来确定唯一的列timestamp : 数据写入的时间戳上面的表在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:nameinfo:bossinfo:locationprice:USDprice: HKDBABA1:2马云3:283.36 BAIDU1:32:3北京 HK00700腾讯2:43: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