HBase 2.4 RegionCoprocessor抛出UnknownProtocolException求助
问题背景
原在HBase 1.4运行正常的STQueryEndPoint Endpoint协处理器,迁移到HBase 2.4后出现UnknownProtocolException,日志显示协处理器已加载,但调用时提示"No registered coprocessor service found for QueryService"。
核心原因
HBase 2.x对CoprocessorService的注册机制做了调整:1.4版本中继承自动生成的Protobuf Service类并实现CoprocessorService接口时,框架会隐式完成服务注册;但2.x版本要求必须显式重写getService()方法返回服务实例,否则Region无法识别对应的Protocol服务。
解决方案
1. 修正协处理器代码,显式实现getService()方法
修改STQueryEndPoint类,必须重写CoprocessorService接口的getService()方法返回当前实例,同时确保实现Protobuf Service定义的业务方法:
public class STQueryEndPoint extends QueryCondition.QueryService implements RegionCoprocessor, CoprocessorService { // 必须重写此方法,返回当前服务实例 @Override public Service getService() { return this; } // 实现Protobuf Service中定义的query方法 @Override public void query(RpcController controller, QueryCondition.QueryRequest request, RpcCallback<QueryCondition.QueryResponse> done) { // 编写业务逻辑,构建并返回响应 QueryCondition.QueryResponse response = QueryCondition.QueryResponse.newBuilder() // 添加响应数据逻辑 .build(); done.run(response); } }
2. 确保Protobuf版本与HBase 2.4兼容
HBase 2.4使用的Protobuf版本为3.5.1,需确保协处理器编译时依赖的Protobuf版本与HBase一致,避免协议序列化/反序列化不匹配。Maven依赖示例:
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.15</version> <!-- 与你的HBase版本保持一致 --> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>2.4.15</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.5.1</version> <!-- HBase 2.4对应的Protobuf版本 --> <scope>provided</scope> </dependency> </dependencies>
3. 强制Region重新加载协处理器
重启RegionServer后,部分旧Region可能未重新加载新的协处理器,可通过禁用再启用表的方式强制刷新:
# 进入HBase Shell hbase shell # 禁用目标表 disable 'xz2_intersect_query_test2' # 启用目标表 enable 'xz2_intersect_query_test2'
4. 验证协处理器加载状态
重新启动RegionServer后,检查日志确认协处理器已正确加载且无类加载异常:
INFO (CoprocessorHost.java:174) 03-02 00:36:31,178 System coprocessor query.coprocessor.STQueryEndPoint loaded, priority=536870911.
内容的提问来源于stack exchange,提问作者Dilibaba

