MapReduce原理及实例分析

前言

由于最近开始涉及MR程序的编写,之前会一点HIVE,对MR接触不多,不论从原理还是实际操作上,都有些障碍,终于在今天柳暗花明,将这一过程记录下,与大家分享~

环境准备


在VM上搭建好LINUX虚拟机,并安装配置好HADOOP2.2.0,我这里是单节点的伪分布式

在eclipse中安装hadoop插件

对我们这种MR的新手而言,最好在本地有一个HADOOP运行环境,这样有许多好处:

如果我们每次写完MR程序,都打成JAR包上传至线上服务器上运行,那么每次MR运行的时间非常长,也许等待了许久,运行结果和我们预期不一致,又得改程序重新来一边,这会有一点痛苦!

在我们本地的HADOOP上运行MR程序非常快,就那么几秒,更加重要的是,我们可以再

本地准备输入文件去测试MR的逻辑,这对调试/开发程序非常方便!

实例及原理分析


假设,我们有这样的输入文件:

cate-a spu-1 1

cate-a spu-1 2

cate-a spu-2 3

cate-a spu-2 4

cate-a spu-3 5

cate-a spu-3 6

cate-a spu-1 7

cate-a spu-4 8

cate-a spu-4 9

cate-a spu-1 8

...

我们希望得到分cate,分spu的总和,并且取分cate分spu的TOP3

如上图示,大致描述了MAP/REDUCE的运行流程:

  • 输入文件+InputFormat  提供给MAP
  • 需要清楚提供给MAP的KEY1/VALUE1是什么?MAP准备输出的KEY2/VALUE2是什么?
  • MAP输出后,会进行分区操作,也就是决定KEY2/VALUE2发到哪些reduce上
  • 分区由job.setPartitionerClass决定
  • 在同一个分区内,会对KEY2进行排序,依据是job.setSortComparatorClass,

    如果没有设置则根据KEY的compareTo方法

  • 接下来进入分组阶段,会构造KEY3和VALUE迭代器
  • 分组的依据是job.setGroupingComparatorClass,只要比较器比较的相同就在同一组
  • KEY3/VALUE迭代器交给reduce方法处理

步骤:

  • 自定义KEY

KEY应该是可序列化,可比较的,只需要注意实现WritableComparable即可。

重点关注compareTo方法。

@Override
public int compareTo(Cate2SpuKey that) {
System.out.println("开始对KEY进行排序...");
if(cate2.equals(that.getCate2())){
return spu.compareTo(that.getSpu());
}
return cate2.compareTo(that.getCate2());
}
  • 分区

分区,是KEY的第一次比较,extends Partitioner 并提供getPartition即可。

这里根据cate分区。

  • 分组

需要注意的是,分组类必须提供构造方法,并且重载

public int compare(WritableComparable w1, WritableComparable w2) 。这里根据cate,spu分组。

通过上述的,就可以取得分cate分spu的SUM(counts)值了。

通过eclipse hadoop插件,可以方便我们上传测试文件到HDFS,可以浏览,删除HDFS文件,更加方便的是,就像运行普通JAVA程序一样的运行/调试MR程序(不在需要打成JAR包),让我们可以追踪MR的每一步,非常方便进行逻辑性测试~

那么怎么取分cate分spu的TOP3呢?

我们只需要把上一个MR的输出文件,作为另一个MR的输入,并且以cate+counts 为KEY ,以spu为VALUE,根据cate分区,分组,排序的话:cate相同情况下,根据counts倒序;

最后在reduce阶段取TOP3即可。

@Override
protected void reduce(Cate2CountsKey key, Iterable<Text> values,
Reducer<Cate2CountsKey, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
System.out.println("reduce...");
System.out.println("VALUES迭代前... key:" + key.toString());
System.out.println("VALUES迭代前... key:" + key.getCounts());
int top = 3;
for(Text t : values){
if(top > 0){
System.out.println("VALUES迭代中... key:" + key.toString());
System.out.println("VALUES迭代中... key:" + key.getCounts());
context.write(new Text(key.getCate2() + "\t" + t.toString()), 
new Text(key.getCounts() 
+ ""));
top--;
}
}
System.out.println("reduce over...");
}

那么到现在,分组取TOP就完成了。

一个疑问:reduce阶段中的KEY到底是什么?


在上面例子中的取TOP3的MR中,我们是以cate+counts为KEY,spu为VALUE。

cate作为分区,分组的依据,排序根据同一个cate下counts倒序。如下图所示:

那么reduce方法中的KEY是什么?

spu1,spu4,spu3...是VALUES中的,那么这个迭代器的对应KEY是什么呢?

是cate+42吗?还是其他?

在VALUES迭代过程中,这个KEY会变化吗?

我们可以看下ECLIPSE中的控制台打印输出的内容:

从打印上来看,可以分析出如下结论:

分组后,交给reduce方法处理的KEY是同一组的所有KEY的第一个KEY,并且在VALUES迭代过程中,KEY并不会重新NEW,而是利用SETTER反射的方式重新设置属性值,这样在VALUES迭代过程中取得的KEY都是与之对应的KEY了。

时间: 2024-08-08 13:58:10

MapReduce原理及实例分析的相关文章

Camera图像处理原理及实例分析-重要图像概念

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

Camera图像处理原理及实例分析

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

Android Touch事件原理加实例分析

Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. Android Touch事件原理描述 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP. 当屏幕中包含一个ViewGr

Linux设备驱动:kobject原理与实例分析

1.Sysfs文件系统 "sysfsis a ram-based filesystem initially based on ramfs. It provides ameans to export kernel data structures, their attributes, and thelinkages between them to userspace." Linux2.6内核引入了sysfs文件系统.sysfs被看成是与proc同类别的文件系统.sysfs把连接在系统上的设

Hadoop MapReduce原理及实例

MapReduce是用于数据处理的一种编程模型,简单但足够强大,专门为并行处理大数据而设计. 1. 通俗理解MapReduce MapReduce的处理过程分为两个步骤:map和reduce.每个阶段的输入输出都是key-value的形式,key和value的类型可以自行指定.map阶段对切分好的数据进行并行处理,处理结果传输给reduce,由reduce函数完成最后的汇总. 例如从大量历史数据中找出往年最高气温,NCDC公开了过去每一年的所有气温等天气数据的检测,每一行记录一条观测记录,格式如

Hadoop初学指南(6)--MapReduce的简单实例及分析

本文在上一节的基础上通过一个简单的MR示例对MapReduce的运行流程进行分析. 假设有两行数据,分别是hello you,hello me,我们要统计其中出现的单词以及每个单词出现的次数. 所得的结果为 hello   2 you     1 me      1 (1)大致运行流畅 1.解析成2个<k,v>,分别是<0, hello you><10, hello me>.调用2次map函数. 2.执行map任务 3.map输出后的数据是:<hello,1>

MapReduce多种join实现实例分析(二)

上一篇<MapReduce多种join实现实例分析(一)>,大家可以点击回顾该篇文章.本文是MapReduce系列第二篇. 一.在Map端进行连接使用场景:一张表十分小.一张表很大.用法:在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeCache中取出该小表进行join key / value解释分割放到内存中(可以放大Hash Map等等容器中).然后扫描大表,看大表中的每条记录的join key /value值是否能够在内存中找到相同j

《深入理解mybatis原理1》 MyBatis的架构设计以及实例分析

<深入理解mybatis原理> MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现. 一.MyBatis的框架设计   注:上图很大程度上参考了iteye 上的chenjc_it   所写的博文原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中