Hbase架构图
Hbase写操作
执行put命令,put 'namspace:table','rowkey','clonmu','value'
1.客户端首先访问zookeeper,获取存储元数据meta表所在的ReginServer地址.
2.客户端去访问该rs上的元数据,获取存储表的region分区所在的ReginServer地址.
3.客户端到对应rs从节点,将数据存储到该节点,先存在memstore内
对于client 来说,只需要将数据写入到memstore中就可以了,这也是Hbase快的原因
4.habse 会先将对数据的读写等操作记录到wal日志当中,然后才将数据写入进memstore中,(此时操作写入日志和数据写入memstore是事务性操作,要成功都成功,如果有一个失败,就会回滚)
wal日志的目的就是为了数据安全
5.存在内存当中的memstore,会被手动或者自动fulsh到HDFS当中,叫做Hfrie
6.fulsh后的hfire都是小文件,需要经过Minor Compaction:小合并,简单的将多个文件合成一个hfire,然后经过 Major Compaction 大合并将所有的文件合成一个文件,合并过程会清理过期,和删除的数据,消耗大量资源
7.当一个region内的数据量特别大的时候,如果在存入数据就会发生 split分裂,分裂成两个region
Hbase读数据流程
1.客户端访问zk集群,获取存储meta table所在的region server地址
2.将meta table的内容缓存到本地,并设置有效期. 当第二次查询时,直接从本地读取meta table
3.客户端到对应的rs上访问元数据,根据表名获取对应的region,根据每个region分区的rowkey范围 和rowley,获取要操作的 rs地址信息
4.到对应rs上,读取memstore的数据,
5.如果memstore上没有,就去BlockCache上读取,如果blockcache也没有就去storefire上读取,读取后将其缓存到BlockCache
6.如果一直缓存会导致 BlockCache会越来越大,Hbase使用LRU(最近最久未使用)算法来清理缓存 |