之前的hdfs是对集群上的文件进行管理,进行增删改查等操作,只针对文件本身,不针对文件内容。
而MapReduce则是对文件内容进行管理。
MapReduce采用的是“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个从节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单来说,MapReduce就是”任务的分解与结果的汇总“。
大部分人接触MapReduce的第一个例子就是次数统计WordCount了吧?hadoop的example中自带有,可以直接运行,下载了src包后也能直接查看源码。
这里给一个自己做的wordcount例子:
package MapReduce;
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;
import java.io.IOException;
import java.util.StringTokenizer;
// 在分布式计算中,MapReduce框架负责处理了并行编程里分布式存储、工作调度,负载均衡、容错处理以及网络通信等复杂问题
// 处理过程可高度抽象为Map与Reduce两个部分
// 其中Map部分负责把任务分解成多个子任务,Reduce部分负责把分解后多个子任务的处理结果汇总起来
public class WordCount {
// Map过程需要继承org.apache.hadoop.mapreduce包中Mapper类,并重写其map方法
public static class doMapper extends Mapper<Object, Text, Text, IntWritable>
//第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型
{
public static final IntWritable one = new IntWritable(1);//定义一个固定值,相当于int One=1
public static Text word = new Text();//Text类相当于java中的String
@Override
// map()参数:(Object)key-该行的首字母相对于文本文件的首地址的偏移量;(Text)line-文本文件中的一行内容(以回车符为行结束标记)
// 截取每行的每个单词,value值计为1
protected void map(Object key, Tex