MapReduce示例

左心房为你撑大大i 提交于 2020-01-06 16:58:58

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

WordCount

map类

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;
/**
 * mapper
 * 负责从文件中一行一行读取单词 并根据给定的分隔符分割单词
 * 在对每个单词进行处理
 * 
 * 
 * mapper类要求指定的4个泛型
 * 
 * 由于java的数据类型在完成对象的序列化与反序列化效率较低,
 * 所以hadoop单独准备了一套数据类型
 * long---LongWritable
 * string----Text
 * int---IntWritable
 * 
 * 
 * KEYIN, 每次要读取文件的一行数据,指的是输入<key,value>中的key的数据类型
 * keyin的位置就是数据文件中每行数据的偏移量
 * VALUEIN, 就是数据文件中每行数据
 * KEYOUT, 输出时k的类型
 * VALUEOUT, 输出时v的类型
 * 
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
	//
	public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
		//1.把每个单词从hadoop的Text类型转换成java字符串类型
		String words = value.toString();
		//2.把1中的一行单词按照空格分割开
		String[] wordarr = words.split(" ");
		//遍历数组wordrr 每个单词没出现一次就计数1
		for (String word : wordarr) {
			context.write(new Text(word), new IntWritable(1));  //输出<k,v>
		/**
		 * 规则:按什么统计什么
		 * 按照什么:这个map输出的key
		 * 统计什么:这个map输出的value
		 */
		}
	}
}

reduce类

import static org.mockito.Matchers.intThat;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
 * reducer
 * 在MR中起到归并作用,就是需要汇总出所有的map的输出结果
 * 4个泛型
 * KEYIN,VALUEIN:输入中的<K,V>必须与map中的输出k,v保持一致
 * KEYOUT:就是最终显示的k类型
 * VALUEOUT:最终显示的v类型
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

	public void reduce(Text key, Iterable<IntWritable> values,Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		int count = 0;
		//values就是<k,v>中的v 是一个出现次数的集合[1,1,1,1,1]
		for (IntWritable value : values) {
			//count++  每次直接+1
			//get方法就是把value从hadoop io的数据类型转换成int类型
			count += value.get();
		}
		//输出结果
		context.write(key, new IntWritable(count));
	}
}

wordcount运行类

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;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class WordCountRunner implements Tool {
	
	//定义运行期间使用的配置信息对象
	private Configuration conf = null;
	
	@Override
	public Configuration getConf() {
		// TODO Auto-generated method stub
		return this.conf;
	}

	@Override
	public void setConf(Configuration conf) {
		// TODO Auto-generated method stub
		this.conf = conf;
	}

	@Override
	public int run(String[] arg0) throws Exception {
		// 1.使用配置信息对象创建任务对象
			//获取配置信息对象
			Configuration conf = this.getConf();
			Job job = Job.getInstance(conf,"wordcount");
		//2.向任务注册jar包所在位置
			//依靠当前类位置指明所在jar包位置
			job.setJarByClass(WordCountRunner.class);
		//3.向任务对象注册mapper
			//注册mapper类
			job.setMapperClass(WordCountMapper.class);
			//注册mapper输出的key的类型
			job.setMapOutputKeyClass(Text.class);
			//注册mapper输出的value的类型
			job.setMapOutputValueClass(IntWritable.class);
		//4.向任务对象注册reducer
			job.setReducerClass(WordCountReducer.class);
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);
		//5.向任务对象注册数据文件位置
			FileInputFormat.setInputPaths(job, new Path("/input"));
		//6.向任务对象统计结果输出文件位置
			FileOutputFormat.setOutputPath(job, new Path("/output"));
		return job.waitForCompletion(true)?0:1;
	}

	public static void main(String[] args) {
		try {
			ToolRunner.run(
					new Configuration(),//配置信息对象
					new WordCountRunner(),//要驱动哪个任务 
					args);//从命令行输出的参数  会被传入run方法
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!