Phoenix4.6 适配 CDH5.4

每个Phoenix版本会对应一个特定的HBase版本,而Phoenix官方提供的版本仅仅适配Apache下的HBase版本,对于CDH版本的HBase,有时候并不能支持,因为CDH对于HBase进行一些改造。我们的HBase搭建于CDH5.4,Phoenix采用4.6-HBase-1.0.0版本,但是使用时发现并不支持CDH5.4上面的HBase(版本为cdh-1.0.0)。那么,为了能够得到可用的Phoenix版本,我们需要进行适配。这篇文章将介绍如何使用Phoenix4.6-HBase-1.0.0源码进行编译,来得到适用于cdh5.4 hbase1.0.0 的phoenix版本。

1. 背景

在phoenix官网下载的phoenix-4.6.0-HBase-1.0版本,无法适配cdh5.4的hbase(hbase版本为1.0.0),使用sqlline.py连接hbase时候会报类似以下错误:

1
2
Caused by
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Scan.setRaw(Z)Lorg/apache/hadoop/hbase/client/Scan;

出错原因是phoenix官方版本pom文件里的hbase依赖并不是使用cdh版本的。所以,为了能够使得phoenix与cdh对应,我们需要从phoenix官网下载对应版本(4.6.0)的phoenix源码,修改pom文件依赖以及部分源码,并重新编译,得到适配于cdh5.4 hbase1.0.0 的phoenix。

【注意】 需要特别注意phoenix与cdh hbase的版本对应关系,这里选用的是phoenix-4.6.0-HBase-1.0

2. 解决步骤

2.1 修改pom.xml文件

phoenix-4.6.0-HBase-1.0源码中的pom.xml文件做如下修改:

  • 将repository从apache改为cloudera

repository从apache改为cloudera

  • 修改必要的依赖版本为cdh版本

依赖版本修改为cdh版本

依赖版本修改为cdh版本

2.2 修改源码

(1) 修改LocalIndexMerger.java

  • package :
1
2
3
phoenix-core
- src/main/java
- org/apache/hadoop/hbase/regionserver
  • file : LocalIndexMerger.java
  • line : 84

修改LocalIndexMerger.java

(2) 修改IndexSplitTransaction.java

  • package :
1
2
3
phoenix-core
- src/main/java
- org/apache/hadoop/hbase/regionserver
  • file : IndexSplitTransaction.java
  • line : 291

修改IndexSplitTransaction.java

2.3 mvn install

经过以上修改之后执行mvn clean install -DskipTests重新编译并生成发行包。编译成功后可以在phoenix-assembly的target目录下找到。

【注意】如果mvn install过程遇到module spark build fail,那么在pom.xml文件中将spark module给去掉再执行mvn install即可。

去掉spark module依赖

2.4 替换相关jar

在apache phoenix官网下载对应phoenix版本的发行包,然后在我们自己编译得到的phoenix中找到以下jar,替换到下载的phoenix发行包中,并将替换后的发行包放到我们集群中的某个目录下。

example :

1
/root/cdh5.4/phoenix-4.6.0-HBase-1.0-wrapper-cdh5.4.2
  • phoenix-4.6.0-HBase-1.0-client.jar
  • phoenix-4.6.0-HBase-1.0-server-without-antlr.jar
  • phoenix-4.6.0-HBase-1.0-client-minimal.jar
  • phoenix-assembly-4.6.0-HBase-1.0-tests.jar
  • phoenix-4.6.0-HBase-1.0-client-without-hbase.jar
  • phoenix-core-4.6.0-HBase-1.0.jar phoenix-4.6.0-HBase-1.0-server.jar

2.5 配置RegionServer HBase lib path

将新编译出的 phoenix-4.6.0-HBase-1.0-server.jar放到每一个RegionServer节点的HBase的library path下。

对于cdh离线安装对应的目录为 :

1
/usr/lib/hbase/lib

2.6 重启HBase集群

最后为了使得配置生效,必须将cdh的hbase集群重启。重启后再次使用sqlline.py连接hbase成功,完成整合。

成功整合

3. 参考

phoenix适配cdh

坚持原创技术分享,您的支持将鼓励我继续创作!