在jboss中部署包含phoenix客户端的应用程序战争时遇到的问题

时间:2013-10-01 11:24:14

标签: jboss hbase phoenix

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

引起:java.lang.RuntimeException:hbase-default.xml文件似乎是和旧版本的HBase(null),这个版本是0.94.7 在org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java:68) at org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:100) 在org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:111) at 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) 在com.salesforce.phoenix.jdbc.PhoenixDriver。(PhoenixDriver.java:58) ......还有11个

首先我认为类路径有两个默认的xmls并抛出错误,因为其中一个来自某个旧版本的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。
  4. 到目前为止,没有任何工作。结果是不变的。我正在使用cloudera hbase cdh 4.4。 任何帮助将非常感激。 提前谢谢。

1 个答案:

答案 0 :(得分: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似乎以不同于tomcat的方式重新排序jar。

这对我有用(假设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导致冲突(如Deploying a Jersey webapp on Jboss AS 7中所示):

 "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

中所述

作为旁注,你介意为凤凰开源你的休息api版吗?这对我们和其他一些人都有帮助。