7个实例全面掌握Hadoop MapReduce

本文旨在帮您快速了解 MapReduce 的工作机制和开发方法,解决以下几个问题:
MapReduce 基本原理是什么?
MapReduce 的执行过程是怎么样的?
MapReduce 的核心流程细节
如何进行 MapReduce 程序开发?(通过7个实例逐渐掌握)

文章中提供了程序实例中涉及到的测试数据文件,可以直接下载使用。

关于实践环境,如果您不喜欢自己搭建Hadoop环境,可以下载使用本教程提供的环境,实践部分内容中会介绍具体使用方法。

通过学习并实践完成后,可以对 MapReduce 工作原理有比较清晰的认识,并掌握 MapReduce 的编程思路。

大纲:
一、MapReduce 基本原理
二、MapReduce 入门示例 - WordCount 单词统计
三、MapReduce 执行过程分析
实例1 - 自定义对象序列化
实例2 - 自定义分区
实例3 - 计算出每组订单中金额最大的记录
实例4 - 合并多个小文件
实例5 - 分组输出到多个文件
四、MapReduce 核心流程梳理
实例6 - join 操作
实例7 - 计算出用户间的共同好友
五、下载方式

一、MapReduce基本原理

MapReduce是一种编程模型,用于大规模数据集的分布式运算。

1、MapReduce通俗解释

图书馆要清点图书数量,有10个书架,管理员为了加快统计速度,找来了10个同学,每个同学负责统计一个书架的图书数量。

张同学统计 书架1
王同学统计 书架2
刘同学统计 书架3
……

过了一会儿,10个同学陆续到管理员这汇报自己的统计数字,管理员把各个数字加起来,就得到了图书总数。

这个过程就可以理解为MapReduce的工作过程。

2、MapReduce中有两个核心操作

(1)map

管理员分配哪个同学统计哪个书架,每个同学都进行相同的“统计”操作,这个过程就是map。

(2)reduce

每个同学的结果进行汇总,这个过程是reduce。

3、MapReduce工作过程拆解

下面通过一个景点案例(单词统计)看MapReduce是如何工作的。

有一个文本文件,被分成了4份,分别放到了4台服务器中存储

Text1:the weather is good
Text2:today is good
Text3:good weather is good
Text4:today has good weather

现在要统计出每个单词的出现次数。

处理过程

(1)拆分单词

map节点1

输入:“the weather is good”
输出:(the,1),(weather,1),(is,1),(good,1)

map节点2

输入:“today is good”
输出:(today,1),(is,1),(good,1)

map节点3

输入:“good weather is good”
输出:(good,1),(weather,1),(is,1),(good,1)

map节点4

输入:“today has good weather”
输出:(today,1),(has,1),(good,1),(weather,1)

(2)排序

map节点1

map节点2

map节点3

map节点4

(3)合并

map节点1

map节点2

map节点3

map节点4

(4)汇总统计

每个map节点都完成以后,就要进入reduce阶段了。

例如使用了3个reduce节点,需要对上面4个map节点的结果进行重新组合,比如按照26个字母分成3段,分配给3个reduce节点。

Reduce节点进行统计,计算出最终结果。

这就是最基本的MapReduce处理流程。

4、MapReduce编程思路

了解了MapReduce的工作过程,我们思考一下用代码实现时需要做哪些工作?

在4个服务器中启动4个map任务
每个map任务读取目标文件,每读一行就拆分一下单词,并记下来次单词出现了一次
目标文件的每一行都处理完成后,需要把单词进行排序
在3个服务器上启动reduce任务
每个reduce获取一部分map的处理结果
reduce任务进行汇总统计,输出最终的结果数据

但不用担心,MapReduce是一个非常优秀的编程模型,已经把绝大多数的工作做完了,我们只需要关心2个部分:

map处理逻辑——对传进来的一行数据如何处理?输出什么信息?
reduce处理逻辑——对传进来的map处理结果如何处理?输出什么信息?

编写好这两个核心业务逻辑之后,只需要几行简单的代码把map和reduce装配成一个job,然后提交给Hadoop集群就可以了。

至于其它的复杂细节,例如如何启动map任务和reduce任务、如何读取文件、如对map结果排序、如何把map结果数据分配给reduce、reduce如何把最终结果保存到文件等等,MapReduce框架都帮我们做好了,而且还支持很多自定义扩展配置,例如如何读文件、如何组织map或者reduce的输出结果等等,后面的示例中会有介绍。

二、MapReduce入门示例:WordCount单词统计

WordCount是非常好的入门示例,相当于helloword,下面就开发一个WordCount的MapReduce程序,体验实际开发方式。

1、安装Hadoop实践环境

您可以选择自己搭建环境,也可以使用打包好的Hadoop环境(版本2.7.3)。

这个Hadoop环境实际上是一个虚机镜像,所以需要安装virtualbox虚拟机、vagrant镜像管理工具,和我的Hadoop镜像,然后用这个镜像启动虚机就可以了,下面是具体操作步骤:

(1)安装virtualbox

下载地址:https://www.virtualbox.org/wiki/Downloads

(2)安装vagrant

因为官网下载较慢,我上传到了云盘

Windows版
链接: https://pan.baidu.com/s/1pKKQGHl
密码: eykr

Mac版
链接: https://pan.baidu.com/s/1slts9yt
密码: aig4

安装完成后,在命令行终端下就可以使用vagrant命令。

(3)下载Hadoop镜像

链接: https://pan.baidu.com/s/1bpaisnd
密码: pn6c

(4)启动

加载Hadoop镜像
vagrant box add {自定义镜像名称} {镜像所在路径}

例如您想命名为Hadoop,镜像下载后的路径为d:\hadoop.box,加载命令就是这样:
vagrant box add hadoop d:\hadoop.box

创建工作目录,例如d:\hdfstest。

进入此目录,初始化
cd d:\hdfstest
vagrant init hadoop

启动虚机
vagrant up

启动完成后,就可以使用SSH客户端登录虚机了
IP 127.0.0.1
端口 2222
用户名 root
密码 vagrant

在Hadoop服务器中启动HDFS和Yarn,之后就可以运行MapReduce程序了
start-dfs.sh
start-yarn.sh

2、创建项目

注:流程是在本机开发,然后打包,上传到Hadoop服务器上运行。

新建项目目录wordcount,其中新建文件pom.xml,内容:

然后创建源码目录src/main/java

现在的目录结构

3、代码

mapper程序:src/main/java/WordcountMapper.java

内容:

这里定义了一个mapper类,其中有一个map方法。MapReduce框架每读到一行数据,就会调用一次这个map方法。

map的处理流程就是接收一个key value对儿,然后进行业务逻辑处理,最后输出一个key value对儿。

Mapper

相关文章

相关标签/搜索