HBase底层原理

一: 组件介绍
1.client客户端
包含访问hbase的接口,client维护者一些cache来加快hbase的访问,比如region的位置信息

2.zookeeper
保证任何时候集群中只有一个hmaster工作(维持高可用)
存储所有region的寻址入口
实时监控region server 的状态,将region server 的上下线的信息实时通知到master
存储hbase的scheme,包括有哪些table,每个table中有哪些列族等

3.master
为region server分配region
负责region server的负载均衡
发现失效的region server并重新分配其上的region给其他节点管理
hdfs上的垃圾文件回收
处理scheme更新请求

4.rowkey
rowkey主要用来检索记录的主键
通过单个rowkey或者rowkey的范围可以访问数据表中的行数据
hbase对表中的数据按照rowkey的字典顺序进行排序

5.cloumn family列族
hbase中的每个列都归属于其中某个列族
列族只是scheme中的一部分,需要在创建表的时候指定
访问控制、磁盘和内存的使用统计都是在列族层面进行的。
列族越多,在取一行数据时所要参与IO、搜寻的文件就越多,所以,如果没有必要,不要设置太多的列族

6.时间戳
64位整型,记录当前的时间毫秒值
由hbase在写入数据的时候自动写入
当然也可以自定义时间戳用来区分同一时间写入的不同数据

7.cell
hbase中通过row和column确定的存储单元为一个cell
每个cell中包含的信息有 : rowkey , family , row , timestamp , version
cell中的数据都是字节数组格式
每个cell中保存者同一份数据的多个版本,每个版本按照时间倒序排序,最新的数据排在前面

二:hbase的读写过程
1、读请求过程:HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。
接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,从而读取到Meta,进而获取到Meta表中存放的元数据。
Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Memstore和Storefile来查询数据。
最后HRegionServer把查询到的数据响应给Client。

2、写请求过程:
Client也是先访问zookeeper,找到Meta表,并获取Meta表元数据。
确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。
Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。
Client先把数据写入到HLog,以防止数据丢失。
然后将数据写入到Memstore。
如果HLog和Memstore均写入成功,则这条数据写入成功
如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。
当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的HFile。
当HFile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二

细节描述:
hbase使用MemStore和StoreFile存储对表的更新。
数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并 且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。
当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。
StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(minor_compact, major_compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile。
由于对表的更新是不断追加的,compact时,需要访问Store中全部的 StoreFile和MemStore,将他们按row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。

HBase底层原理_第1张图片

你可能感兴趣的:(HBase,hbase底层原理)