第一次使用MapReduce进行数据处理,简单的进行记录(行业新人,如以下描述有错误部分,还望前辈指正,为谢!)
MapReduce分为Map 和Reduce 两块,Map主要是对数据进行切分排序,reduce进行累加计数
如下为代码块:
Mapper部分:分别获取每行数据,并对其按照用户要求进行拆分(下面代码是以空格进行拆分)进行拆分,通过遍历获取到每个每个拆分的数据对象,以key value进行计数。向磁盘输出Map结果
import 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;
/*
* mapper类
* 数据输入的类型K,V-->LongWritable,Text
* 数据输出类型K,V-->Text,IntWritable
* */
public class WCMap extends Mapper<LongWritable, Text,Text, IntWritable>{
//实现父类的快捷键alt+insert
@Override
/*context将map和reduce连接到一起。上下文
* */
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//获取一行数据
String line = value.toString();
//切分,按照空格切分
String[] fields = line.split(" ");
//遍历获取每个单词
for (String field : fields) {
//输出,每个单词拼接1(标记)(Java(k) 1(v))
context.write(new Text(field),new IntWritable(1));
}
}
}
Reduce部分:从磁盘中读取Map的输出结果,Reduce的输入类型和Map的输出数据类型是一样的,对Map的数据进行遍历,声明一个count进行计数,每当遍历到相同对象的时候count++,输出结果的类型由用户定义,将count的结果也按照键值对(K,V)输出到磁盘上。
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/*
* Reduce类
* 数据输入的类型K,V-->Text,IntWritable
* 数据输出类型K,V-->Text,IntWritable
* */
public class WCReduce extends Reducer<Text, IntWritable,Text, IntWritable> {
//crtl+o 实现父类方法
//Iterable 迭代器
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//定义一个计数器
int count =0;
//累加计数
for (IntWritable intWritable:values){
//intWritable 转化成int类型
count+=intWritable.get();
}
//输出
context.write(key,new IntWritable(count));
}
}
Driver部分:首先实例化配置文件,用来执行MapReduce,用job分别执行Mappe和Rdeucer的任务,需配置输出类型。因为是进行测试,所以我用的是本地文件进行统计,值得注意的是最终的输出路径需是不存在的文件夹,在输出时系统会为输出结果创建存储的文件夹。最后提交任务。
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 java.io.IOException;
public class WCDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//实例化配置文件
Configuration configuration = new Configuration();
//定义一个job任务
Job job = Job.getInstance(configuration);
//配置job的信息
job.setJarByClass(WCDriver.class);
//指定自定义的mapper到job以及mapper的输出数据类型到job
job.setMapperClass(WCMap.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定自定义的reduce到job以及reduce的输出数据类型(总输出的类型)到job
job.setReducerClass(WCReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//配置输入数据的路径
FileInputFormat.setInputPaths(job,new Path("F:\\lihuan\\wordcount.txt"));
//配置输出数据的路径
FileOutputFormat.setOutputPath(job,new Path("F:\\lihuan\\output\\0916"));
//提交任务
job.waitForCompletion(true);
}
}