一、Hbase中的每条记录的结构
Hbase的表组成:一个表可以理解成是行的集合,行(记录)是列族的集合,列族是列的集合。
(1) 列族column family:它是column的集合,在创建表的时候就指定,不能频繁修改。值得注意的是,列族的数量越少越好,因为过多的列族相互之间会影响,生产环境中的列族一般是一个到两个。
数据的持久化文件HFile中是按照Key-Value存储的,同一个列族的所有列存储在同一个底层存储文件里。Hbase的数据在HDFS中的路径结构如下:
hdfs://h201:8020/hbase/data/${名字空间}/${表名}/${区域名称}/${列族名称}/${文件名}
举例:/hbase/data/ns1/t1/a4d63a61a8da24a863bff3c8d7cd20de/f1/c2a7fa8c41304b9e9b8b24b4a89171ce
其中{区域名称}是t1的region, 由每张表切割形成,一张表由若干个region组成,不同的region分到不同的region server以便均衡负载
(2) 列column:和列族的限制数量不同,列族可以包含很多个列,前面说的“几十亿行*百万列”就是这个意思。
(3) 列的值value:存在单元格(cell)中。每一列的值允许有多个版本,由timestamp来区分不同版本。多个版本产生原因:向同一行下面的同一个列多次插入数据,每插入一次就有一个对应版本的value。
从以下示例中可以看出habse存储的数据格式
hbase(main):010:0>scan 'ns1:t1',{STARTROW => 'row1', LIMIT => 5}
ROW COLUMN+CELL
row10 column=f1:age,timestamp=1490608685532,value=\x00\x00\x00\x0A
row10 column=f1:id,timestamp=1490608685532,value=\x00\x00\x00\x0A
row10 column=f1:name,timestamp=1490608685532,value=tonykidkid10
row100 column=f1:age,timestamp=1490608685532,value=\x00\x00\x00\x00