2017-05-03 70 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