Hbase集群架构
组件
client
- API:对外提供访问的API
- 加速cache:存储从regionServer返回的信息,不过容量较小,由参数hbase.client.write.buffer控制
HMaster
- 负责分散读访问到不同的RegionServer
- Balancer:负责将数据分散到不同的RegionServer上
- 失效的RegionServer摘除
- 提供用户的基础操作(get/put/delete/scan/update/create/drop等)
RegionServer
- 处理Region的I/O请求
- 切分/合并Region
RegionServer的结构:
zookeeper
- 选举新的HMaster
- 存储Region寻址信息
- RegionServer心跳检测,上下线注册通知Hmaster
- 存储元数据
Table结构
按照如下语句建表,写入数据
create 'sohu',{NAME => 'staffInfo', VERSIONS => 2, TTL=>'15552000'},{NAME => 'carInfo', VERSIONS => 2, TTL=>'15552000'} put 'sohu','rowkey001','staffInfo:name','wyett' put 'sohu','rowkey001','staffInfo:age','20' put 'sohu','rowkey001','carInfo:licence','京B8888' put 'sohu','rowkey001','carInfo:brand','Porsche' hbase(main):003:0> get 'sohu','rowkey001', 'staffInfo', 'carInfo' COLUMN CELL carInfo:brand timestamp=1497862298400, value=Porsche carInfo:licence timestamp=1497862288122, value=xE4xBAxACB8888 staffInfo:age timestamp=1497862280230, value=20 staffInfo:name timestamp=1497862195491, value=wyett
rowkey为rowkey001的行数据,来解释表结构
- rowkey:主键,唯一标识数据行
- columnfamily:列簇,列的集合。有两个columnfamily,staffInfo和carInfo
- column:列。第一行数据有4个列名。
- version 和timestamp:保留的版本数,在建表时指定,当前表version为2,和timestamp共同决定版本保留
- value:键值
HTable中,只有一种存储类型,byte[]。
写
- client咨询master,确定写入的regionServer节点;
- client将数据写入regionServer的Region(一次只能操作一个region,至少在hbase shell看是这样)
- 数据写入HLog,相当于关系型数据库的redo Log,结构暂不清楚,待补充;
- 同时,数据写入某个Store,先写入memStore,当memStore写满时,将数据写入新的region,原region进入落盘队列 Flush List。
- 有一个进程监控落盘队列,并记录已经进行持久化的memStore的信息,记录在zookeeper中
- memStore进行持久化时,会写入一个大的Store中,当写入达到某个阈值时,会触发合并,这个过程就是major compact,这个过程将多条版本的数据进行合并,根据version,timestamp保留需要的数据。
- 当新生成的StoreFile达到阈值(上水位线),会触发StoreFile进行split。
- 然后会将Store的信息返回给Hmaster,并记录进zookeeper