HBase协处理器实战

2024-08-27 11:38
文章标签 实战 hbase 协处理器

本文主要是介绍HBase协处理器实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:

http://www.cnblogs.com/muzili-ykt/p/6056066.html

主要内容:

1. HBase协处理器介绍

2. 观察者(Observer)

3. 终端(endpoint)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. HBase协处理器介绍

     系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器。Hbase协处理器(Coprocessor)有两种类型:Observer Coprocessors 和Endpoint Coprocessor。

     前者类似触发器,在特定的事件发生时候触发,后者类似存储过程,执行数据计算。观察者协处理器在很多地方可能用到这些,比如:数据安全权限限制,数据外键参考或者一致性,二级索引,主要类型有:RegionObserver,RegionServerObserver,MasterObserver,WalObserver。

2. 观察者(Observer)

      观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall方法,而具体的事件触发的callback方法由HBase的核心代码来执行。协处理器框架处理所有的callback调用细节,协处理器自身只需要插入添加或者改变的功能。

     以HBase0.92版本为例,它提供了三种观察者接口:

  • RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan等。
  • WALObserver:提供WAL相关操作钩子。
  • MasterObserver:提供DDL类型的操作钩子。如创建、删除、修改数据表等。

     这些接口可以同时使用在同一个地方,按照不同优先级顺序执行.用户可以任意基于协处理器实现复杂的HBase功能层。HBase有很多种事件可以触发观察者方法,这些事件与方法从HBase0.92版本起,都会集成在HBase API中。不过这些API可能会由于各种原因有所改动,不同版本的接口改动比较大,具体参考Java Doc,RegionObserver工作原理如下图所示。

图1 RegionObserver工作原理

 

3. 终端(endpoint)

       HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor。它提供以下三种方法来调用协处理器提供的服务:
  • Table.coprocessorService(byte[])
  • Table.coprocessorService(Class, byte[], byte[],Batch.Call),
  • Table.coprocessorService(Class, byte[], byte[], Batch.Call, Batch.Callback)
      Endpoint 协处理器在Region上下文中运行,一个 HBase 表可能有多个Region。因此客户端可以指定调用某一个单个Region上的协处理器,在单个Region上进行处理并返回一定结果;也可以调用一定范围内的若干Region上的协处理器并发执行,并对结果进行汇总处理。针对不同的需要,可以选择以下三种方法。
    (1)调用单个Region上的协处理器RPC
     第一个方法使用API coprocessorService(byte[]),这个函数只调用单个Region上的协处理器。
     该方法采用RowKey指定Region。这是因为HBase的客户端很少会直接操作Region,一般不需要知道 Region 的名字;况且在 HBase 中,Region 名会随时改变,所以用rowkey来指定Region是最合理的方式。使用 rowkey 可以指定唯一的一个Region,如果给定的 rowkey 并不存在,只要在某个Region的rowkey范围内,依然可以用来指定该Region。比如Region1处理[row1, row100]这个区间内的数据,则 rowkey=row1 就由Region1来负责处理,换句话说,我们可以用row1来指定Region1,无论 rowkey 等于”row1”的记录是否存在。

 图2 调用单个Region上的协处理器

      coprocessorService 方法返回类型为 CoprocessorRpcChannel 的对象,该 RPC 通道连接到由 rowkey 指定的 Region 上,通过这个通道,就可以调用该 Region 上部署的协处理器 RPC。我们已经通过 Protobuf 定义了 RPC Service。调用 Service 的 newBlockingStub() 方法,将 CoprocessorRpcChannel 作为输入参数,就可以得到 RPC 调用的 stub 对象,进而调用远端的 RPC。

代码1 获取单个Region的rowcount

复制代码
 1 long singleRegionCount(String tableName, String rowkey,boolean reCount)
 2 {
 3  long rowcount = 0;
 4  try{
 5  Configuration config = new Configuration();
 6  HConnection conn = HConnectionManager.createConnection(config);
 7  HTableInterface tbl = conn.getTable(tableName);
 8  //获取 Channel
 9  CoprocessorRpcChannel channel = tbl.coprocessorService(rowkey.getBytes());
10 org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.BlockingInterface service =
11 org.ibm.developerworks.getRowCount.ibmDeveloperWorksService.newBlockingStub(channel);
12   //设置 RPC 入口参数
13 org.ibm.developerworks.getRowCount.getRowCountRequest.Builder request = 
14 org.ibm.developerworks.getRowCount.getRowCountRequest.newBuilder();
15  request.setReCount(reCount);
16   //调用 RPC
17  org.ibm.developerworks.getRowCount.getRowCountResponse ret =
18  service.getRowCount(null, request.build());
19  
20  //解析结果
21  rowcount = ret.getRowCount();
22  }
23  catch(Exception e) {e.printStackTrace();}
24  return rowcount;
25  }
复制代码

     (2)调用多个 Region 上的协处理器 RPC,不使用 callback

      有时候客户端需要调用多个Region上的同一个协处理器,比如需要统计整个table的rowcount,在这种情况下,需要所有的Region都参与进来,分别统计自己Region内部的rowcount并返回客户端,最终客户端将所有 Region 的返回结果汇总,就可以得到整张表的 rowcount。
      这意味着该客户端同时和多个 Region 进行批处理交互。具体方法是,收集每个Region的startkey,然后循环调用第一种coprocessorService方法:用每一个Region的startkey作为入口参数,获得RPC通道,创建 stub对象,进而逐一调用每个Region上的协处理器RPC。这种做法需要写很多的代码,为此HBase提供了两种更加简单的coprocessorService方法来处理多个Region的协处理器调用。先来看第一种方法 coprocessorService(Class, byte[],byte[],Batch.Call),该方法有 4 个入口参数。第一个参数是实现RPC的Service类,即前文中的ibmDeveloperWorksService类。通过它,HBase 就可以找到相应的部署在Region上的协处理器,一个Region上可以部署多个协处理器,客户端必须通过指定Service 类来区分究竟需要调用哪个协处理器提供的服务。
      要调用哪些 Region 上的服务则由startkey和endkey来确定,通过rowkey范围即可确定多个Region。为此,coprocessorService 方法的第二个和第三个参数分别是startkey和endkey,凡是落在[startkey,endkey] 区间内的Region都会参与本次调用。
      第四个参数是接口类Batch.Call。它定义了如何调用协处理器,用户通过重载该接口的call()方法来实现客户端的逻辑。在call()方法内,可以调用RPC,并对返回值进行任意处理。即前文代码1中所做的事情。coprocessorService将负责对每个Region调用这个call方法。
      coprocessorService 方法的返回值是一个map类型的集合。该集合的key是Region名字,value是Batch.Call.call方法的返回值。该集合可以看作是所有Region的协处理器RPC返回的结果集。客户端代码可以遍历该集合对所有的结果进行汇总处理。
     这种coprocessorService方法的大体工作流程如下。首先它分析startkey和endkey,找到该区间内的所有Region,假设存放在regionList 中。然后,遍历regionList,为每一个Region调用Batch.Call,在该接口内,用户定义了具体的RPC调用逻辑。最后coprocessorService将所有Batch.Call.call()的返回值加入结果集合并返回。如下图所示:
 
 

图3 调用多个Region上的协处理器——不使用callback

       (3)调用多个 Region 上的协处理器 RPC,使用 callback

      coprocessorService 的第三种方法比第二个方法多了一个参数callback。coprocessorService 第二个方法内部使用HBase自带的缺省callback,该缺省callback将每个Region的返回结果都添加到一个map类型的结果集中,并将该集合作为coprocessorService方法的返回值。
      这个结果集合的key是Region名字,value是call方法的返回值。采用这种方法,客户端代码需要将RPC执行结果先保存在一个集合中,再进入一个循环,遍历结果集合进一步处理。有些情况下这种使用集合的开销是不必要的。对每个 Region 的返回结果直接进行处理可以省去这些开销。具体过程如下图所示:

图4 调用多个Region上的协处理器——使用callback

      HBase 提供第三种 coprocessorService 方法允许用户定义 callback 行为,coprocessorService 会为每一个 RPC 返回结果调用该 callback,用户可以在 callback 中执行需要的逻辑,比如执行 sum 累加。用第二种方法的情况下,每个 Region 协处理器 RPC 的返回结果先放入一个列表,所有的 Region 都返回后,用户代码再从该列表中取出每一个结果进行累加;用第三种方法,直接在 callback 中进行累加,省掉了创建结果集合和遍历该集合的开销,效率会更高一些。因此我们只需要额外定义一个 callback 即可,callback 是一个 Batch.Callback 接口类,用户需要重载其 update 方法。

这篇关于HBase协处理器实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111566

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库