4

HBaseに接続する必要のあるScaldingジョブを作成しようとしていますが、HBaseタップの使用に問題があります。このサンプルプロジェクトに従って、 Twitter Mapleが提供するタップを使用してみましたが、使用しているHadoop / HBaseバージョンと、Twitterでクライアントとして使用されているバージョンとの間に互換性がないようです。

私のクラスターは、HBase0.92およびHadoop2.0.0-cdh4.1.3でClouderaCDH4を実行しています。HBaseに接続するScaldingジョブを起動するたびに、例外が発生します

java.lang.NoSuchMethodError: org.apache.hadoop.net.NetUtils.getInputStream(Ljava/net/Socket;)Ljava/io/InputStream;
    at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:363)
    at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:1046)
...

Twitter Mapleで使用されているHBaseクライアントはNetUtils、クラスターにデプロイされているバージョンのHadoopには存在しないメソッドを想定しているようです。

不一致が正確に何であるかを追跡するにはどうすればよいですか?HBaseクライアントはどのバージョンを期待しますか?これらの問題を軽減する一般的な方法はありますか?

多くの場合、クライアントライブラリはハードコードされたバージョンのHadoop依存関係でコンパイルされており、それらを実際にデプロイされたバージョンと一致させるのは難しいようです。

4

1 に答える 1

7

メソッドは実際に存在しますが、そのシグネチャが変更されています。基本的に、クライアントとサーバーに異なるバージョンのHadoopライブラリをインストールすることになります。サーバーでClouderaを実行している場合は、ClouderaのHBaseおよびHadoopライブラリを使用する必要があります。Mavenを使用している場合は、ClouderaのMavenリポジトリを使用できます。

ライブラリの依存関係はBuild.scalaで処理されているようです。私はまだScalaを使用していないので、そこで修正する方法が完全にはわかりません。

互換性を壊した変更は、 HADOOP-8350の一部としてコミットされました。テッド・ユーのコメントと回答を見てください。彼はHBaseで作業していて、同じ問題を抱えていました。彼のコメントによると、HBaseライブラリの新しいバージョンはこの問題を自動的に処理するはずです。

于 2013-03-29T00:46:42.057 に答える