2

マップ削減ジョブに取り組んでおり、出力ファイルにカスタム文字列を出力できるかどうか疑問に思っています。カウントも他の数量もありません。テキストの塊だけです。

これが私が考えていることの基本的なアイデアです

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        // this map doesn't do very much
        String line = value.toString();
        word.set(line);
        // emit to map output
        output.collect(word,one);

        // but how to i do something like output.collect(word)
        // because in my output file I want to control the text 
        // this is intended to be a map only job
    }
}

このようなことは可能ですか?これは、並列処理に Hadoop を使用してデータを変換するためのマップのみのジョブを作成することですが、必ずしも MR フレームワーク全体を使用する必要はありません。このジョブを実行すると、各マッパーの hdfs に出力ファイルが作成されます。

$ hadoop fs -ls /Users/dwilliams/output
2013-09-15 09:54:23.875 java[3902:1703] Unable to load realm info from SCDynamicStore
Found 12 items
-rw-r--r--   1 dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_SUCCESS
drwxr-xr-x   - dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_logs
-rw-r--r--   1 dwilliams supergroup    7223469 2013-09-15 09:52 /Users/dwilliams/output/part-00000
-rw-r--r--   1 dwilliams supergroup    7225393 2013-09-15 09:52 /Users/dwilliams/output/part-00001
-rw-r--r--   1 dwilliams supergroup    7223560 2013-09-15 09:52 /Users/dwilliams/output/part-00002
-rw-r--r--   1 dwilliams supergroup    7222830 2013-09-15 09:52 /Users/dwilliams/output/part-00003
-rw-r--r--   1 dwilliams supergroup    7224602 2013-09-15 09:52 /Users/dwilliams/output/part-00004
-rw-r--r--   1 dwilliams supergroup    7225045 2013-09-15 09:52 /Users/dwilliams/output/part-00005
-rw-r--r--   1 dwilliams supergroup    7222759 2013-09-15 09:52 /Users/dwilliams/output/part-00006
-rw-r--r--   1 dwilliams supergroup    7223617 2013-09-15 09:52 /Users/dwilliams/output/part-00007
-rw-r--r--   1 dwilliams supergroup    7223181 2013-09-15 09:52 /Users/dwilliams/output/part-00008
-rw-r--r--   1 dwilliams supergroup    7223078 2013-09-15 09:52 /Users/dwilliams/output/part-00009

1 つのファイルで結果を取得するにはどうすればよいですか? ID レデューサーを使用する必要がありますか?

4

2 に答える 2

4

1. output.collect(word)を実現するには、クラス NullWritableを利用できます。これを行うには、マッパーで output.collect(word, NullWritable.get())を使用する必要があります。NullWritable はシングルトンであることに注意してください。

2.複数のファイルを保持したくない場合は、リデューサーの数を 1 に設定できます。ただし、これにはネットワーク上で大量のデータ シャッフルが必要になるため、追加のオーバーヘッドが発生します。その理由は、Reducer は、マッパーが実行されていた n 個の異なるマシンから入力フォームを取得する必要があるためです。また、すべての負荷が 1 台のマシンに集中します。ただし、出力ファイルが 1 つだけ必要な場合は、間違いなく 1 つの mReducer を使用できます。conf.setNumReduceTasks(1)はそれを達成するのに十分なはずです。

いくつかの小さな提案:

  • 得られたファイルをローカル FSにコピーするため、 getmergeを使用することはお勧めしません。その結果、それをさらに使用するには、HDFS にコピーし直す必要があります。
  • 可能であれば、新しい API を使用してください。
于 2013-09-15T21:02:06.987 に答える
0

マップのみのジョブの場合、出力ファイルの数はマッパーの数と同じになります。レデューサーが必要な場合は、レデューサーの数と同じになります。hadoop dfs -getmerge <hdfs output directory> <some file>ただし、出力ディレクトリ内のすべての出力を 1 つのファイルにマージすることはいつでもできます。

TextOutputFormatなどを使用してプレーンテキストファイルを出力できますjob.setOutputFormat(TextOutputFormat.class)。次に、map上記のメソッドをOutputCollector<NullWritable, Text>andを使用するように変更しますoutput.collect(null, "some text")some textこれにより、すべてのレコードが書き込まれます。OutputCollector<Text, Text>タブ区切りの Key-Value が必要な場合は、 andに変更できますoutput.collect("key", "some text")。これはkey<tab>some text出力に表示されます。

于 2013-09-15T17:39:11.797 に答える