大数据入门:WordCount程序解析

大数据入门:WordCount程序解析


为一个顽固的家伙写的,都要考试了还不让我给详细讲一下,我就想白眼死你!!!


一、输入

输入源可以是一个文件,也可以是包含多个文件的文件夹。
具体的只需要在程序的文件输入路径中指定就可以。这里以一个txt文件为例:
大数据入门:WordCount程序解析


二、程序解析

(1)我们需要了解MapReduce(MR)的过程
大数据入门:WordCount程序解析

(2) 程序代码

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class WordCount {
    //Map阶段    参数是map的输入key、value,输出的key、value
    public static class WcMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //读取每一行,所以类型是LongWritable
            String line = value.toString();
            //将每一行的单词按空格切分(注意这里要看文件单词的间隔符是空格还是\t。。。)
            String[] strs = line.split(" ");
            //Map的输出key、value
            for (String s:strs){
                Text outkey = new Text(s);
                IntWritable outvalue = new IntWritable(1);
                context.write(outkey,outvalue);
            }
        }
    }
    
    //Reduce阶段,Map的输出是Reduce的输入       ,输入的key、value, 输出的key、value
    public static class WcReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int count = 0;
            //将相同的key进行合并,value累加
            for (IntWritable n:values){
                count += n.get();
            }
            context.write(key,new IntWritable(count));
        }
    }
    
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Job job = Job.getInstance();
        //简记 4  2  2  1
        //Map的输出key、value映射
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        
		//可以省略
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        
        //Mapper类、Reduce类的映射
        job.setMapperClass(WcMapper.class);
        job.setReducerClass(WcReduce.class);
        
        //输入文件和输出文件的路径
        FileInputFormat.setInputPaths(job,new Path("E:\\input.txt"));
        FileOutputFormat.setOutputPath(job,new Path("E:\\output"));
        
        job.waitForCompletion(true);
    }
}

三、输出

(1)控制台输出:
大数据入门:WordCount程序解析
(2)具体的输出是一个文件夹
大数据入门:WordCount程序解析大数据入门:WordCount程序解析


四、需要注意的地方

  1. Map和Reduce类不要忘了static关键字,否则会出错
    大数据入门:WordCount程序解析
  2. 各个阶段的输入输出格式类型不要弄混
  3. 下执行一次之前务必要改输出文件夹名称
    大数据入门:WordCount程序解析
  4. Job提交过程的4221