1,概念
mapreduce 运算框架主要实现hadoop 的数据处理,数据处理中 流经过5个节点。
数据流:input -> spilt -> map -> shuffle -> reduce(最后reduce输出)
1.1,input:是将被运算的数据切成默认64M的快(block),方便后续运算。
1.2,split:切片,将 input 中的快按照行切成片(键值对),方便后续 map 运算。
1.3,map(开发):
对 split 的片(行)进行数据处理,处理成键值对。
workcount map 数据处理:将每行拆分成每一个单词作为输出键,个数设置为1 作为输出值
1.4,shuffle:
将所有的 map 运算结果都重新按照键分组,输出键值对。
wordcount 中 shuffle 将 map 的相同键的数据合并成一条,值是一个固定值为1的数组。
1.5,reduce(开发):
将shuffle 的结果集做数据处理。
wordcount 的数据处理:将键对应的值(值为1的数字)做累加,既得出我们的每个单词出现个数。
1.6,输出(output)
2,maprecue 开发
准备工作:
1)新建 Map/Reduce Project 项目 new -> project -> Map/Reduce Project :wordcountdemo
2)增加配置文件 core-site.xml,log4j.xml
新建 resource 文件夹放入配置文件:项目 -> new -> Source Folder
3)新建一个class WordCountJob(开发 map,开发 reduce,)
package org.kgc1803.demo;
import java.io.IOException;
import java.util.StringTokenizer;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 词频
* @author hduser
*
*/
public class WordCountJob {
/**
* 开发 map
* @author hduser
* 第一个参数:map 输入键的类型
* 第二个参数:map 输入值的类型
* 第三个参数:map 输出键的类型
* 第四个参数:map 输出值的类型
*/
public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{
/**
* 每一个切片会执行一次map方法
* wordcount map 把 malue 拆分成单个单词
* keyIn:是每一行的键
* valueIn:是每一行的值
* context:是上下文容器,用于将 map 的结果输出到下一步
* @throws InterruptedException
* @throws IOException
*/
public void map(Object keyIn,Text valueIn,Context context) throws IOException, InterruptedException{
//固定值1,作为输出值
IntWritable valueOut = new IntWritable(1);
Text keyOut = null;
//按空格,逗号,~~ 拆分
StringTokenizer token = new StringTokenizer(valueIn.toString());
//按照迭代器用法使用
while(token.hasMoreTokens()){
String key = token.nextToken();
keyOut = new Text(key);
context.write(keyOut, valueOut);
}
}
}
//开发reduce