1、MapReduce分布式计算框架
本章介绍了Hadoop的MapReduce分布式计算框架的基本概念、编程规范和词频统计实战等内容。从存储的大数据中快速抽取信息,进一步进行数据价值的挖掘,需要用到大数据的分布式计算技术的支持。Hadoop支持多种语言进行MapReduce编程,包括java、Python和C++等。本章从实战的角度出发,使用java编程语言通过一个词频统计案例的编码实现、编译、运行过程介绍了MapReduce编程。该程序的主要任务需求是:计算出给定文件中每个单词的出现频次,给定文件中单词和频数之间是用空格分割的,要求输出结果按照单词的字母进行排序,每个单词和其频数占一行形成结构化的统计分析结果。
在单机的运算环境下,如果输入文件是GB级别以上的,那么统计该文件中单词出现的频数非常耗时。在搭建好的Hadoop分布式大数据平台环境下,使用MapReduce,把计算任务分发到多个节点上并行运算,可以提高词频统计的效率
2、MapReduce简介
MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。
MapReduce运行在yarn集群。(资源调度的平台)
Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。
MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理,框架对 map 的输出进行排序,然后输入到 reduce 中。MapReduce 框架专门用于
3、wordcount经典案例介绍
这里以词频统计为例进行说明,MapReduce 处理的流程如下
Mrappmaster maptask reducetask
这里假设由一个文本,文本中的内容为:
Deer Bear River Car Car River Deer Car Bear |
这里单词与单词之间以空格隔开。现在要对单词进行统计,有如下几个阶段。
input : 读取文本文件;
splitting (拆分): 将文件按照行进行拆分,此时得到的 K1 行数,V1 表示对应行的文本内容;
mapping(映射):并行将每一行按照空格进行拆分,拆分得到的 List(K2,V2),其中 K2 代表每一个单词,由于是做词频统计,所以 V2 的值为 1,代表出现 1 次;
shuffling(洗牌):由于 Mapping 操作可能是在不同的机器上并行处理的,所以需要通过 shuffling 将相同 key 值的数据分发到同一个节点上去合并,这样才能统计出最终的结果,此时得到 K2 为每一个单词,List(V2) 为可迭代集合(注意每个List中的数据不一样),V2 就是 Mapping 中的 V2;
Reducing(化简):这里的案例是统计单词出现的总次数,所以 Reducing 对 List(V2) 进行归约求和操作(求List中数据的总和?),最终输出;
MapReduce 编程模型中 splitting 和 shuffing 操作都是由框架实现的,需要我们自己编程实现的只有 mapping 和 reducing,这也就是 MapReduce 这个称呼的来源。
4、MapReduce进程介绍
一个完整的mapreduce程序在分布式运行时有三类实例进程:
1)MrAppMaster:负责整个程序的过程调度及状态协调
2)MapTask:负责map阶段的整个数据处理流程
3)ReduceTask:负责reduce阶段的整个数据处理流程
5、MapReduce编程规范
考虑如下big.txt文件
其中行偏移量,第1行开头的偏移量为0,第2行开头的偏移量为13,第3行开头的偏移量为26,如此类推。注意行偏移量跟字符相关。因此k是永远不会重复的,这里可以不断的得到key-value的数据。比如:
进入到Map阶段数据处理的过程。需要自己定义一个MapTask来处理。Map方法中进行数据处理具体的逻辑。Map方法具体细节是每一行根据空格进行拆分。当该行数据(0, "hadoop spark")被Map对象读取到的时候,会马上执行Map方法。
经过无数次map方法执行后,可以得到一堆key-value的数据(k1,v1)。K1获取到的是单词,v1则是数字1。因此这个阶段出现的数据是。
("hadoop",1) ("spark",1) |
("hadoop",1) ("storm",1) |
("spark",1) ("storm",1) |
之后会进入shuffling的阶段。该阶段是hadoop帮我们搞定的。
k1.hashCode()方法实现了排序/分区。
该阶段实现的数据为k2 List(V2),这个阶段出现的数据是。
("hadoop",(1,1)) ("spark",(1,1)) ………… |
之后进入到reduce阶段。该阶段需要编写ReduceTask类,该类的对象需要进行数据处理的方法。处理细节就是对List(v2)集合的数据进行累加求和。
该阶段实现的数据为k3 V3。这个就是最终的结果了。
Hadoop经过集合累积后,发现出现了两次。
("hadoop",2) ………… |
这个就是MapReduce编程规范了。在编程的时候要对Map阶段和Reduce阶段进行业务逻辑的编写。
编程的时候,需要一个Driver类进行具体的描述:Map阶段要用哪个类,Reduce阶段要用哪个类。对整个词频统计作业的整合说明。
在Map阶段和Reduce阶段,都要进行数据的输入和输出。无论是输入还是输出,都是对key-value键值对进行数据处理。
如下则是具体的实现说明:
用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mapReduce程序的客户端)
1)Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(maptask进程)对每一个
2)Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)Reducetask进程对每一组相同k的
3)Driver阶段
整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象
6、wordcount经典案例的实现
需求: 在一堆给定的文本文件中统计输出每一个单词出现的总次数
7、分析数据准备
先启动hadoop
/export/servers/hadoop-3.1.2/sbin/start-dfs.sh /export/servers/hadoop-3.1.2/sbin/start-yarn.sh |
1.创建一个新的文件
cd /export/testdata vim big.txt |
2.向其中放入以下内容并保存(单词与单词之间通过空格隔开)
big.txt
Hello world hadoop Hive sqoop flume hello Kitty tom jerry world hadoop Kitty tom jerry world |
这些是要进行词频统计的数据。
3.上传到 HDFS
hadoop fs -mkdir -p /wordcount/input hadoop fs -put big.txt /wordcount/input |
在浏览器中打开 http://192.168.91.101:50070/explorer.html 并点击进入对应的目录,确认文件是否已经上传完成。