一.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写入和读取数据

 

写入操作:

hbase 如何存储轨迹 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