【问题标题】:Issues while deploying an application war containing phoenix client in jboss在 jboss 中部署包含 phoenix 客户端的应用程序战争时出现问题
【发布时间】:2014-01-28 11:36:43
【问题描述】:

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

Caused by: java.lang.RuntimeException: hbase-default.xml 文件好像是for and old version of HBase (null), this version is 0.94.7 在 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) 在 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 。 任何帮助将不胜感激。 提前致谢。

【问题讨论】:

    标签: jboss hbase phoenix


    【解决方案1】:

    相关: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,这会导致冲突(如 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 中所述

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2016-07-14
      • 2011-01-24
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多