1

私は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;
    }
}
4

1 に答える 1

0

とを使用してカスタム jar 実装を作成できます。プレーン テキスト ファイルの代わりに、出力として gzip ファイルを生成できます。で次の構成を設定します。IdentityMapperIdentityReducerrun()

conf.setBoolean("mapred.output.compress", true); 
conf.set("mapred.output.compression.codec","org.apache.hadoop.io.compress.GzipCodec");

入力と出力のファイル数が同じであることを確認するには、出力ファイルを gzip する必要があるだけで、次の 2 つのことを行う必要があります。

  1. NonSplittableTextInputFormat を実装する
  2. reduce タスクをゼロに設定します。

マッパーごとに 1 つのファイルが読み取られるようにするにはTextInputFormat、次のように を拡張できます。

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;
public class NonSplittableTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

上記の実装を次のように使用します。

job.setInputFormatClass(NonSplittableTextInputFormat.class);

reduce タスクをゼロに設定するには、次の手順を実行します。

job.setNumReduceTasks(0);

これで作業は完了しますが、最後にもう 1 つ、ファイル名が同じではありません。しかし、これについても回避策があるはずです。

于 2013-02-14T18:24:54.950 に答える