一、MapReduce-分布式计算系统
1.含义:
MapReduce是一个基于集群的高性能并行计算平台。
MapReduce也是一个并行计算与运行软件框架。
MapReduce也是一个并行程序设计模型与方法。
2.工作原理:
Mapper:分割/提取
-流程
-读取文件每行数据
-按需要的形式进行分割
-产生键值对<K,V>
-按key值排序,分组
-输出<K,V>
eg:读取
-产生键值对<java 1><c 1><php 1><java 1>
-排序后<c 1><java 1><java 1><php 1>
-分组后<c {1}><java {1,1}><php {1}>
Reducer:数据清洗-shuffle/结果汇总
-对Mapper键值对操作
例如累加、批量修改
-输出原有或新类型键值对<K,V>
eg:<c {1}><java {1,1}><php {1}>
新键值对:<c 1><java 2><php 1>
Driver:设置对应类及输入输出/执行任务
-获取配置对象Configuration
-新建任务对象Job
-指定Mapper/Reducer组件
Mapper/ReduerClass OutputKeyClass OutputValueClass
-(自定义) 分区、分区数量
-输入输出路径
-提交Job
waitForCompletion
二、JAVA 实现
操作文件:(根目录下wordcount)
java c c c++ python
hadoop java python
php mysql c++ java
php
Mapper:
package wc;
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;
/**
* mapper组件
* 前两个参数固定:LongWritable,Text
*
* 输出格式为 <String,int> --> Text,IntWritable
*/
public class CountMapper extends Mapper<
LongWritable, Text, Text , IntWritable>{
@Override
protected void map(LongWritable key, Text value, Mapper<
LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
//获取每一行数据并转变为String
String line=value.toString();
//line="java c c c++ python" 按照空格切分,得到字符串数组
String[] strs=line.split(" ");
//遍历数组得到每一个单词
for(String str:strs){
//按照指定格式输出结果:java 1
if(!str.equals("")){
context.write(new Text(str), new IntWritable(1));
}
}
}
}
-继承Mapper类并实现map方法
-Mapper四个参数< >
-默认输入类型LongWritable,Text (自定义可改变)
-输出类型为Text,IntWritable对应输出类型<String,int>
Reducer:
package wc;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
* Reducer组件
* Reducer组件的输入就是mapper的输出
* java,3
* ↑ ↑
* Text,IntWritable
* 指定Reducer组件的输出格式
*
*/
public class CountReducer extends Reducer<
Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//定义保存结果int变量
int res=0;
//遍历 累加操作
for(IntWritable value:values){
res+=value.get();//获取得到当前value值的int类型
}
//将结果输出->最终结果文件
context.write(key, new IntWritable(res));
}
}
对Mapper得到的键值对累加并写出 (输入输出类型保持不变)
Driver:
package wc;
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;
/**
* 驱动程序,用来执行MapReduce任务
*
*
*/
public class CountDriver {
public static void main(String[] args) throws Exception {
//1.获取配置信息
Configuration conf=new Configuration();
//2.创建任务对象
Job job=Job.getInstance(conf);
//3.指定mapper组件的相关内容
job.setMapperClass(CountMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//4.指定Reducer组件相关内容
job.setReducerClass(CountReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
/*FileInputFormat.setInputPaths(job,
new Path("hdfs://hadoop:9000/mr/wc/in/wordcount"));*/
//指定输出路径的时候,其实是在指定结果文件存放的目录
//该目录必须是不存在的
/*FileOutputFormat.setOutputPath(job,
new Path("hdfs://hadoop:9000/mr/wc/in/out"));*/
//5.指定输入输出路径
FileInputFormat.setInputPaths(job,
new Path("wordcount"));
FileOutputFormat.setOutputPath(job,
new Path("G:\\count"));
//6.提交job任务
job.waitForCompletion(true);
}
}
输出文件在G:\count
文件内容:
c 2
c++ 2
hadoop 1
java 3
mysql 1
php 2
python 2