MapReduce的wordcount实现

MapReduce的wordcount主要分为两个阶段,Map和Reduce阶段,具体流程如下图。

(1)MapReduce有一个默认的排序规则,是按照字典顺序排序的(大写字母顺序->小写字母顺序->数字顺序)

(2)part-r-00000文件 中的part是分区的意思,MapReduce默认只有一个分区

(3)_SUCCESS  是执行MapReduce成功的标志文件

在yarn上查看MapReduce的运行过程,分为三个阶段

map阶段的程序

package wc;

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 WordCountMapper extends Mapper<LongWritable ,Text ,Text,IntWritable>{
	
	protected void map(LongWritable key1,Text value1,Context context)
		throws IOException,InterruptedException {
		/*
		 * context  表示Mapper的上下文
		 * 上文:HDFS
		 * 下文:Mapper
		 */
		//数据:I love Beijing
		String data = value1.toString();
		
		//分词
		String[] words = data.split(" ");
		
		//输出K2  V2
		for(String w:words) {
			context.write(new Text(w), new IntWritable(1));
		}
	}
}

Reduce阶段的程序

package wc;

import java.io.IOException;

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

public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
	
	protected void reduce(Text k3,Iterable<IntWritable> v3,Context context) throws IOException, InterruptedException {
		/*
		 * context是reduce的上下文
		 * 上文
		 * 下文
		 */
		//对v3求和
		int total = 0;
		for(IntWritable v:v3) {
			total += v.get();
		}
		
		//输出        k4   单词         v4   频率
		context.write(k3, new IntWritable(total));
	}

}

主程序

package wc;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

public class WordCountMain {

	public static void main(String[] args) throws Exception {
		
		//创建一个job和任务入口
		Job job = Job.getInstance(new Configuration());
		//main方法所在的class
		job.setJarByClass(WordCountMain.class);
		
		//指定job的mapper和输出的类型<k2 v2>
		job.setMapperClass(WordCountMapper.class);
		job.setMapOutputKeyClass(Text.class);   //k2的类型
		job.setMapOutputValueClass(IntWritable.class);   //v2的类型
		
		//指定job的Reducer和输出的类型<k4 v4>
		job.setReducerClass(WordCountReducer.class);
		job.setOutputKeyClass(Text.class);    //k4的类型
		job.setOutputValueClass(IntWritable.class);   //v4的类型
		
		//指定job的输入和输出
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		
		//执行job
		job.waitForCompletion(true);
		
		
	}

}

在程序的过程中出现的错误

第一行多出现了一个数字1,是因为在test.txt文件中,最后多写了空格

这种情况是reducer出现了问题

多写了一个r字母

正确的结果为

猜你喜欢

转载自blog.csdn.net/liuzhuang2017/article/details/81638208