phoenix-5.0.0与CDH6.0.1兼容性导致二级索引不可用问题解决
今天在测试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修饰符去掉即可,然后打包、停服务、换包、起服务,再试已经正常;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用kubeadm快速部署K8S V1.18
1、基础环境,至少1个Master和1个Worker;2、基本配置 1) 服务器开启硬件虚拟化支持; 2) 操作系统版本大于CentOS7.5,Minimal模式,可update到最新版本; 3) 关闭SElinux和Firewalld服务; #sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux #setenforce 0 #systemctl disable firewalld #systemctl stop firewalld 4) 设置hostname并在/etc/hosts配置本地解析; #hostnamectl set-hostname master1.lab.com 5) 关闭Swap服务 #swapoff -a #sed -i '/swap/d' /etc/fstab 6) 修改sysctl.conf #echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #echo "net.bridge.bridge-nf-call-i...
- 下一篇
机器学习修炼手册:从倔强青铜到最强王者
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 居家隔离期间只顾着玩游戏刷剧真的不会坐立不安吗?与其心神不安打Boss,不如来面对机器学习这个大BOSS。笔者整理的这套课程从入门到高级,快来提升你的段位吧! 提示:Coursera的大部分课程和专业都有审核的选项。用户不会获得证明,但可以访问本课程的大部分资源,这就已经足够了。在报名时,只需选择审核课程的选项即可。 Coursera将提供免费试用,就在“开始免费试用”按钮后面,可以发现一行小字,上面写着“审核课程”。这个技巧很难发现,但也很实用,笔者已经仔细检查了推荐的所有课程,它们应该都是免费的。 A. 倔强青铜 1. 机器学习 使用平台:Coursera 参与机构:斯坦福 所需时间:54小时 事先要求:没有任何要求,但对微积分特别是线性代数有一些理解会更好,可以最大限度帮助理解这门课程。 点评:吴恩达大佬的课程还需要推荐吗?!他是斯坦福大学的教授,也是Coursera的创始人之一,开发了机器学习领域的首批在线课程之一,这批课程目前仍可在YouTube上查阅。 课程摘要: 本课程广泛...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果