文章目录
  1. Hbase源码04_Get
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
  4. 3. 总结
  5. 4. 参考
  6. 5. HBase 的基本架构

[TOC]

Hbase源码04_Get

1. 代码示例 (kotlin)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
fun testGet() {
// 创建连接
val connection = ConnectionFactory.createConnection()
// 获取表
val table = connection.getTable(TableName.valueOf("test"))
// get 请求
val get = table.get(Get(Bytes.toBytes("row1")))
val cell = get.getColumnLatestCell(Bytes.toBytes("cf"), Bytes.toBytes("a"))

println(CellUtil.cloneValue(cell).toString(Charset.defaultCharset()))

connection.close()
}

connection.getTable 返回 HTable 实例。

2. 解析

  • 1、调用 HTable#get 方法,创建 RegionServerCallable 实例。执行 RegionServerCallable#prepare
    • 调用方法: this.location = regionLocator.getRegionLocation(row, reload);
    • 获取 row 这行记录所在的 region server 的地址 location
    • 具体操作就是去查询 hbase:meta 表, 找出符合的 regionInfo 信息。代码位于 ConnectionManager#locateRegionInMeta, 创建一个 反向scan 去查询, 整体还算OK。

关于 hbase:meta 里面的数据信息,需要自行参考其他。基本规则就是 HRegionInfo 类的信息。

  • 2、找到对应的 Region ServerName, 调用RPC请求, 最终调用 RSRpcServices#get方法。然后就是获取 region,然后调用对应的 get 方法。

在继续 Region#get 之前,这里需要大致了解下 HRegion 对象的结构,HBase的基本架构如下:

可以看到,对象之间的关系:

1
2
3
4
5
6
1. RegionServer包含多个Region, 和一个HLog(WAL)。
2. 一个 Table 被拆分成了多个 Region, Region可以分布在不同的机器上。
3. 一个 Region 包含一个 Row 的所有 Column 的数据, 以 Row 的维度进行切割。
4. 一个 Region 包含多个 Store, Store 是列族隔离的, 包含一个列族的数据。
5. 一个 Store 包含 memstore 和 多个 StoreFile,StoreFile 是对 HFile 的封装, 存储具体的数据。
6. HFile 的数据来自 memstore 的 flushing操作。
  • 3、下面走入 HRegion#get 方法,这里会将 get 转换成 scan, 然后返回 RegionScannerImpl,构造方法部分代码如下。

  • 4、对于每个 store, 返回一个 StoreScanner. 里面干的事情如下:

  • 5、初始化 this.storeHeap = new KeyValueHeap(scanners, region.comparator); 将所有的 scanners 放到一个 优先级堆 中。comparator 是一个比较器, 实现为 KVScannerComparator

  • 6、最后执行 RegionScannerImpl#next, 从 storeHeap 中不停的 peek() Cell 出来。 一步步获取下一个数据, 直到取出为止。

3. 总结

关于 HFile 的结构

关于 MemStore 或者 StoreFile(HFile) 在内存中的结构(LSM树), 以及 MemStore flush 数据的过程可以参考如下:

关于 BloomFilter 可以参考

4. 参考

5. HBase 的基本架构

此时在来看 HBase 的基本架构图, 就显得很直观了:

文章目录
  1. Hbase源码04_Get
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
  4. 3. 总结
  5. 4. 参考
  6. 5. HBase 的基本架构