Hbase源码分析之org.apache.hadoop.hbase.client包

来源:互联网 发布:视频课程录像软件 编辑:程序博客网 时间:2024/06/05 11:05

Scan:设置scan记录的条件,buffer size,cache size等
ResultScanner:提供scan的接口,
ClientScaner:客户端 ResultScanner的实现,数据分布在多个region之间的,就依次读取。
用法如下:
    HTableInterface tbl = null;
    tbl = table.getTable("table_name");
     Scan scan = new Scan();
//设置客户端缓存的记录数量,调用next方法时,根据这个参数,一次性从服务端返回cache大小的数据缓存在客户端,下次再调用next方法时,就直接从客户端缓存中取得下一条数据。
     scan.setCaching(100);
     scan.setCacheBlocks(true);
     scan.setStartRow((userNum+"10").getBytes());
      scan.setStopRow((userNum+"20").getBytes());
      clscaner = (ClientScanner) tbl.getScanner(scan);
       Result[] rets = clscaner.next();//获取下一行
       Result[] rets = clscaner.limit(start, pageSize);//分页
在next方法中会do while循环调用nextScanner方法进行是否结束scan的判断,
循环结束的条件是,获取的记    录数量到达caching size的大小,或者不能满足server 端的filter的过滤条件而返回数据为空,或者当前是最后一个region或者当scan的stoprowkey比当前的region的endkey要小时,会自动结束scan,不会去下一个region进行scan。
HTable:提供和单个表交互的接口,包括put,get,delete,同时也提供ResultScaner的创建方法,它是非线程安全的,HTablePool是线程安全的。
以上所有的对region的操作,最终都会ServerCallable对RegionServer进行region操作的。下面对这个类重点说一下。
一个ServerCallale是针对一个Server 的某Region操作类,基于startrow定位Region(HRegionLocation),进而获取Region的location在哪个server实例上(HRegionInterface,服务端HRegionServer的客户端代理),调用call方法连接server实例,获取数据。
在实现类ScanerCallable中的call方法中,调用HRegionInterface(HRegionServer的客户端代理)的next方法获取Results。
通过RPC协议连接到HRegionServer后,在Server内部进行当前region的regionScaner(根据设置的startrow和endrow以及filter进行过滤)。