天天看點

Phoenix整合Hbase錯誤分析源碼編譯

在Hbase 2.0.5整合Phoenix 5.0.0時,當向已經建立二級索引的表格中插入資料時,會碰到如下錯誤:

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)
           

這個錯誤的意思是Phoenix的org.apache.phoenix.hbase.index.covered.data.IndexMemStore類Override了一個final方法。于是我們檢視Phoenix 5.0.0源碼:

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

可以看到在2.0.5版本中這個方法被聲明為final。為了相容性,這裡我們要将final删掉并重新編譯源碼。

源碼編譯

從hbase官網下載下傳2.0.5版本源碼,解壓,并修改CellComparatorImpl

[[email protected] hbase-2.0.5]$ vim hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparatorImpl.java
           

找到第60行:

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

删掉final,儲存并退出,編譯Hbase源碼:

[[email protected] hbase-2.0.5]$ mvn clean package -DskipTests -Dhadoop.profile=3.0 -Dhadoop-three.version=3.1.3 -Dhadoop.guava.version=27.0-jre -e assembly:single
           

如果碰到License檢查錯誤,将Hbase Assembly的License檢查子產品注釋掉:

[[email protected] hbase-2.0.5]$ vim hbase-assembly/pom.xml
           

将44行到70行注釋掉,再重試編譯。一旦我們看到hbase assembly子產品編譯完成,後面的錯誤就無關緊要了,我們要的bin包已經在hbase-assembly/target下。

繼續閱讀