一.HBase的原理
1、HRegionServer管理一系列HRegion对象
每个HRegion对应Table中一个Region,HRegion由多个HStore组成; 每个HStore对应Table中一个Column Family的存储; Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
2、HStore:HBase存储的核心。
由MemStore和StoreFile组成。MemStore是Stored Memory Buffer。
3、HLog: 引入HLog原因:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
4.HBase存储什么类型数据?
hbase中只支持byte[] 此处的byte[] 包括了: rowkey,key,value,列族名,表名
二、HBase写入和读取数据
写入操作:
- Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据;
- 数据被写入Region的MemStore,知道MemStore达到预设阀值(即MemStore满);
- MemStore中的数据被Flush成一个StoreFile;
- 随着StoreFile文件的不断增多,当其数量增长到一定阀值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除;
- StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile;
- 单个StoreFile大小超过一定阀值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
可以看出HBase只有增添数据,所有的更新和删除操作都是在后续的Compact历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了HBase I/O的高性能。
读出操作:
- Client访问Zookeeper,查找-ROOT-表,获取.META.表信息;
- 从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer;
- 通过RegionServer获取需要查找的数据;
- RegionServer的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
- 寻址过程:client—>Zookeeper—>ROOT表—>.META. 表—>RegionServer—>Region—>client