HBase的get过程(一)

原文:http://punishzhou.iteye.com/blog/1258848

 

0.90.X的get和scan操作原理上是比较一致的,get操作都变为scan操作。不过在分析之前我们还是从get说起

话不多说首先看看get这个接口,hbase客户端对于get有以下几种:

Java代码  收藏代码
  1. public Get(byte [] row)  
Java代码  收藏代码
  1. public Get(byte [] row, RowLock rowLock)  

 其中rowlock主要是用来保证行的事务性,即每个get是以一个row来标记的一个row中可以有很多family和column

get还有很多函数如addfamily,addcolumn,这里我主要以指定row family column来get数据

 

ok我们来看HTable的get操作

Java代码  收藏代码
  1. public Result get(final Get get) throws IOException {  
  2.     return connection.getRegionServerWithRetries(  
  3.         new ServerCallable<Result>(connection, tableName, get.getRow()) {  
  4.           public Result call() throws IOException {  
  5.             return server.get(location.getRegionInfo().getRegionName(), get);  
  6.           }  
  7.         }  
  8.     );  
  9.   }  

 这也是一个RPC调用的过程且其返回结果为Result。

1.调用HConnectManger的getRegionServerWithRetries(ServerCallable<T> callable)

callable.instantiateServer(tries != 0);
          return callable.call();

这两步主要是找到该get的row所在的region,locateRegion

这个过程以后再来分析,总之就是找到该get所在的region,并与该region所在server通信

我们主要来看RegionServer端的Get操作,主要是region的get操作

 

Java代码  收藏代码
  1. List<KeyValue> result = get(get);  
Java代码  收藏代码
  1. private List<KeyValue> get(final Get get) throws IOException {  
  2.    Scan scan = new Scan(get);  
  3.   
  4.    List<KeyValue> results = new ArrayList<KeyValue>();  
  5.   
  6.    InternalScanner scanner = null;  
  7.    try {  
  8.      scanner = getScanner(scan);  
  9.      scanner.next(results);  
  10.    } finally {  
  11.      if (scanner != null)  
  12.        scanner.close();  
  13.    }  
  14.    return results;  
  15.  }  

 上述这个过程就是region的get过程,我们用下图来进行一个简单的描述

 

每个region中有一个regionscanner,每个regionscanner中维持一个heap的优先级队列,其中包含所有的storescanner,每个storescanner中包含一个Memstorescanner和n个Hfilescanner

进行查找时首先会定位到hfilestore或是memstore,找到这个get的row起始位置

 

在HFile或是memstore中数据视安从小到大进行排序的,排序规则是按keyvalue的大小,row,family,column,timestamp,最后是type。

 



 

上图就是模拟hfile里面keyvalue的一个排序规则。

哪些get的话如果没有指定时间戳的话会返回最近的一个值。,get也可以制定取回的版本数。

如果我们需要取回3个版本如上图所示

首先每个Hfile会定位到该row的起始处位置如此处在这3个Hflie的开头,若指定的column是C1

然后比较这三个文件开头的keyvalue大小,显然第三个R1,cf,c1,9最小,故首先取它

然后该文件指针往下移,重新比较当前指针的最小值,此时第一个文件的R1,cf,c1,8最小故第二个版本取它

然后指针下移继续比较知道满足版本数为止

### 如何扫描 HBase 表 在 HBase 中,`Scan` 是种用于检索表数据的操作方式。通过 `Scan` 可以获取指定范围内的多行记录,并支持设置过滤器、起始键和结束键等功能[^3]。 以下是使用 Java API 执行 HBase 表扫描的个典型代码示例: ```java import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; public class HBaseTableScanner { public static void main(String[] args) throws Exception { // 创建连接配置 (假设已正确配置 HBase 集群环境) Connection connection = ConnectionFactory.createConnection(); try (Table table = connection.getTable(TableName.valueOf("your_table_name"))) { Scan scan = new Scan(); // 设置扫描的起点和终点(可选) scan.withStartRow(Bytes.toBytes("row_start")); scan.withStopRow(Bytes.toBytes("row_stop")); // 添加列族或特定列(可选) scan.addFamily(Bytes.toBytes("column_family")); // 使用 ResultScanner 获取结果集 try (ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { System.out.println("Found row: " + Bytes.toString(result.getRow())); } } } finally { connection.close(); // 关闭连接释放资源 } } } ``` 上述代码展示了如何创建个基本的 `Scan` 对象并执行扫描操作。其中的关键点包括但不限于以下内容: - **设置扫描范围**:可以通过调用 `withStartRow` 和 `withStopRow` 方法来定义扫描的起始行和终止行。 - **添加列族/列限定符**:可以利用 `addFamily` 或者更具体的 `addColumn` 来限制返回的数据字段。 - **分页控制**:如果需要处理大量数据,则可通过调整批量大小 (`setBatch`) 实现分批读取。 另外,在实际应用过程中还可以结合各种类型的过滤器(Filter),进步优化查询逻辑以及减少不必要的网络传输开销。 #### 复杂场景下的注意事项 当涉及到分布式部署或者跨数据中心同步时,可能还需要考虑 Replication 机制的影响。例如启用 Peer 后可能会导致某些副本上的数据延迟更新等问题[^2]。因此建议开发者根据具体业务需求合理规划架构设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值