【推荐】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();
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4427158/blog/3151298