HBase 数据模型

liang @ 2018年05月23日

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和时间戳来进行索引。

map

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.

股票代码nameprice
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个维度分别为

  • 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: HKD
BABA1: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