ジョブのクラスパスに他の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_CLASSPATH
env変数を構成している場合を除く)。