本章首先介绍了 MapReduce 的基础知识和工作流程,然后通过单词统计和二次排序两个案例介绍了如何利用 MapReduce 进行编程。
Hadoop 支持多种语言但对 Java 支持最好,在编写 MapReduce 函数时,需要新建 3 个类:Mapper 类、Reducer 类、main 类。另外,前两个类也可以作为内部类放到 main 类中。
Mapper 类需要集成 MapRecude API 所提供的Mapper 类并重写 map() 方法,Reduce() 类同理。
一、MapReduce 概述
MapReduce 是 Hadoop 系统中最重要的计算引擎,它不仅直接支持交互式应用,基于程序的应该,还是 Hive 组件的基础。
1. 分布式并行计算
1) 分布式计算
一个任务,拆分成无数个小任务,将这些小任务派发给多台计算机进行计算,最后将结构进行汇总以得到最终的结果。
分解后的任务直接相互独立,计算结果几乎互不影响,对实时性要求不高。
2) 并行计算
允许让多条指令以平行方式同时进行计算的模式,包括时间与空间并行两种方式。
时间并行:多条流水线同时作业
空间并行:使用多种计算资源(如多个处理器)执行并发计算。
2. MapReduce 的含义
针对大规模集群种的分布式文件即下并行处理的计算模型。
MapReduce 主要将数据处理任务拆分为 M(映射)和 Reduce(规约)两个任务。
例如,要统计一个班的数学成绩,数学老师让数学课代表统计它所在班的数学成绩。数学课代表就让每一组的组长统计它们组的数学成绩,相当于 Map 任务,而数学课代表统计处理每个组所报上来的数学成绩,就是 Reduce 任务。由此可以看出,MapReduce 充分体现了 “分而治之”的思想:把一个复杂的任务拆分成小的任务并行处理,从而提高任务的处理速度。
3. MapReduce 的特点
开发简单易于实现;良好的可扩展性:动态增加节点的方式;高容错性:如果集群中某计算节点出现故障,使得作业执行失败,MapReduce 可自动将作业分配到可用的计算节点上重新执行。
计算局限(不适合数据事务处理或单一请求处理)
性能局限
应用局限
二、MapReduce 的工作流程
输入分片和数据格式化,Map过程,Shuffle 过程,Reduce 过程,结果输出
1. 输入分片和数据格式化
首先,MapReduce 将存储在 HDFS 中的大规模数据集切分成独立的输入分片,每一个输入分片对应一个 Map 任务。
输入分片是一个逻辑概念,因此对输入数据集的切分也是一种逻辑切分。
此外,由于 Map 任务的输入要i去是键值对的形式,所以需要对输入分片进行格式化,即对输入处理成 <key, balue>
形式的数据,然后再传递给 Map 任务。
2. Map 过程
利用 Map() 函数来处理数据
3. Shuffle 过程
通常,Map() 后的输出需要进行一系列处理才交给 Reduce() 任务,这一系列处理过程被称作洗牌(Shuffle)过程。
这一系列包括有“分区”、“排序”、“合并”、“滥写”、“归并”等。
4. Reduce 过程
Reduce() 任务接收归并排序后的数据流,并对已有序的相同 key 的键值对调用一次 Reduce() 函数。
另外,Reduce() 任务的输出结果经过输出格式化后再输出到文件系统中,并且输出结果文件名默认为“part-r-00000”开始,逐渐递增。
三、案例解析——单词统计编程
1. 案例描述
假设在 hdfs://hadoop0:9000/jqe/wc/data
中存在两个文本文件(文件中仅有字符串和空格),分别是 words1.txt
和 words2.txt
。
其中,word1.txt内容如下:
1 | this is a good dog |
word2.txt内容如下:
1 | this is a bad dog |
要求 计算这两个文件的单词频数
,输出结果 按照单词的字母顺序进行排序
,并输出到 两个文件中(以字母 g 分隔开来)
。另外,还要对输出数据进行格式化:单词和词频之间以~~~~~隔开
。
2. 设计思路
根据分析,单词统计程序可分为 7 个模块,分别是输入、输入分片及其格式化、设计 map() 函数、分区、设计 reduce() 函数、输出格式化、输出。
- 指定输入文件位置;
- 将两个文件切分成两个输入分片,对输入分片进行格式化,如文件按行分解,从而形成以 key 为偏移量、value 为行内容的键值对;
- 设计 map() 函数,将键值对的 value 按空格分解成一个个单词,生成 <word, l>形式的键值对。
- 设计分区函数,将 key 的首字母小于 g 的键值对划分为 1 个分区,其余的划分在另一个分区。
- 设计 reduce() 函数,将输入的 <word, list(value)> 形式(如 <”ls”,{1, 1}>)的数据进行汇总,生成以 key 为单词、value 为单词频数的键值对。
- 系统默认的输出格式为“单词+空格+单词频数”的形式,若要输出特定样式的数据,需要对输出结果进行格式化,使得单词与但磁盘技能书之间以“~~~~~”间隔。
- 指定单词统计程序的输出结果文件位置。
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~