MapReduce
1. 简介
1.1 MapReduce是Hadoop中进行分布式计算的框架
1.2 MapReduce会将整个计算拆分为
MapReduce在计算的时候,会将要处理的文件进行切片,注意:切片和切块不一样
Map阶段:每一个切片都会对应一个MapTask
初步理解:MaoReduce在处理数据时,会将数据切分成片
Map阶段
- MapReduce在处理数据时,会将数据切分成片
- 数据将会被分片处理,处理的出来的数据类型是:键值对(k,v)
- 多个分片处理完结果后,将相同的键对应,以及他们的值放到一组
Reduce阶段
键这些Map的数据交给Reduce处理,Reduce将数据进行汇总
2.实际操作
代码实现:
结构图:
WordCountMapper.java
package MapRduces01;
/**
* 代码实现功能,统计字符串
*/
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;
public class WordCountMapper
extends Mapper<LongWritable,Text,Text,IntWritable> {
/*
* Mapper是Hadoop的顶级父类
* Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
* MapReduce要求被传输的类型必须能够被序列化
* MapReduce的序列化机制默认使用的是AVRO
* KEYIN:输入键的类型,现阶段这个泛型表示行偏移量,是以字节来计算的
* VALUEIN:指的是输入类型的值,现阶段表示读取这一行的数据
* KEYOUT:输出的键的类型
* VALUEOUT:输出的值的类型
*/
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
/*
* key:行偏移量
* value:读取的一行数据
* context:环境参数,利用这个参数将结果输出给Reduce
* 数据存放在value中
*/
//将value转成字符串,对空格进行划分
String[] arr = value.toString().split(" ");
for (String str : arr) {
//Map阶段的键值对
context.write(new Text(str), new IntWritable(1));
}
}
}
WordCountReducer.java
package MapRduces01;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer
extends Reducer<Text, IntWritable, Text, IntWritable>{
/*
* Reducer<K, V, K, V>
* 用来收集Map的结果
* key = hello
* value = 1,1,1,1,1,1
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
// Reducer在计算过程中自动的将相同的键对应的值放在一起
// 将这一组值转化为一个迭代器values
int sum = 0;
//遍历这个迭代器,求和
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
WordCoutDriver.java
package MapRduces01;
import java.io.IOException;
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;
/*
* 定义完Map类,Reduce类后,我们需要定义一个入口类
*/
public class WordCountDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//向MapReduce申请一个任务用于执行程序
Job job = Job.getInstance();
//申请完成后,设置Mapper类
job.setMapperClass(WordCountMapper.class);
//设置Reducer类
job.setReducerClass(WordCountReducer.class);
//设置驱动类
job.setJarByClass(WordCountDriver.class);
//设置Map的执行结果类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置Reducer的执行结果类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置输入的文件
FileInputFormat.addInputPath(job, new Path("hdfs://10.42.103.110:9000/txt/words.txt"));
//设置输出的路径
//要求输出的路径不存在,有result下面的路径会自动创建
FileOutputFormat.setOutputPath(job, new Path("hdfs://10.42.103.110:9000/result/wordcount"));
//提交事务,等待结束
job.waitForCompletion(true);
}
}
HDFS中的文件结构是:
由于Windows对hadoop兼容不是很好,所以需要配置windows
运行win***会出现一个黑框一闪而过,说明成功!!!
否则会出现一下结果,缺少****.dll文件,说明的你的系统是盗版的,这时候把备用的dll文件放到系统文件中
解决办法:
此外,还需要配置两个环境变量
不要在path中写%HADOOP_HOOM%\bin
hadoop不兼容这种写法
自己配置Path,就是hadoop路径后面加bin
在src中加入日志文件会打印更多信息
运行成功
其中源码资源以及配置资源,请留言获取,留邮箱~
欢迎大家留言交流