HBase过滤器,计数器和协处理器

过滤器

HBase过滤器(filter)提供了非常强大的特性来帮助用户提高其处理表中数据的效率。用户不仅可以使用HBase中预定义好的过滤器,而且可以实现自定义的过滤器。

HBase中两种主要的数据读取函数是get()和scan(),它们都支持直接访问数据和通过指定的起始行健访问数据的功能。也可以添加额外的限制条件(比如列族、列、时间戳和版本号)来过滤数据。同时用户还可以通过继承Filter类来实现自己的需求。所有的过滤器都在服务端生效,叫做谓词下推(predicate push down)。这样可以保证被过滤的数据不会被传送到客户端。用户可以在客户端代码中实现过滤的功能,但是因为这么做会导致服务器端传输更多的数据到客户端,因此应该尽量避免这种情况。

filter-process

过滤器最底层是Filter接口和FilterBase抽象类,用户可以通过集成FilterBase这个抽象类来实现过滤器。

常见的过滤器有:

比较过滤器(comparison filter)

直接继承自CompareFilter类。

  • 行过滤器(RowFilter)
  • 列族过滤器(FamilyFilter)
  • 列名过滤器(QualifierFilter)
  • 值过滤器(ValueFilter)
  • 参考过滤器(DependentColumnFilter)

专用过滤器

直接继承自FilterBase类,同时更以用于特定的使用场景。

  • 单列值过滤器(SingleColumnValueFilter)
  • 单列排除过滤器(SingleColumnValueExcludeFilter)
  • 前缀过滤器(PrefixFilter)
  • 分页过滤器(PageFilter)
  • 行键过滤器(KeyOnlyFilter)
  • 首次行健过滤器(FirstKeyOnlyFilter)
  • 包含结束的过滤器(InclusiveStopFilter)
  • 时间戳过滤器(TimestampsFilter)
  • 列分页过滤器(ColumnPaginationFilter)
  • 列前缀过滤器(ColumnPrefixFilter)
  • 随即行过滤器(RandomRowFilter)

附加过滤器

不依赖过滤器本身,但却可以应用于其他过滤器上面。

  • 跳转过滤器(SkipFilter)
  • 全匹配过滤器(WhileMatchFilter)

FilterList

使用多个过滤器共同限制返回到客户端的结果。

自定义过滤器

当过滤器处理一行数据时,过滤器中各方法的逻辑流程。

filter-row-process

计数器(Counter)

用户不用初始化计数器,当用户第一次使用计数器时,计数器将被自动设为0,也就是说当用户创建一个新列时,计数器的值是0.第一次增加操作会返回1,或增加设定的值。

  • 单计数器
  • 多计数器

协处理器(Coprocessor)

协处理器允许用户在region上运行自己的代码,更准确的说是允许用户执行region级的操作,并且可以使用与RDBMS中触发器(trigger)类似的功能。在客户端,用户不用关心操作具体在哪里执行,HBase的份分布式框架会把这些工作变得透明。这里用户可以监听一些隐式的事件,并利用其来完成一些辅助任务,如果这些还不够,用户还可以扩展现有的RPC协议来引入自己的调用,这些调用由客户端触发,并在服务器端执行。

协处理器的请求方式分为两种:批量处理并且在多个region上并行执行,或者只涉及单个region。

HTablePool

创建HTable实例是一项非常耗时的操作,通常需要数妙才能完成。因此与其为客户端的每个请求创建一个HTable实例,然后不断复用这个实例。

连接管理

每个HTable实例都需要建立和远程主机的连接。这些连接在内部使用HConnection类表示,更重要的是,其被HConnectionManager类管理并共享。用户没有必要同时和这两个类打交道,只需要创建一个Configuration实例,然后利用客户端API使用这些类。

HBase内部使用键值映射来存储连接,使用Configuration实例作为键值映射的键。换句话说,当你创建很多HTable时,如果你提供了相同的Configuration内容,那么它们都共享一个底层的HConnection实例。有关细节如下所示。

共享ZooKeeper连接

因为每个客户端最终都需要ZooKeeper连接来完成表的region地址初始寻址。连接一旦建立后,共享就变得很有意义,这使得之后的客户端实例可以共用。

缓存通用资源

通过ZooKeeper查询到-ROOT-.META.的地址,以及region的地址定位都需要网络传输开销。这些地址将被缓存在客户端来减少网络的调用次数,因此达到加速寻址的目的。

对于每个连接到远程集群的本地客户端来说,它们的地址表都是相同的,因此运行相同的客户端共享连接非常有用,这是通过共享HConncetion实例来实现的,因此运行相同进程的客户端共享连接非常有用,这是通过共享HConnection实例来实现的。另外,当寻址失败时(如region拆分时),连接有内置的重试机制来刷新缓存,对于其他所有共享相同连接的客户端来说,这项更改立即生效,因此这更加减少了客户端初始化连续的连接开销。

另一个受益的类是HTable,所有连接池中的HTable实例都是自动共用一个提供的Configuration实例,因此它们也共享连接。因为当用户想创建多个HTable时,最好先创建一个共用的Configuration实例。

共享连接的缺点在与释放,如果用户不显式的关闭连接,那么它将一直存在,直到客户端退出。这样可能导致很多ZooKeeper连接都保持打开状态,尤其是在大型分布式环境下,如果执行MapReduce作业的HBase程序,可能会产生一些问题。最坏的情况是耗尽所有的连接句柄或内存,导致I/O异常。用户可以通过显式关闭连接的方法来避免这种情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值