mapreduce
1、概念:
它是一个分布式并行计算的应用框架
它提供相应简单的api模型,我们只需按照这些模型规则编写程序,
即可实现"分布式并行计算"的功能。
2、MAPREDUCE编程规范
编程有三个部分组成:
1、编写MapTask(负责map阶段的整个数据处理流程)
2、编写ReduceTask(负责reduce阶段的整个数据处理流程)
3、Driver:提供运行MapReduce环境的(负责整个程序的过程调度及状态协调)
3、wordcount实例
Shuffling是MapReduce内部自动执行,即是分组(分区过程),不需要用户编写程序
即是先按key进行排序,然后进行分区。
运行模式
1、集群运行模式
WcMapTask.java
package com.gec.wordcount;
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;
/**
* 作用:体现MapReduce的map阶段的实现
* KEYIN:输入参数key的数据类型
*VALUEIN:输入参数value的数据类型
* KEYOUT,输出key的数据类型
* VALUEOUT:输出value的数据类型
* 输入:
* map(key,value)=偏移量,行内容
*
* 输出:
* map(key,value)=单词,1
*
* 数据类型:
* java数据类型:
* int-------------->IntWritable
* long------------->LongWritable
* String----------->Text
* 它都实现序列化处理
*/
public class WcMapTask extends Mapper<LongWritable, Text,Text, IntWritable> {
/*
*根据拆分输入数据的键值对,调用此方法,有多少个键,就触发多少次map方法
* 参数一:输入数据的键值:行的偏移量
* 参数二:输入数据的键对应的value值:偏移量对应行内容
* */
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String words[] = line.split(" ");
for (String word:words
) {
context.write(new Text(word),new IntWritable(1));
}
}
}
WcReduceTask.java
package com.gec.wordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/*
* 此类:处理reducer阶段
* 汇总单词次数
* KEYIN:输入数据key的数据类型
* VALUEIN:输入数据value的数据类型
* KEYOUT:输出数据key的数据类型
* VALUEOUT:输出数据value的数据类型
*
*
* */
public class WcReduceTask extends Reducer<Text, IntWritable,Text,IntWritable> {
/*
* 第一个参数:单词数据
* 第二个参数:集合数据类型汇总:单词的次数
*
* */
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (IntWritable value : values) {
count+=value.get();
}
context.write(key,new IntWritable(count));
}
}
WcMrJob.java
package com.gec.wordcount;
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;
/*
0、指明Driver的类
1、指明运行map task的类
2、指明运行reducer task的类
3、指明输入文件的io流类型
4、指明输出文件的io流类型
*/
public class WcMrJob {
public static void main(String[]args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
//设置Driver类
job.setJarByClass(WcMrJob.class);
//设置运行那个map task
job.setMapperClass(WcMapTask.class);
//设置运行那个reducer task
job.setReducerClass(WcReduceTask.class);
//设置map task的输出key数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置reduce的输出key的数据类型和输出value的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指明要处理的数据 所在的位置
FileInputFormat.setInputPaths(job,"hdfs://hadoop0:9000/wordcount/input/big.txt");
//指定处理完成之后结果所保存的位置
FileOutputFormat.setOutputPath(job,new Path("hdfs://hadoop0:9000/wordcount/output/"));
//向yarn集群提交这个job
boolean res = job.waitForCompletion(true);
System.exit(res?0:1);
}
}
运行方式:
-
在idea上新建一个maven模板mapreducewordcount
步骤:File->new->model->maven
然后如图,点击下一步,完成
-
编辑上述java文件
-
在idea上使用package打包WcMrJob.java成jar包
-
复制打包后的 文件(在工程视图的targe找到生成的tar文件,然后复制到hadoop中)
-
启动hdfs和yarn
-
然后在集群的任意一个节点上用hadoop命令启动:$
hadoop
jar jar包名称 (main方法所在job类的全路径com.gec.bigdata.mrsimple.WordCountDriver inputpath outputpath