2

私は、残りのデータを取得し、フェニックスを使用してhbaseに同じデータを挿入するWebアプリを開発しようとしています。アプリケーションを tomcat にデプロイしようとしましたが、正常に動作します。ただし、jboss へのデプロイ中に次のランタイム例外がスローされます。

原因: java.lang.RuntimeException: hbase-default.xml ファイルは古いバージョンの HBase (null) 用のようです。このバージョンは org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java で 0.94.7 です。 :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 もっと見る

最初に、クラスパスには2つのデフォルトxmlがあり、2つのうちの1つがhbase jarの古いバージョンのものであるため、エラーがスローされると考えました。しかし、クラス パスには hbase jar がありません。phoenix-2.0.1-client.jar は 1 つだけです。その後、次のことを試しました

  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

解決策は、 META-INF/services/java.sql.Driver を phoenix--client.jar (または phoenix-core-.jar ) から削除し、代わりに Class.forName("com.salesforce.phoenix.jdbc を使用することです。 .PhoenixDriver") Jboss は tomcat とは異なる方法で jar を並べ替えているように見えるため、コードのどこか (接続を開こうとする前) に変更します。

これは私にとってはうまくいきました(フェニックスがローカルの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 はこのエラーをスローします ( 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 接続を初期化することをお勧めします。これは、JBoss at Work: A Practical Guide、p.260 で説明されているように、InitServlet を使用して実行できます。

補足として、Phoenix 用の REST API のバージョンをオープンソース化してもよろしいですか? これは、私たちと他の多くの人々にとって役に立ちます。

于 2014-01-28T00:56:33.330 に答える