0

私はHadoopが初めてです。Hadoop 0.22 を使用しています。ドライバーでは、次のコードを使用しました。

    Job job = Job.getInstance(configuration);
    ...
    job.addArchiveToClassPath(new Path(JAR_DIR);
    ...

Map クラスでは、ローカル クラスパスに jar を追加するためにどのコードを使用する必要がありますか?

詳細

マップで必要なジョブがあり、フェーズ htmlunit.jar を減らします。この jar を上記のコードを使用してクラスパスに追加しますが、ジョブを送信すると、htmlunit 参照を使用する行に ClassNotFoundException があります。上記のコードの場合大丈夫です。DistributedCache は、タスクトラッカーのクラスパスに jar を自動的に追加します。何が問題なのですか? ジョブを送信するときにオプション -libjars htmlunit.jar も使用する必要がありますか? 別の Hadoop コンポーネントを使用する必要がありますか?

4

1 に答える 1

0

何もする必要はありません。

jarをジョブクラスパスに追加すると、あなたが言っていることは

「マップのクラスパスにこれを含めてジョブを減らす」

マッパーとリデューサーが Mapper と Reducer の基本クラスから拡張されている限り、それは「そのまま機能」します。

注目に値するのは、必要な個々の Jar ごとに addFileToClassPath を代わりに使用することです。

別の方法 (私たちがこれを行います) は、ソースと依存関係を含む単一の jar を作成することです。

通常どおりコード jar をビルドし、jar に「lib」という名前のサブディレクトリを作成し、ここにすべての依存関係 jar を追加します。そうすれば、ジョブ全体が自己完結型になり、分散キャッシュに他の jar を追加することを心配する必要がなくなります。

たとえば、次の内容の jar があるとします。

/com/example/Something.class
/com/example/SomethingElse.class
/lib/dependency.jar
/lib/dependency2.jar

(jar は単なる zip ファイルなので、通常の zip 作成ユーティリティを使用してビルドできます)

さまざまな理由から、依存関係の .class ファイルを jar に直接追加するよりもパフォーマンスが向上します。

于 2012-04-15T17:02:26.337 に答える