2017-05-03 72 views
0
package com.delhi; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 

public class UppercaseDriver extends Configured implements Tool { 

    public int run(String[] args) throws Exception{ 
     if(args.length !=2){ 
      System.out.printf("Two parameters are required- <input dir> <output dir>n"); 
     return -1;} 


    Configuration conf = new Configuration(); 
    Job job=Job.getInstance(conf); 
    job.setJobName("uppercase"); 
    job.setJarByClass(UppercaseDriver.class); 
    job.setMapperClass(UpperCaseMapper.class); 
    job.setReducerClass(UpperCaseReduce.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(LongWritable.class); 
    FileInputFormat.setInputPaths(job,new Path(args[0])); 
    FileOutputFormat.setOutputPath(job,new Path(args[1])); 
    //job.setNumReduceTasks(1); 
    boolean success = job.waitForCompletion(true); 
    return success ?0:1; 
    } 
    public static void main(String[] args) throws Exception { 
     int exitcode = ToolRunner.run(new UppercaseDriver(), args); 
     System.exit(exitcode); 
    } 

} 

這是驅動程序。減速器在mapreduce wordcount程序中沒有被驅動程序調用

接下來就是減速程序:

package com.delhi; 

import java.io.IOException; 

import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 

public class UpperCaseReduce extends Reducer< Text,LongWritable, Text, LongWritable>{ 



    public void reduce(Text key, Iterable<LongWritable> value, 
     org.apache.hadoop.mapreduce.Reducer.Context context) 
     throws IOException, InterruptedException { 

     int sum=0; 
     System.out.println("how +++++++++++++++++" + key); 
     for(LongWritable st: value){ 
      sum = (int) (sum + st.get()); 

     } 
     System.out.println("how +++++++++++++++++" + key); 
    context.write(key, new LongWritable(sum)); 
} 

} 

接下來就是映射器程序:

package com.delhi; 

import java.io.IOException; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class UpperCaseMapper extends Mapper<Object, Text, Text, LongWritable>{ 

@Override 
protected void map(Object key, Text value, 
     org.apache.hadoop.mapreduce.Mapper.Context context) 
     throws IOException, InterruptedException { 
    String line = value.toString(); 
    String arr[] = line.split(" "); 
    System.out.println("hello++++++++++++++++++++++++++++"); 
    for(String st: arr){ 
    //context.write(new Text(st.toUpperCase().trim()),new LongWritable(1)); 
    context.write(new Text(st),new LongWritable(1)); 
    } 
} 
} 

從已經存在的解決方案,我發現了,在這類問題outputkeyclass和outputvalueclass的應與減速機。我認爲我採取妥善妥善的部分。我的情況@Override for reduce不起作用。我正在使用hadoop 7.2.3。我也嘗試使用修剪功能。問題是wordcount不會發生。我只給我「單詞1」,輸出文件中的任何單詞。 我從不同的問題開始,我就這樣結束了。請幫助我。 謝謝。

+0

確實很難設法解決你的問題。你有錯誤嗎?減速機是否在運轉?問一個問題,並明確你遇到的問題。 –

+0

感謝您的回覆。我得到這樣的輸出:1 1個 文件1個 文件1 文件1 1 是1 爲1 爲1 所以,簡單的字計數不working.My問題是爲什麼?我認爲減速機不工作。 – Angshusuri

+0

請編輯問題以使其更具可讀性。從問題開始,然後發佈代碼,然後添加您希望的任何細節。添加您以前的評論作爲問題的一部分。 – vefthym

回答

0

因此,如果你添加一個@Override註釋您reduce方法,你得到一個錯誤:

Method does not override method from its superclass

所以,你有一個問題,即該方法簽名不匹配之一Reducer

您有:

public void reduce(Text key, Iterable<LongWritable> value, 
        org.apache.hadoop.mapreduce.Reducer.Context context) 

如果將其更改爲:

public void reduce(Text key, Iterable<LongWritable> value, Context context) 

錯誤消失。由於您的reduce方法不覆蓋任何它不會被調用的方法,並且它會使用與您的輸出相匹配的Identity reduce。

+0

謝謝你。這是工作。 – Angshusuri