phoenix-5.0.0与CDH6.0.1兼容性导致二级索引不可用问题解决

简介: 今天在测试phoenix的二级索引功能时,创建完索引写入数据,出现以下异常: Caused by: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: org.

今天在测试phoenix的二级索引功能时,创建完索引写入数据,出现以下异常:

Caused by: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: org.apache.phoenix.hbase.index.builder.IndexBuildingFailureException: Failed to build index for unexpected reason!
        at org.apache.phoenix.hbase.index.util.IndexManagementUtil.rethrowIndexingException(IndexManagementUtil.java:206)
        at org.apache.phoenix.hbase.index.Indexer.preBatchMutate(Indexer.java:351)
        at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost$28.call(RegionCoprocessorHost.java:1010)
        at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost$28.call(RegionCoprocessorHost.java:1007)
        at org.apache.hadoop.hbase.coprocessor.CoprocessorHost$ObserverOperationWithoutResult.callObserver(CoprocessorHost.java:540)
        at org.apache.hadoop.hbase.coprocessor.CoprocessorHost.execOperation(CoprocessorHost.java:614)
        at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.preBatchMutate(RegionCoprocessorHost.java:1007)
        at org.apache.hadoop.hbase.regionserver.HRegion$MutationBatchOperation.prepareMiniBatchOperations(HRegion.java:3487)
        at org.apache.hadoop.hbase.regionserver.HRegion.doMiniBatchMutate(HRegion.java:3896)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:3854)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:3785)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.doBatchOp(RSRpcServices.java:908)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.doNonAtomicBatchOp(RSRpcServices.java:836)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.doNonAtomicRegionMutation(RSRpcServices.java:799)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.multi(RSRpcServices.java:2551)
        at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:42014)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)
Caused by: java.lang.VerifyError: class org.apache.phoenix.hbase.index.covered.data.IndexMemStore$1 overrides final method compare.(Lorg/apache/hadoop/hbase/Cell;Lorg/apache/hadoop/hbase/Cell;)I
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.apache.phoenix.hbase.index.covered.data.IndexMemStore.<init>(IndexMemStore.java:82)
        at org.apache.phoenix.hbase.index.covered.LocalTableState.<init>(LocalTableState.java:57)
        at org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.getIndexUpdate(NonTxIndexBuilder.java:52)
        at org.apache.phoenix.hbase.index.builder.IndexBuildManager.getIndexUpdate(IndexBuildManager.java:90)
        at org.apache.phoenix.hbase.index.Indexer.preBatchMutateWithExceptions(Indexer.java:503)
        at org.apache.phoenix.hbase.index.Indexer.preBatchMutate(Indexer.java:348)

异常信息可以看出是IndexMemStore这个类初始化的时候加载class时碰到了VerifyError,具体来说就是试图覆盖1个被标记为final的方法,先找这个类的代码看看:

public class IndexMemStore implements KeyValueStore {

  private static final Log LOG = LogFactory.getLog(IndexMemStore.class);
  private IndexKeyValueSkipListSet kvset;
  private CellComparator comparator;

  public IndexMemStore() {
    this(new CellComparatorImpl(){
        @Override
        public int compare(Cell a, Cell b) {
            return super.compare(a, b, true);
        }
    });
  }

覆盖的是CellComparatorImpl的compare方法,该类在hbase-common模块中,我们用的phoenix版本是5.0.0,对应的hbase版本为2.0.0,找到代码看看:

  @Override
  public int compare(Cell a, Cell b) {
    return compare(a, b, false);
  }

可以看到这个方法并非final,我们使用的是CDH6.0.1,对应的hbase也是2.0.0版本,莫非有所不同,找到代码看看:

  @Override
  public final int compare(final Cell a, final Cell b) {
    return compare(a, b, false);
  }

居然真的有final修饰符,于是查看社区中该类的修改历史,发现是在2.0.1中进行的如上改动,对应的jira:HBASE-20620,可以看到改动记录:

@@ -57,21 +64,17 @@ public class CellComparatorImpl implements CellComparator {
   public static final CellComparatorImpl META_COMPARATOR = new MetaCellComparator();
 
   @Override
-  public int compare(Cell a, Cell b) {
+  public final int compare(final Cell a, final Cell b) {
     return compare(a, b, false);
   }

看起来应该是CDH6.0.1中包含了某些hbase2.0.0之后的patch;

解决方法就是修改hbase,把final修饰符去掉即可,然后打包、停服务、换包、起服务,再试已经正常;

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
XML 存储 分布式计算
hbase构建二级索引解决方案
HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。假设我们相对Hbase里面列族的列列进行一些组合查询,就只能全表扫描了。表如果较大的话,代价是不可接受的,所以要提出二级索引的方案。
1011 0
hbase构建二级索引解决方案
|
5月前
|
SQL NoSQL 数据库
Flutter Hive NoSql 数据库使用指南
本文将会写一个 Hive CURD 的例子,详细介绍 Hive 这个轻量级的 Flutter 离线数据库的使用方法,包括 Hive 在 Flutter 开发中的重要性、Hive 与 SQLite 的比较等,帮助开发者快速上手 Hive 数据库。
Flutter Hive NoSql 数据库使用指南
|
6月前
|
SQL 缓存 关系型数据库
ClickHouse(19)ClickHouse集成Hive表引擎详细解析
Hive引擎允许对HDFS Hive表执行 `SELECT` 查询。目前它支持如下输入格式: -文本:只支持简单的标量列类型,除了 `Binary` - ORC:支持简单的标量列类型,除了`char`; 只支持 `array` 这样的复杂类型 - Parquet:支持所有简单标量列类型;只支持 `array` 这样的复杂类型
223 1
|
7月前
|
关系型数据库 MySQL 分布式数据库
Flink 这个竟然兼容mysql-cdc?
【1月更文挑战第19天】【1月更文挑战第91篇】 Flink 这个竟然兼容mysql-cdc?
82 6
|
消息中间件 Oracle 关系型数据库
Flink CDC确实支持Oracle分区表的CDC,但是在配置时需要特别注意。以下是一些可能的解决方案
Flink CDC确实支持Oracle分区表的CDC,但是在配置时需要特别注意。以下是一些可能的解决方案
146 1
|
Java 关系型数据库 MySQL
[1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog
[1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog
173 0
|
SQL 搜索推荐 Java
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
546 0
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
|
Ubuntu 关系型数据库 Unix
Apache Doris ODBC外表之Postgresql使用指南
希望Doris 2022年起飞,顺利从Apache 孵化器毕业成顶级项目,给大家带来更快、更稳定、生态更丰富的MPP OLAP分析型数据库产品。
986 0
|
关系型数据库 MySQL 数据挖掘
Apache doris ODBC外表使用方式
ODBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(ODBC)来访问外部表,外部表省去了繁琐的数据导入工作,让Doris可以具有了访问各式数据库的能力。
725 0
|
SQL Shell 分布式数据库
[Phoenix] 五、二级索引
目前HBASE只有基于字典序的主键索引,对于非主键过滤条件的查询都会变成扫全表操作,为了解决这个问题Phoenix引入了二级索引功能。然而此二级索引又有别于传统关系型数据库的二级索引,本文将详细描述了Phoenix中二级索引功能、用法和原理。
12637 0