1

外部jarでいくつかのメソッドを呼び出す単純なMapReduceコードを作成しました。このjarをhadoop/libフォルダーに追加しましたが、取得されています。シングルノードクラスターではすべて問題ありません。同じコードを実行したいマルチノードクラスターがあります。すべてのノードでjarを手動で追加する必要がないように、jarをdfsにコピーできる方法があるかどうかを知りたいです。すべてのjarを別のフォルダー(hadoop / libではない)に追加したいと思います。これを達成することは可能ですか?つまり、多くのjarファイルがあるフォルダーに外部参照を追加します。私はclouderaブログをフォローして同じことをしましたが、それでも役に立ちませんでした。これに関するポインタは本当に役に立ちます。私はhadoop1.0.4バージョンを使用しています。

PS:メインジョブjar内にすべての外部jarを追加しました。それでも、それは拾われていません。

4

1 に答える 1

2

ジョブのクラスパスに他のjarを含めるには、次の2つのメカニズムがあります。

それらをHDFSにまだ保存していない場合は、GenericOptionsParserの-libjars引数を使用できます。これにより、JobClientはjarをHDFSの一時ディレクトリにアップロードし、ジョブの分散キャッシュに含めます。これを機能させるには、ToolRunner.runインターフェースを介してジョブを実行する必要があります。

public class MyJob extends COnfigured implements Tool {
  public int run(String args[]) {
    Job job = new Job(getConf());
    // configure your job
    // ..

    return job.waitForCompletion() ? 0 : 1;
  }

  public static void main(String args[]) throws Exception {
    ToolRunner.run(new MyJob(), args));
  }
}

次に、次のようにジョブを実行します(jarクラスパスにjar 1〜3を追加します)。

#> hadoop jar myjob.jar MyJob -libjars jar1.jar,jar2.jar,jar3.jar [other args]

JarsがすでにHDFSにある場合は、jarを分散キャッシュに追加するだけです。

public int run(String args[]) {
  Job job = new Job(getConf());
  // configure your job
  // ..

  // acquire job configuration
  Configuration conf = job.getConf();

  // create a FileSystem
  FileSystem fs = FileSystem.get(fs);

  DistributedCache.addFileToClassPath(new Path("/myapp/jar1.jar"), conf, fs);
  DistributedCache.addFileToClassPath(new Path("/myapp/jar2.jar"), conf, fs);
  DistributedCache.addFileToClassPath(new Path("/myapp/jar3.jar"), conf, fs);

  return job.waitForCompletion() ? 0 : 1;
}

この2番目のメソッドの唯一の欠点は、ジョブ構成でこれらのjar内のクラスを参照できないことです(クライアント側にもコピーがあり、HADOOP_CLASSPATHenv変数を構成している場合を除く)。

于 2013-03-02T12:39:50.297 に答える