hbase存储原理

来源:互联网 发布:java web角色权限设计 编辑:程序博客网 时间:2024/05/01 23:58


Hbase每个cell插入时都会写入时间戳(当前系统时间)来做版本标识,在读取时如果没有指定时间戳,默认取最新时间。Hbase默认保留3个版本数据。


HBase写入原理

1 客户端写入请求-->MemStore同时会写入Hlog,类似于Commit log,做数据恢复用

2 MemStore满足条件后刷入StoreFile

3 StoreFile满足条件后多个storeFile合并成一个大StoreFile

4 storeFile到一定大小后触发split,把当前region split成2个region,当前region下线,新region被HMater分配到HRegionServer上

图 1 一张表有2个列族,红色和黄色,每个列族有2个列,如果有多个版本同一位置会有多个块。

图2 同一个列族的数据会存储在一块

图3 r1:key值,cf1:列族的名字,c1:列名。t1:版本号,value值 

图4 从左到右数据筛选效率越来越底下,最好把重要筛选信息存储在rowkey,可以提交查询性能

 

HBase读数据原理

1 客户端请求到zookeeper,zookeeper根据先查询那台主机管理meta信息,把请求转发到该主机

2 hbase 查询-ROOT-和.META获取目标表对应的region,及region对应的regionServer地址,连接regionServer,查到数据

Meta表存储实际创建的表的region信息

因为meta数据特别多,也需要分region存储,所以root表就存储meta表的region信息。Zookeeper先读取zookeeper集群配置获取root表存储的regionServer地址。然后连接该地址访问root表获取目标业务表在meta中对应的region和地址,然后连接到该地址查询meta信息获取实际业务数据存储的region地址,然后连接该地址获取业务数据

Hbase认为root表不会特别大,所以没有分区,直接把root表存储的regionServer地址配置在zookeeper中。

 

 

 

hbase数据刷入物理表时会被顺序写入,在写入内存memstore时已经排序

Hbase客户端默认一次操作发送一次RPC请求到服务端,如果要使用缓冲区批量提交,可以设置自动刷新为false。Table.setAutoFlush(false);

void setWritaeBufferSize(long writeBufferSize) throws IOException可以设置缓冲区大小,默认为2M

也可以在Hbase-site.xml中设置hbase.client.write.buffer

 

 

0 0
原创粉丝点击