1. Hbase架构
(1)HbaseClient 为用户提供访问Hbase的接口,通过元数据(.meta)表定位到目标数据的RegionServer,此外HbaseCLient维护了对应的cache(缓存元数据信息)来加速对Hbase的访问。
(2)Hmaster
- 分配Region:负责启动的时候分配Region到具体的RegionServer;
- 负责均衡:一方面负责将用户的数据均衡地分布在各个RegionServer上,另一方面负责将用户的请求均衡地分布在各个RegionServer上,防止请求集中于某个RegionServer上;
- 维护数据:发现失效地Region,将它重新分配到正常的RegionServer上,并且在RegionServer失效的时候,协调对应的Hlog进行任务的拆分。 (3)RegionServer
- 管理HMaster为其分配的Region;
- 负责与底层hdfs交互,将数据存储到hdfs;
- 负责Region变大后的拆分以及StoreFile的合并工作。
Region:每一个Region都有起始Rowkey和结束Rowkey,代表了存储Row的范围,保存着表中某段连续的数据。刚开始每张表只有一个Region,随着数据量不断增加,Region大小达到一个阈值时,Region就会被RegionServer水平等分为两个新的Region。当Region数量过多时,Hmaster会将Region保存到其他RegionServer上。Store:一个Region由多个store组成,每个sotre都对应着一个列簇(column family),store中包含着MemStroe和StoreFile。
(4)zookeeper
- 选举Hmaster:保证集群中只有一个Hmaster在运行;
- 监控RegionServer:当RegionServer有异常时,通过回调形式通知Hmaster有关的RegionServer上下线的信息;
- 维护元数据和集群配置
2. Hbase的写流程
(1)Clinet访问Zookeeper集群,先获取hbase:meta表所在的服务器,然后通过hbase:meta表获取存放目标数据的region信息,并将该数据所在的region信息和hbase:meta表缓存在Client的meta cache,与目标RegionServer通讯发送写请求;
(2)先将数据顺序写入(追加)到WAL,以防止数据丢失,然后将数据写入Memstore,数据会在Memsotre中进行排序,当WAL和MemSotre都写入成功,则表明这条数据写入成功;
(3)如果Memsotre达到阈值(默认64M)后,会创建一个新的MemStore,把旧的Memsotre数据flush到SotreFile中。当多个StoreFile(Hfile的封装)文件达到一定的数量时,会触发Compact操作,合并成一个大的StoreFile文件。当SotreFile越来越大,伴随着region也会越来越大,达到一定阈值,会触发Split操作,将region等分为二,并由Master分配到相应的RegionServer中,实现RegionServer的负载均衡,原本的Region会下线;其中由于SotreFile是只读的,一旦创建后不可更改,因此Hbase更新数据其实就是追加操作,只是将最近时间戳的数据进行展示。
3. Hbase的读流程
(1)Clinet访问Zookeeper集群,先获取hbase:meta表所在的服务器,然后通过hbase:meta表获取读取目标数据的region信息,并将该数据所在的region信息和hbase:meta表缓存在Client的meta cache,与目标RegionServer通讯发送读请求;
(2)读请求先到BLockCache中查数据,查不到就到memstore和StoreFile中查询数据,并把查询到的数据存放入BLockCache中,并返回给Client。其中BlockCache采用LRU(最近最少使用)策略和分级缓存策略,当BlockCache的大小达到上限后,会触发缓存机制,将最老的一批数据淘汰。