1.MapReduce编程模型
MapReduce编程模型包括两个阶段:Map阶段和Reduce阶段。Map阶段将大任务拆分成若干个小任务并分发给各个节点进行计算;Reduce阶段将各个节点的计算结果汇总得到最终的结果。
关于MapReduce编程模型有以下几点需要说明:
- Map的输出就是Reduce的输入;
- 所有的输入和输出都是<key, value>的形式
- Map的输入用<k1,v1>表示,输出用<k2, v2>表示;
- Reduce的输入用<k3, v3>表示,输出用<k4, v4>表示;
- 其中k3=k2, v3=[v2],即v3是v2的集合;
- 所有的数据类型都必须是Hadoop自己的数据类型:字符串Text,整型IntWritable,长整型LongWritable,浮点型Doubleable,空类型NullWritable;
- 因为Hadoop的数据类型都实现了Hadoop的序列化,可以作为Map和Reduce的输入和输出对象;
- MapReduce程序包括三个Java Class:Job = map + reduce
2.MapReduce数据处理流程
下面以WordCount程序为例,说明MapReduce数据处理的流程。WordCount程序中的数据过程如下图所示:
关于MapReduce数据处理流程的几点说明:
- MapReduce程序可以从HDFS、HBase、Hive等数据源加载数据;
- MapReduce程序分为加载数据阶段、map阶段、combine阶段、shuffle阶段、reduce阶段、排序阶段、输出结果阶段等;
- combine分为map端和reduce端,可以将各个进程的结果进行初步的合并,以提高数据传输效率;
- shuffle(混洗)阶段相当于groupby和distinct操作:按照k2分组,将v2组成一个集合,将相同的k2发给同一个reduce进程处理;
- 排序阶段是将文本结果默认按照字典顺序升序排列,便于输出;
- MapReduce程序可以计算结果输出到HDFS、HBase、Hive等介质;