2

我一直在尝试开发一个 web 应用程序,它通过 rest 获取数据并使用 phoenix 在 hbase 中插入相同的数据。我试图在 tomcat 上部署我的应用程序,它工作正常。但是在 jboss 上部署时会引发以下运行时异常。

引起:java.lang.RuntimeException: hbase-default.xml 文件似乎是旧版本的 HBase (null),这个版本是 0.94.7 at org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java :68)在 org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:100) 在 org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:111) 在 com.salesforce.phoenix.query。 ConfigurationFactory$ConfigurationFactoryImpl.getConfiguration(ConfigurationFactory.java:51) 在 com.salesforce.phoenix.query.QueryServicesOptions.withDefaults(QueryServicesOptions.java:99) 在 com.salesforce.phoenix.query.QueryServicesImpl.(QueryServicesImpl.java:44) 在com.salesforce.phoenix.jdbc.PhoenixDriver.(PhoenixDriver.java:67) at com.salesforce.phoenix.jdbc.PhoenixDriver.(PhoenixDriver.java:58) ... 11 更多

首先,我认为类路径有两个默认的 xml,它会抛出错误,因为这两个中的一个来自一些旧版本的 hbase jar。但是类路径没有 hbase jar。它只有一个phoenix-2.0.1-client.jar。之后我尝试了以下事情

  1. 在 hbase-site.xml 中将“hbase.default.for.version.skip”设置为 true 并将其添加到类路径
  2. 在 hbase-default.xml 中将“hbase.default.for.version.skip”设置为 true
  3. 只是为了实验的缘故,我还尝试删除 hbase-default.xml。

到目前为止没有任何效果。结果是恒定的。我正在使用 cloudera hbase cdh 4.4 。任何帮助将不胜感激。提前致谢。

4

1 回答 1

0

相关:https ://groups.google.com/forum/#!topic/phoenix-hbase-user/GpeGDDjEH_g

解决方案似乎是从 phoenix--client.jar (或 phoenix-core-.jar )中删除 META-INF/services/java.sql.Driver ,而是使用 Class.forName("com.salesforce.phoenix.jdbc .PhoenixDriver") 在您的代码中某处(在尝试打开连接之前),因为 Jboss 似乎对 jar 重新排序与 tomcat 不同。

这对我有用(假设 phoenix 安装在本地 maven 存储库中):

mkdir /tmp/myjar 
cd /tmp/myjar  
cp ~/.m2/repository/com/salesforce/phoenix-core/3.0.0-SNAPSHOT/phoenix-core-3.0.0-SNAPSHOT.jar ./
jar -xvf phoenix-core-3.0.0-SNAPSHOT.jar
rm META-INF/services/java.sql.Driver 
rm phoenix-core-3.0.0-SNAPSHOT.jar
jar -cvf phoenix-core-3.0.0-SNAPSHOT.jar  ./
cp phoenix-core-3.0.0-SNAPSHOT.jar ~/.m2/repository/com/salesforce/phoenix-core/3.0.0-SNAPSHOT/

re-build the webapp  and deploy to Jboss:
cd ~/phoenix-restservice
mvn clean install

JBoss/Phoenix 集成的附加技巧 - Jboss 抛出此错误,因为它默认包含 Resteasy JAX-RS 实现,并且 Hbase 使用 Jersey JAX-RS jar,这会导致冲突(如在Jboss AS 7 上部署 Jersey webapp):

 "org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011232: Only one JAX-RS Application Class allowed"

修复添加到 ~/your_phoenix_restservice/src/main/webapp/WEB-INF/web.xml:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>

在启动时初始化 hbase 连接也是一个好主意,这可以使用 InitServlet 来完成,如JBoss at Work: A Practical Guide, p.260 中所述

作为旁注,您介意为 phoenix 开源您的 rest api 版本吗?这对我们和其他一群人都有帮助。

于 2014-01-28T00:56:33.330 回答