HBase之扫描

点击蓝字关注我吧

【本文详细介绍了HBase中扫描的基本概念和方法,欢迎读者朋友们阅读、转发和收藏!】

1 基本概念

1.1 HBase 扫描

HBase 扫描是 HBase 客户端还提供了一套能够进行全表扫描的 API ,方便用户能够快速对整张表进行扫描,以获取想要的结果。

扫描操作的使用跟 get() 方法非常相似。同样,和其他函数类似,这里也提供了 Scan 类。但是由于扫描的工作方式类似于迭代器,所以用户无需调用 scan() 方法创建实例,只需调用 HTable 的 getScanner() 方法,此方法在返回真正的扫描器 (scanner) 实例的同时,用户也可以使用它迭代获取数据。

ResultScanner getScanner(Scan scan)

ResultScanner getScanner(byte[] family)

ResultScanner getScanner(byte[] family, byte[] qualifier)

后两个为了方便用户,隐式地帮用户创建了一个 Scan 实例,逻辑中最后调用 getScanner(Scan scan) 方法。

Scan 类拥有以下构造器:

public Scan()

public Scan(byte [] startRow)

public Scan(byte [] startRow, byte [] stopRow)

public Scan(byte [] startRow, Filter filter)

public Scan(Get get)

public Scan(Scan scan)

这与 Get 类不同点是显而易见的:用户可以选择性地提供 startRow 参数,来定义扫描读取 Hbase 表的起始行键,即行键不是必须指定的。同时可选 stopRow 参数来限定读取到何处停止。

1.2 扫描操作特点

扫描操作有一个特点:用户提供的参数不必精确匹配这两行。扫描会匹配相等或大于给定的起始行的行键。如果没有显式地指定起始行,它会从表的起始位置开始获取数据。

当遇到了与设置的终止行相同或大于终止行的行键时,扫描也会停止。如果没有指定终止行键,会扫描到表尾。

另一个可选参数叫做过滤器 (filter) ,可直接指向 Filter 实例。尽管 Scan 实例通常由空白构造器构造,但其所有可选参数都有对应的 getter 方法和 setter 方法。

1.3 扫描方法介绍

1.3.1 基本方法

创建 Scan 实例后,用户可能还要给它增加更多限制条件。这种情况下,用户仍然可以使用空白参数的扫描,它可以读取整个表格,包括所有列族以及它们的所有列。

这里有很多与 Get 类相似的功能:可以使用 addFamily() 方法限制返回数据的列族,或者通过 addColumn() 方法限制返回的列。

如果用户只需要数据的子集,那么限制扫描的范围就能发挥 HBase 的优势。因为 HBase 中的数据是按列族存储的 ,如果扫描不读取某个列族,那么整个列族文件就都不会被读取,这就是列式存储 架构的优势。

1.3.2 扫描器租约

扫描操作不会通过一次 RPC 请求返回所有匹配的行,而是以行为单位进行返回。很明显,行的数目很大,可能有上千条甚至更多,同时在一次请求中发送大量数据,会占用大量的系统资源并消耗很长时间。

ResultScanner 类把扫描操作转换为类似的 get 操作,它将每一行数据封装成一个 Result 实例,并将所有的 Result 实例放入一个迭代器中。

有两种类型 next() 调用供用户选择。调用 close( )方法会释放所有由扫描控制的资源。

要确保尽早释放扫描器实例,一个打开的扫描器会占用不少的服务端资源,累积多了会占用大量的堆空间。当使用完 ResultScanner 之后调用它的 close() 方法,同时,当把 close() 方法放到 try/finally 块中,以保证其在迭代获取数据过程中出现异常和错误时,仍然能执行 close() 。

就像行锁一样,扫描器也使用同样的租约超时机制,保护其不被失效的客户单阻塞太久。用户可以使用修改锁租约处提到的那个配置属性来修改超时时间 ( 单位 : 毫秒)。

用户需要确保该属性值适当,这个值要同时适用于锁租约和扫描器租约。

next() 调用返回了一个单独的 Result 实例,这个实例代表了下一个可用的行。此外,用户可以使用 next(int nbRows) 一次获取多行数据,它返回一个数组,数组中包含的 Result 实例最多可达 nbRows 个,每个实例代表唯一的一行。当用户扫描到表尾或到终止行时,由于没有足够的行来填充数据,返回的结果数组可能会小于既定长度。

我知道你在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200529A0379S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券