HBase读书笔记1

HBase概念及其关系

 在HBase中,Master和Regionserver的关系是,Master管理着Regionserver所有节点状态的信息,同时也管理着表的状态。HBase的数据存储在regionserver节点中。
HBase是一种key/value对存储的数据库表,在Regionserver节点上,针对每一个表,都会涉及到容易混淆的几个概念。

  1. 表和Regionserver: 一个表可以存储在多个Regionserver上,同样一个regionserver可以同时存储多个表的数据,它们之间通过region来隔离,表数据的最大存储结构就是region,表就是通过它来体现出来; 
  2. Region和Store: 一个表有多个region,但是一个region只会属于一个表,并且一个region可以有多个column family,而column family的数据存储结构就是Store,因此可以这么说,在region里面,一个column Family就是一堆Store组成,而一个region里面可以有多个Store。region管理着它辖下的stores,通过columnFamily来找Store。 
  3. Store和StoreFile:每个Store里面管理着一个memstore和一些storeFiles,在这一层不需要进行WAL记帐,记帐是由Hregion来完成的。每个Store都会有一个对应的StoreScanner用来扫描数据,它可以扫描memstore,storefiles和snapshot的数据。 

Get & Scan

 Get与Scan到Regionserver节点上的操作逻辑是一样的,它们的底层都最终会调用HRegion.getScanner方法先获得RegionScannerImpl(scan, additionalScanner)实例。
RegionScannerImpl里面有一个属性isScan来区别,该请求是Get请求,还是Scan请求。

this.isScan = scan.isGetScan() ? -1 : 0;

Scanner

RegionScannerImpl.next(results)是读取数据的,而在RegionScannerImpl有两个重要的属性:

  • storeHeap, StoreScanner里面存储的数据;
  • filter,这个是一个过滤器,用于过滤不想要的数据。

storeHeap是KeyValueHeap类型,它有一个KeyValueHeap(scanner, KVComparator kvComparator)构造函数,KVComparator实质上调用KeyComparator,它比较的顺序为rowKey, columnFamily, qualifier,timestamp,甚到在上述比较之后还相等,就比较KeyValue的memstore的timestamp。
在scan时,storeHeap存储的KeyValueScanner继承类,它们有: 

  • StoreFileScanner:用于读StoreFile文件,
  • StoreScanner:它用于读memstore和storFile
  • MemStoreScanner:用于访问memstore,包括memstore的内存存储表和snapshot
  • KeyValueHeap:也是一个scanner,它包括了一个请求的所有上述scanner,它还对这些scanner进行了排序,其中有一个current属性指向接下来需要处理的scanner
  • CollectionBackedScanner:用一个keyValue的SortedSet进行初始化的scanner,使这个集合具有scanner的特性

上述5个scanner, KeyValueHeap是这些scanner的容器,也是这些scanner的入口。

只有StoreFileScanner没有继承NonLazyKeyValueScanner虚类,NonLazyKeyValueScanner类的性质就是当请求requestSeek时,马上去查出数据。

在nonLazy查询时不支持bloom filter,而在lazy查询时,才支持bloom filter。

StoreScanner有一个getScannerNoCompaction()方法,用来获得StoreFileScanner数组,而StoreFileScanner统一地的管理着一个MemstoreScanner和一些StoreFileScanner,而StoreFileScanner.getScannersForStoreFioles来获得StoreFileScanner列表,同时也获得一个MemStoreScanner,并且通过StoreScanner来过滤这个列表,所用的策略就是bloom filter, time range, TTL。bloom filter只用于过滤StoreFileScanner, 它是通过StoreFile.passessGeneralbloomfilter来完成的。

StoreFileScanner里面有一个HFileScanner的属性,同样有一个getScannerForeStoreFiles()方法,用来获得列表,

KeyValueScanner 里面有两个方法:requestSeek和seek,前者是用于lazySeek。HBase可以通过通配符来匹配列来查询想要的数据,在这种情况下,只能通过seek来访问。

隔离级别

这里面同样有一种隔离级别(IsolationLevel):

  • 一个是READ_COMMIT级别,这种级别是只返回已经提交的数据;
  • 一个是READ_UNCOMMIT级别,这种级别中返回的数据包括正在处于事务修改状态的,但是还是处于待提交状态。

怎么区分这个数据还是处于提交状态呢?每个事务,Regionserver都会为该事务分配一个long形的事务ID, 这种事务性处理是通过MultiVersionConsistencyControl来完成的。

MultiVersionConsistencyControl管理HBase读写一致性,它可以决定在读操作时哪些行可以忽略;在写操作时,分配一个自增的写标识ID;commit写操作。

BlockCache

HBase Cache有LruBlockCache和DoubleBlockCache, 后者包含了LruBlockCache和SlabCache,即采用了二级缓存。

HBase如何获得请求信息

HBase RPC时如何获得client的请求信息呢?例如,请求的远程地址,请求的身份是否是合法。

HBaseServer和RequestContext里面都有一个ThreadLocal变量,分别存有RpcCallContext和RequestContext信息,从HBaseServer.Handler.run()里面可以看到,这两个变量,都做了相应的设置。

猜你喜欢

转载自zcdeng.iteye.com/blog/1856775