第三次实验报告MapReduce
第三次实验报告MapReduce(编程调试wordcount程序 生成jar包在虚拟机上运行)
实验目的:
MapReduce原理及操作
1.MapReduce原理
Ma和 Reduce,当向 MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每一个MaD任务处理输入数据中的一部分,当Ma0任务完成后,它会生成一些中间文件,这些中间文件将会作为 Reduce任务的输入数据。 Reduce任务的主要目标就是把前面干个Ma的输出汇到一起并输出。
2.Map过程
每个输入分片会让一个map任务来处理,默认情况下,以HDFs的个块的大小(默认为640)为一个分片,当然我们也可以设置块的大小。mao轴出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort. spill percent属性控朝),会在本地文件系统中创建一个益出文件,将读缓冲区中的数据写入这个文件
3.Reduce过程
Reduce会接收到不同map任务传来的数据,并且每个map博来的数据都是有序的。如果 reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由 marred.job. shuffle. merge. percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区的一定大小比例(由 marred.job. shuffle. merge. percent决定),则对数据合并后溢写到磁盘中
实验步骤
(一)定义Mapper类
package mapreduce.files;
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;
import org.apache.log4j.BasicConfigurator;
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
//对数据进行打散
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
BasicConfigurator.configure();
//输入数据 hello world love work
String line = value.toString();
//对数据切分
String[] words=line.split(" ");
//写出<hello, 1>
for(String w:words) {
//写出reducer端
context.write(new Text(w), new IntWritable(1));
}
}
}
(二)定义Reducer类
package mapreduce.files;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.log4j.BasicConfigurator;
public class WordCountReducer extends Reducer <Text, IntWritable, Text, IntWritable>{
protected void reduce(Text Key, Iterable values, Context context) throws IOException, InterruptedException {
BasicConfigurator.configure();
//记录出现的次数
int sum=0;
//累加求和输出
for(IntWritable v:values) {
sum +=v.get();
}
context.write(Key, new IntWritable(sum));
}
}
(三)定义Driver类
package mapreduce.files;
import java.io.IOException;
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.log4j.BasicConfigurator;
public class WordCountDriver {
public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException {
BasicConfigurator.configure();
// 设置root权限
System.setProperty(“HADOOP_USER_NAME”, “root”);
//创建job任务
Configuration conf=new Configuration();
Job job=Job.getInstance(conf);
//指定jar包位置
job.setJarByClass(WordCountDriver.class);
//关联使用的Mapper类
job.setMapperClass(WordCountMapper.class);
//关联使用的Reducer类
job.setReducerClass(WordCountReducer.class);
//设置Mapper阶段输出的数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置Reducer阶段输出的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置数据输入路径和文件名
FileInputFormat.setInputPaths(job, new Path(“d:\in\aa.txt”));
//设置数据输出路径
FileOutputFormat.setOutputPath(job, new Path(“d:\out”));
//提交任务
Boolean rs=job.waitForCompletion(true);
//退出
System.exit(rs?0:1);
}
}
(四)导出jar包
(五)在虚拟机上运行