HBase过滤器,计数器和协处理器
Posted 法海你懂不
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase过滤器,计数器和协处理器相关的知识,希望对你有一定的参考价值。
过滤器
HBase过滤器(filter)提供了非常强大的特性来帮助用户提高其处理表中数据的效率。用户不仅可以使用HBase中预定义好的过滤器,而且可以实现自定义的过滤器。
HBase中两种主要的数据读取函数是get()和scan(),它们都支持直接访问数据和通过指定的起始行健访问数据的功能。也可以添加额外的限制条件(比如列族、列、时间戳和版本号)来过滤数据。同时用户还可以通过继承Filter类来实现自己的需求。所有的过滤器都在服务端生效,叫做谓词下推(predicate push down)。这样可以保证被过滤的数据不会被传送到客户端。用户可以在客户端代码中实现过滤的功能,但是因为这么做会导致服务器端传输更多的数据到客户端,因此应该尽量避免这种情况。
过滤器最底层是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
使用多个过滤器共同限制返回到客户端的结果。
自定义过滤器
当过滤器处理一行数据时,过滤器中各方法的逻辑流程。
计数器(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异常。用户可以通过显式关闭连接的方法来避免这种情况。
以上是关于HBase过滤器,计数器和协处理器的主要内容,如果未能解决你的问题,请参考以下文章