2012-02-12 10 views

答えて

3

あなたのマッパーは固定値1(ワードカウントの例と同じです)の固定キーを発行する必要があります。

単純に還元剤としてLongSumReducerを使用してください。

ジョブの出力は、キー "count"を持つレコードで、値は探しているレコードの数です。

同じLongSumReducerをコンバイナとして使用することで、パフォーマンスを大幅に向上させることができます。

+0

感謝を見つけることができますし、それが通常の減速と異なっていますか? –

+0

LongSumReducerは、必要なものを正確に実行する減速器の簡単な実装です。だから、自分で書く必要はありません。私は私の答えのドキュメントにURLを追加しました。 –

+0

私はファイル名をキーにしたいのですが、どうすればいいですか? –

4
  • あなたのマップは、各レコードの1を放出しなければならない、あなたのコンバイナは、それが(マップごとに小計)を得たすべて「1」の総和を放出しなければならない
  • を読ん
  • あなた減速は総計を放出しなければなりませんレコード数
0

job.getcounters()を使用して、ジョブの完了後にレコードごとに増えた値を取得します。 javaを使用してmapreduceジョブを作成する場合は、カウントメカニズムにenumを使用します。

0
import java.io.IOException; 

import java.util.*; 

import org.apache.hadoop.fs.Path; 

import org.apache.hadoop.io.*; 

import org.apache.hadoop.mapred.*; 

public class LineCount 

{ 
    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("Total Lines"); 

    public void map(LongWritable key, Text value, 
      OutputCollector<Text, IntWritable> output,Reporter reporter) 
      throws IOException 
    { 
     output.collect(word, one); 
    } 
} 

public static class Reduce extends MapReduceBase implements 
     Reducer<Text, IntWritable, Text, IntWritable> { 
    public void reduce(Text key, Iterator<IntWritable> values, 
      OutputCollector<Text, IntWritable> output, Reporter reporter) 
      throws IOException { 
     int sum = 0; 
     while (values.hasNext()) { 
      sum += values.next().get(); 
     } 
     output.collect(key, new IntWritable(sum)); 
    } 
} 

public static void main(String[] args) throws Exception { 
    JobConf conf = new JobConf(LineCount.class); 

    conf.setJobName("LineCount"); 
    conf.setNumReduceTasks(5); 
    conf.setOutputKeyClass(Text.class); 
    conf.setOutputValueClass(IntWritable.class); 

    conf.setMapperClass(Map.class); 
    conf.setCombinerClass(Reduce.class); 
    conf.setReducerClass(Reduce.class); 

    conf.setInputFormat(TextInputFormat.class); 
    conf.setOutputFormat(TextOutputFormat.class); 

    FileInputFormat.setInputPaths(conf, new Path(args[0])); 
    FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

    JobClient.runJob(conf); 
} 
} 
0

私はID MapperとID Reducerを使用しています。

これはMapper.classとReducer.classです。それからちょうど読むmap input records

これを得るために実際にコードを書く必要はありません。

1

希望している回答よりも優れた解決策があります。

各レコードに1を出力するのではなく、map()でカウンタをインクリメントし、cleanup()で各マップタスクの後にインクリメントしたカウンタを出力するだけです。

中間読み込み書き込みを減らすことができます。そして減速機は少数の値のリストだけを集める必要があります。

public class LineCntMapper extends 
    Mapper<LongWritable, Text, Text, IntWritable> { 

Text keyEmit = new Text("Total Lines"); 
IntWritable valEmit = new IntWritable(); 
int partialSum = 0; 

public void map(LongWritable key, Text value, Context context) { 
    partialSum++; 
} 

public void cleanup(Context context) { 
    valEmit.set(partialSum); 

    context.write(keyEmit, valEmit); 

} 
} 

あなたは完全な作業コードあなたは正確にLongSumReducer何であるかを教えてくださいすることができ、あなたのanwerためhere

+0

エレガントで効率的なソリューション。 – tlarchuk

関連する問題