2011-03-28 3 views
0

저는 Hadoop에 처음입니다. 유명한 "WordCount"프로그램을 실행하려고했습니다. - 전체 단어 수를 계산합니다. Hadoop-0.20.2를 사용하는 파일. 단일 노드 클러스터를 사용하고 있습니다.Hadoop0.20.2를 사용하여 표준 "WordCount"프로그램을 실행할 때 올바른 출력을 얻지 못함

내 프로그램 :

import java.io.File; 가져 오기 java.io.IOException; 가져 오기 java.util. *;

import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf. ; import org.apache.hadoop.io.; import org.apache.hadoop.mapreduce. *; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 내가 하둡-0.20를 사용하여이 프로그램을 실행하면 내용

ABCDABCD

다음있다

공용 클래스 단어 수 {

public static class Map extends 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, Context context) throws IOException, InterruptedException { 
     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     while (tokenizer.hasMoreTokens()) { 
      word.set(tokenizer.nextToken()); 
      context.write(word, one); 
     } 
    } 
} 

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { 

    public void reduce(Text key, Iterator<IntWritable> values, Context context) 
    throws IOException, InterruptedException { 
     int sum = 0; 
     while (values.hasNext()) { 
      ++sum ; 
     } 
     context.write(key, new IntWritable(sum)); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    Job job = new Job(conf, "wordcount");   
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1]));   
    job.setJarByClass(WordCount.class); 
    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    job.setMapperClass(Map.class); 
    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(IntWritable.class);  

    job.setReducerClass(Reduce.class);   
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class);    
    job.setNumReduceTasks(5);   
    job.waitForCompletion(true);  

} 

}

한다고 가정 입력 파일 a.txt이있다. 2 (명확성을 위해 명령을 표시하지 않음), 오는 출력은 A 1 A 1 B 1 B! CC1 D! D 1 틀린 거예요 실제 출력이 있어야 할 것입니다

: 로 2 B 2 C 2 D 2

이 "단어 수"프로그램이 꽤 표준에 실습이 무엇인지 정말 모르겠습니다입니다 이 코드가 잘못되었습니다. mapred-site.xml, core-site.xml 등과 같은 모든 구성 파일의 내용을 올바르게 작성했습니다.

누군가 나를 도울 수 있다면 감사하겠습니다.

감사합니다.

답변

0

이 코드는 실제로 로컬 mapreduce 작업을 실행합니다. 이를 실제 클러스터에 제출하려면 fs.default.namemapred.job.tracker 구성 매개 변수를 제공해야합니다. 이 키는 host : port 쌍을 사용하여 시스템에 매핑됩니다. mapred/core-site.xml과 같습니다.
데이터를 로컬 디스크가 아닌 HDFS에서 사용할 수 있는지 확인하고 줄이기 횟수를 줄여야합니다. 감속기 당 약 2 건입니다. 이 값을 1로 설정해야합니다.

관련 문제