1. MR执行原理
1. MAP阶段
2. Reducer
3.shuffle阶段
2.实操
1. 导入 maven 配置
org.apache.hadoop
hadoop-mapreduce-client-common
2.7.1
org.apache.hadoop
hadoop-mapreduce-client-core
2.7.1
2. 配置自定义的 Mapper
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;
/**
* 第一个参数: 读取到的字节位置
* 第二个参数: 读取到的内容的类型
* 第三个参数: 输出的key的类型
* 第四个参数: 输出的value的类型
*/
public class WorkMapper extends Mapper {
/**
* 读取的内容
* hello a
* hello b
* hello c
* hello d
* 异步方法,每次执行一行
* @param key 开始的字符数 此处就是 0 8 16 24
* @param value 读取到指定行的文本 如 hello a ...
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] lineValues = value.toString().split(" ");
for (String line : lineValues) {
context.write(new Text(line), new IntWritable(1));
}
}
}
3. 配置Reducer
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* mapper >> reducer
* 第一个参数 输入的第一个参数
* 第二个参数 输入的第二个参数
* 第三个参数 输出的第一个参数
* 第四个参数 输出的第二个参数
*/
public class WorkReduce extends Reducer {
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
Integer count = 0;
for (IntWritable value : values) {
count += value.get();
}
context.write(key, new IntWritable(count));
}
}
4. 启动类
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 WorkDriver {
public static void main(String[] args) throws Exception {
// 设置操作Hadoop的用户,如果用户不是root,需要做此操作
System.setProperty("HADOOP_USER_NAME","root");
// windows 需要设置,并且要配置 环境变量
System.setProperty("hadoop.home.dir", "E:\\dev\\hadoop");
//1. 创建连接类
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS","hdfs://192.168.80.111:9000");
// 2. 创建查询 任务
Job job = Job.getInstance(configuration);
// 指定主执行类
job.setJarByClass(WorkDriver.class);
// 指定的 Mapper 类
job.setMapperClass(WorkMapper.class);
//指定 Mapper输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 指定 自定义的 Reducer
job.setReducerClass(WorkReduce.class);
// 指定 Reducer 输出的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//输入文件的地址
FileInputFormat.setInputPaths(job,new Path("/input/wordcount"));
// 输出文件的地址 地址要不存在
FileOutputFormat.setOutputPath(job,new Path("/output/out1"));
boolean isSuccess = job.waitForCompletion(true);//执行
System.out.println(isSuccess);
}
}