Skip to content

Latest commit

 

History

History
304 lines (183 loc) · 10.4 KB

4、客户端API:高级特性.md

File metadata and controls

304 lines (183 loc) · 10.4 KB

Table of Contents generated with DocToc

4.1 过滤

用户可以使用 HBase 预定义的过滤器,也可以实现自己的过滤器。

GetScan两个类都支持过滤器,原因是这些对象提供的基本API不能对行键、列名、列值进行过滤。过滤器最基本的接口是Filter。用户可以继承Filter来实现自己的需求。

所有的过滤器都在服务端生效,叫做谓词下推(predicate push down)。

过滤器的最底层是Filter接口和FilterBase抽象类。将过滤器实例传递给GetScan实例:

set Filter(filter)

CompareFilter过滤器有一个compare方法,它需要使用传入参数定义比较操作的过程。CompareFilter的第二类类型是比较器(comparator)。比较器提供了多种方法来比较不同的键值。比较器都继承自WritableByteArrayComparable,后者实现了WritableComparable接口。

HBase 提供的过滤器有BinaryComparatorBinaryPrefixComparatorNullComparatorBitComparatorRegrexStringComparatorRegrexStringComparatorSubstringComparator

比较过滤器

CompareFilter(CompareOp valueCompareOp, WritableByteArrayComparable valueComparator)
  • 行过滤器:RowFilter

  • 列族过滤器:FamilyFilter

  • 列名过滤器:QualifierFilter

  • 值过滤器:ValueFilter

  • 参考列过滤器:DependentColumnFilter。运行用户指定一个参考列,使用参考列控制其他列的过滤。

    DependentColumnFilter(byte[] family, byte[] qualifier, boolean dropDependentColumn, CompareOp valueCompareOp, WritableByteArrayComparable valueComparator)

专用过滤器

专用过滤器用于特定的场景,直接继承自FilterBase

  • 单列值过滤器:SingleColumnValueFilter,由一列的值决定是否一行数据被过滤。

    SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, WritableByteArrayComparable comparator)
  • 单列排除过滤器:SingleColumnValueExcludeFilter,继承自单列值过滤器,但参考列不被包括到结果中。

  • 前缀过滤器:PrefixFilter

    public PrefixFilter(byte[] prefix)
  • 分页过滤器:PageFilter,使用这个过滤器对结果按行分页。

  • 行键过滤器:KeyOnlyFilter,可以只返回键。

  • 首次行键过滤器:FirstKeyOnlyFilter

  • 包含结束的过滤器:InclusiveStopFilter

  • 时间戳过滤器:TimetampsFilter

    TimetampsFilter(List<Long> timestamps)

  • 列计数过滤器:ColumnCountGetFilter

    ColumnCountGetFilter(int n)

  • 列分页过滤器:ColmnPaginationFilter

    ColumnPaginationFilter(int limit, int offset)
  • 列前缀过滤器:ColumnPrefixFilter

    ColumnPrefixFilter(byte[] prefix)
  • 随机行过滤器:RandomRowFilter

    RandomRowFilter(float chance)

附加过滤器

  • 跳转过滤器(SkipFilter):包装了一个用户提供的过滤器,当被包装的过滤器遇到一个需要过滤的KeyValue实例时,用户可以扩展并过滤整行数据。换句话说,当过滤器发现某一行的一列需要过滤时,那么整行数据都被过滤。
  • 全匹配过滤器(WhileMatchFilter):当一条数据被过滤掉时,它就会直接放弃这次扫描。

FilterList

如果用户需要多个过滤器共同限制返回给客户端的结果,FilterList提供了这个功能。

FilterList(List<Filter? rowFilter)
FilterList(Operator operator)
FilterList(Operator operator, List<Filter> rowFilters)

自定义过滤器

用户可以实现自己的过滤器,实现Filter接口或者直接继承FilterBase类。

过滤器处理一行数据的流程:

4.2 计数器

客户端API提供了专门的方法来读取并修改(read-and-modify)操作,并保证其原子性。

incr table row column [increment-value]

用户可以使用get请求访问计数器。

单计数器

第一种操作只能操作一个计数器:用户需要自己设定列,方法由HTable提供:

long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount, boolean writeToWAL)

多计数器

HTableincrement()

Result increment(Increment increment) throws IOException

Increment的构造函数:

Increment (byte[] row, RowLock rowLock)

一旦用户使用行键创建了Increment实例,就要向其中加入实际的计数器,也就是说,用户需要增加列:

Increment addColumn(byte[] family, byte[] qualifier, long amont)

4.3 协处理器

协处理器(coprocessor)让用户可以把一部分计算移动到数据的存放端,即region server。

协处理器框架提供了一些类, 用户可以继承这些类来扩展自己的功能:

  • observer。与触发器(trigger)类似:回调函数。在一些特定时间发生时被执行。
    1. RegionServer:处理修改事件,与表的region紧密联系。
    2. MasterObserver:用作管理或DDL类型的操作,这些都是集群级事件
    3. WALObserver:控制WAL的钩子函数
  • endpoint。通过添加一些远程过程调用来动态扩展RPC协议,可以理解为与RDBMS类似的存储过程。

协处理器可以动态加载,也可以链接起来使用。

Coprocessor

所有协处理器的类都必须是实现这个接口。在协处理器的生命周期中,它们由框架管理。Coprocessor接口提供了两个方法:

void start(CoprocessorEnvironment env) throws IOException
void stop(CoprocessorEnvironment env) throws IOException

CoprocessorEnvironment用来在协处理器生命周期中保持其状态。

CoprocessorHost类,负责维护所有协处理器实例和它们的专用环境。

协处理器加载

用户可以将协处理器配置为静态方式加载,也可以在集群运行时动态加载。

静态加载方式包括:

  1. 从配置文件中加载。hbase-site.xml
  2. 从表描述符中加载。这个是针对特定表的,加载的协处理器只针对这个表的region,也只能被这些region的region server使用。

RegionObserver

当一个特定的 region 级别的操作发生时,它们的钩子函数被触发。这些操作可以分为两类:region 生命周期变化 和 客户端API调用。

  1. 处理 region 生命周期事件

    这些 observer 可以与 pending open、open 和 pending close 状态通过钩子链接。每个钩子都被框架隐式调用。

  2. 处理客户端 API 事件

    所有的客户端 API 都显式地从客户端应用中传输到 region server。用户可以在这些调用执行前或后拦截它们。

RegionObserver类的协处理环境的实例是基于RegionCoprocessorEnvironment类的,后者实现了CoprocessorEnvironment接口,并提供了面向 region 的方法。

RegionObserver提供的所有回调函数都需要一个特殊的上下文作为参数:ObserverContext,它提供了访问当前环境的入口,也可以通知协处理器框架在回调函数完成时做什么。

BaseRegionObserver是用户实现监听类型协处理器的基类,它实现了所有RegionObserver接口的空方法,所以用户必须重载他们感兴趣的方法来实现自己的功能。

MasterObserver

MasterCoprocessorEnvironment封装了一个 MasterObserver实例,它也提供了getTable之类的方法帮助用户在自己的实现中访问数据。

用户可以直接实现MasterObserver接口,或者扩展BaseMasterObserver类来实现自己的功能。

endpoint

协处理器提供了以 endpoint 概念为代表的动态调用实现。

  1. CoprocessorProtocol接口。通过这个接口可以定义协处理器希望暴露给用户的任意方法。CoprocessorProtocol实例和表中单个 region 联系在一起,所以客户端的 RPC 调用必须定义 region。

  2. BaseEndpointCoprocessor类。

4.4 HTablePool

HTable实例的创建是一项非常耗时的工作,通常要几秒。HTablePool就解决了这个问题:

HTablePool(Configuration, pool, int maxSize)

可以使用如下调用方式来使用表实例:

HTableInterface getTable(String tableName)
void putTable(HTableInterface table)

关闭池中的特定表实例:

void closeTablePool(String tableName)

4.5 连接管理

每个HTable实例都需要建立和远程主机的连接,这些连接在内部使用HConnection类表示。用户没有必要同时和这两个类打交道,只需要建立一个Configuration实例,然后利用客户端API来使用这些类。

HBase 内部使用键值对来存储连接,使用Configuration实例作为键值映射的键。

每个客户端都需要使用 ZooKeeper 来找到region server。所以 ZooKeeper 连接是共享的。

调用HTable.close()方法会释放所有资源,其中包括 ZooKeeper 连接,同时移除内部列表中的连接引用。

导航

目录

上一章:3、客户端API:基础知识

下一章:5、客户端API:管理功能