在hbase中,数据被存储在行列构成的表中,这听起来像是传统的RDBMS,但实际上,用传统RDBMS来类比hbase的数据模型没有啥意思。不如把hbase的data model想象成多维map。
hbase术语
- table:一个表包含很多行,String
- row :always byte array
一个row包含一个rowkey 和至少一个column
row 按照rowkey的字典序排列,这也是为什么rowkey的设计很重要的原因。
- column
一个column包含一个column family 和一个column 标识,中间用:分隔
- Column Family
一个column family 是一系列的列和值
为了性能,有些时候要指定column family一些属性
- Column Qualifier
column family是在表创建的时候定下的, 一般不更改。
column qualifier没有确定下来,可以更改。
- Cell
一个cell是row, column family, and column qualifier的结合, contains a value and a timestamp(cells verison\)
- Timestamp
默认是数据写入region的时间,可以在写数据是指定不同的时间戳
Conceptual View
how Apache HBase stores data
region
Table (HBase table)
Region (Regions for the table)
Store (Store per ColumnFamily for each Region for the table)
MemStore (MemStore for each Store for each Region for the table)
StoreFile (StoreFiles for each Store for each Region for the table)
Block (Blocks within a StoreFile within a Store for each Region for the table)
what HBase files look like when written to HDFS
1. 为啥region的个数少比较好?
```
hbase被设计去偏好于更小的region number(20-200)相比于更大的size(5-20G)在每个regionsever上
1. MSLAB (MemStore-local allocation buffer),每一个region的一个family需要一个MSLAB,当含有两个family的1000个region
存在时,就占用了3.9G的堆内存。就算region里面还没有存值。
2. 还记得hbase.hregion.percolumnfamilyflush.size.lower.bound这个配置么,那么假
设所有的region(同时假设每个region都有一个family),那么触发刷新的时候,找不到
比这个值大的family,只有所有的都刷新。
3. master讨厌大量的region,并且他会花费很长时间去assign和move。这样就引起zk的使用压力,++同时没有玩全的异步++
4. 老版本里,会造成索引巨多,creating memory pressure or OOME on the RSs
```
8. version
- row 和 column被bytes表示,version使用long integer
- version降序排列
- 当多个有相同版本的数据同时写入到cell中时,只有最后一个可以被获取
- 使用非增长的数来表示version是可行的(啥意思?)
- 0.96以前是表的version存活数默认是3,后面的版本是1
- 列族的version默认是0,means关闭这个feature
9. column metadata
- 获得一个column family的所有的comumn的唯一方法就是遍历所有的row