HBase的读写流程。
1.Hbase的整体架构
简单说Hbase有三大组件:Region Server、HMaster、Zookeeper。

Client
- 访问HBase的接口并维护cache来加快对HBase的访问
Zookeeper
- 保证任何时候,集群中只有一个活跃master
- 存储所有region的寻址入口
- 实时监控region server的上线和下线信息,并实时通知master
- 存储HBase的schema和table元数据
注:zookeeper存储表的元数据地址,client请求查询表拿到表的地址后再访问对应表
Master
- 为region server分配region
- 负责region server的负载均衡
- 发现失效的region server并重新分配失效的region
- 管理用户对table的增删改操作
RegionServer
- region server维护region,处理对这些region的IO请求
- region server负责切分在运行过程中变得过大的region
region
- HBase自动把表水平划分成多个区域(region),每个region会保存一个表里某段连续的数据
- 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值的时候,region就会等分会两个region
- 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver上。
memstore与storefile
- 一个region由多个store组成,一个store对应一个CF(列族)
- store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值(默认64m),regionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile
- 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major ),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile
- 当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver,实现负载均衡
- 客户端检索数据,先在memstore找,找不到再去blockcache查找,找不到再找storefile,即:client->memstore->blockcache->hfile
注:
- Region是HBase中存储和负载均衡的最小单元,不同的Region可以分布在不同的 Region Server上
- Region由一个或者多个Store组成,每个store保存一个columns family
- 每个Strore又由一个memStore和0至多个StoreFile组成
- memstore为写入缓存,blockcache读取缓存
- Hbase内部为主从集群模式,hmaster主节点regionServer为从节点,master负责增删改管理regisonServer
- HBase中更新操作并没有更新原数据,而是使用时间戳属性实现了多版本,删除操作也并没有真正删除原数据,只是插入了一条打上”deleted”标签的数据,而真正的数据删除发生在系统异步执行Major_Compact的时候。
2.Hbase的写流程
- 客户端从zookeeper中获取meta表所在的regionserver节点信息。
- 客户端访问meta表所在的regionserver节点,获取到region所在的regionserver信息。
- 客户端访问具体的region所在的regionserver,找到对应的region及store。
- 开始写数据,写数据的时候会先向hlog中写数据(方便memstore中数据丢失后能够根据hlog恢复数据,向hlog中写数据的时候也是优先写入内存,后台会有一个线程定期异步刷写数据到hdfs,如果hlog的数据也写入失败,那么数据就会发生丢失),HLog 就是日志文件,记录着所有的更新操作。
- hlog写数据完成之后,再将数据写入到MemStore,MemStore是内存缓存,保存最近更新的数据,MemStore默认大小是64M,当MemStore满了之后会进行统一的溢写操作,将MemStore中的数据持久化到hdfs中。
- 频繁的溢写会导致产生很多的小文件,因此会进行文件的合并,文件在合并的时候有两种方式,minor和major, minor表示小范围文件的合并,major表示将所有的storefile文件都合并成一个。


3.Hbase的读流程
- 客户端从zookeeper中获取meta表所在的regionserver节点信息。
- 客户端访问meta表所在的regionserver节点,获取到region所在的regionserver信息。
- 客户端访问具体的region所在的regionserver,找到对应的region及store。
- 首先从memstore中读取数据,如果读取到了那么直接将数据返回,如果没有,则去blockcache读取数据。
- 如果blockcache中读取到数据,则直接返回数据给客户端,如果读取不到,则遍历storefile文件,查找数据。
- 如果从storefile中读取不到数据,则返回客户端为空,如果读取到数据,那么需要将数据先缓存到blockcache中(方便下一次读取),然后再将数据返回给客户端。
- blockcache是内存空间,如果缓存的数据比较多,满了之后会采用LRU策略,将比较老的数据进行删除。
注:如何保证client读取blockcache内为新数据?cache与HFile共同维护一索引表,索引表内指向最新版本数据源,当client读取指定rowkey数据时会访问索引,索引给出给出最新版本数据,如blockcache不是最新的,那本次会读取hfile并更新blockcache数据,从而使client访问最新数据。
