私はJavaでアーカイブプログラムを書いています。アーカイブされるファイルは、すでに HDFS に存在します。HDFS のある場所から別の場所にファイルを移動できる必要があり、最終的なファイルは Gzip で圧縮されます。移動するファイルは非常に大きくなる可能性があるため、HDFS API を使用してファイルを移動および圧縮すると、非常に非効率になる可能性があります。そのため、mapreduce ジョブをコードに記述して、それを実行できると考えていました。
ただし、MapReduce API を使用してこれらのファイルをコピーし、gzip 形式で出力する方法を示す例を見つけることができませんでした。実際、mapreduce を使用して HDFS 内のファイルをコピーする方法のプログラム例を見つけるのに苦労しています。
MapReduce API を使用してこれを達成する方法について、誰かが光を当てることができますか?
編集:これは、Amar が私に与えてくれたヘルプから適応された、これまでのジョブ構成コードです。
conf.setBoolean("mapred.output.compress", true);
conf.set("mapred.output.compression.codec","org.apache.hadoop.io.compress.GzipCodec");
Job job = new Job(conf);
job.setJarByClass(LogArchiver.class);
job.setJobName("ArchiveMover_"+dbname);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//job.setMapperClass(IdentityMapper.class);
//job.setReducerClass(IdentityReducer.class);
job.setInputFormatClass(NonSplittableTextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setNumReduceTasks(0);
FileInputFormat.setInputPaths(job, new Path(archiveStaging+"/"+dbname+"/*/*"));
FileOutputFormat.setOutputPath(job, new Path(archiveRoot+"/"+dbname));
job.submit();
LogArchiver クラス内にある NonSplittableTextInputFormat のクラス宣言を次に示します。
public class NonSplittableTextInputFormat extends TextInputFormat {
public NonSplittableTextInputFormat () {
}
@Override
protected boolean isSplitable(JobContext context, Path file) {
return false;
}
}