5

私はHadoopマップを変更しています-現在コンパイルされ、変更なしで正常に実行されるジョブを減らします。

仕事の一環として、ファイルを配信するためにS3に接続します。

私は(非常に単純な)s3Connectorクラスを開発し、それをEclipseでテストして実行し、それをreduceジョブにフックしました。Hadoopでジョブを実行するには、プロジェクトをjarファイルとしてエクスポートし、Hadoopから呼び出す必要があります。jarファイルはEclipseから問題なくコンパイルおよびエクスポートされているようですが、hadoopで実行すると、java.lang.VerifyError例外が発生します。

java.lang.VerifyError: (class: com/extrabux/services/S3Connector, method: 
connectToS3 signature: ()V) Incompatible argument to function

他のいくつかの投稿では、競合するjarバージョンの依存関係がある可能性があると述べていますが、Eclipseビルドパスで、指定したライブラリの最新のjarファイルをすべて追加し、ビルドパスの順序の一番上にプッシュしました。

これは、私がそれを次のように分離できるのと同じくらい簡単です。

import org.jets3t.service.impl.rest.httpclient.RestS3Service;
import org.jets3t.service.security.AWSCredentials;

public class S3Connector {

protected RestS3Service s3Service;
protected AWSCredentials awsCredentials;


public S3Connector()
{
    this.awsCredentials= new AWSCredentials("my secret 1", "my secret 2");
}


public void connectToS3() throws Exception
{
    this.s3Service = new RestS3Service(this.awsCredentials);
}  

}

その単純なクラスでさえ死ぬでしょう..同じメッセージ。コンストラクターとRestS3ServiceでAWSクレデンシャルをコメントアウトするとすぐに、問題は解消されます。基本的に、それは日食からのある種のライブラリエクスポートの問題だと思いますが、それを見つける方法がわかりません。

4

1 に答える 1

4

これを理解しました。hadooplibdirにあった古いバージョンのjets3tjarがありました

hadoopコマンドラインスクリプトは、libディレクトリ内のすべてのjarをループし、ビルドする最後の実行済みコマンドラインコマンドのクラスパスに物理的に追加します。0.6.0 jarのこのコマンドラインクラスパスは、jarファイルでエクスポートしていた適切な0.8.0jarをオーバーライドしていました。0.6.0バージョンにはRestS3Serviceに指定されたコンストラクターがなかったため、java.lang.VerifyErrorがスローされていました。Hadoopから0.6.0libを削除することで、すべてが順調に進みました。

于 2011-01-14T02:05:53.617 に答える