
WordCountMainWordCount主要分三部分:
WordCountMain、WordCountMapper、WordcountReducerWordCountMain: 用来统筹map逻辑以及reducer逻辑
WordCountMapper:
切分,编写map逻辑使得转换成 WordcountReducer:
编写reducer逻辑使得
转换成
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
//将map与reducer组织在一起
public class WordCountMain extends Configured implements Tool { //alt+enter实现方法
@Override
public int run(String[] strings) throws Exception {
//方法名:getInstance,需要参数,接收并获取返回值类型(Ctrl+Alt+V)
// Job.getInstance(super.getConf(),"wc"); 获取返回值类型后如下
Job job = Job.getInstance(super.getConf(), "wc");
// 获取的job用来组织起来MapReduce
// 1、读取文件解析成key value对 TextInputFormat
//通过job使用setInputFormatClass使得job与TextInputformat相关联 从而进行输入
job.setInputFormatClass(TextInputFormat.class);
//给TextInputFormat设置文件读取路径 Path路径
TextInputFormat.addInputPath(job, new Path(""));
//2、map逻辑
//通过job将Mapper引进来
job.setMapperClass(WordCountMapper.class);
//设置map的输出 输出k2 v2
job.setMapOutputKeyClass(Text.class);//k2
job.setMapOutputValueClass(IntWritable.class);//v2
//3~6 分区 排序 规约 分组
//7、ruducer逻辑
//同样通过job引进Reducer
job.setReducerClass(WordCountReducer.class);
//设置reduce输出
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//8、输出
//通过job使用setOutputFormatClass使得job与TextOutputFormat相关联从而进行输出
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path(""));
boolean b = job.waitForCompletion(true);
return b?0:1;
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
// ToolRunner.run(conf,new WordCountMain(),args); //alt + enter 抛出异常
// run方法有conf、tool、args三个参数,然后方法需要返回值
// 返回值快捷键 Ctrl + Alt +V 变形成如下
int run = ToolRunner.run(conf, new WordCountMain(), args);//alt + enter 抛出异常
// 对run方法获取返回值后,根据获取的返回值正常退出run方法
System.exit(run);
}
}
WordCountMapperimport org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; //k1 行偏移量(阿拉伯数字) LongWritable v1 行文本内容 Text //k2一个个单词 Text v2 数字1 IntWritable //public class WordCountMapper extends MapperWordCountReducer将key-value的类 型替代k1、v1、k2、v2 public class WordCountMapper extends Mapper { //map回车后得到如下 private Text k2 = new Text(); private IntWritable v2 = new IntWritable(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //map方法需要三个参数 k1 v1 上下文context;void无返回值 // 通过context。write()将数据写出 // context.write(k2,v2); 声明k2 v2 //对map方法传进来的k1 v1 进行处理 //将v1的类型转化为字符串并通过split进行切分,切分按照“,”进行 //split切分后返回的一定是String类型的数组,通过Ctrl+Alt+V接收返回值 // value.toString().split(",")通过Ctrl+Alt+V后如下 String[] words = value.toString().split(","); //将words数组中的数据遍历 iter+回车得到for循环 for (String word : words) { //通过k2.set()填充,将word放入k2 k2.set(word); v2.set(1); context.write(k2,v2); } // context.write(k2,v2);将其放入for循环中使数据被遍历后输出 } }
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; //public class WordCountReducer extends Reducer//k3 v3 聚合 public class WordCountReducer extends Reducer { //通过reduce+回车获取reduce方法 // private Text k3 =new Text();因为k2和k3相同所以直接用传进reduce方法的key(k2)代替k3 private IntWritable v3 = new IntWritable(); @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { // 没有返回值方法reduce k2 迭代器 context.write(k3,v3) //相同数据的key放在同一个reduce中 所以k2和k3都是一个东西 // 对传进来的数据进行遍历iter+回车获取for循环 int sum =0;//通过sum对v3求和 for (IntWritable value : values) { //通过value.get()获取传进来的value //通过Ctrl+Alt+V使得value.get()获取一个整数类型的返回值 int i = value.get(); sum += i; v3.set(sum);//放一个和 } context.write(key,v3); } }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)