MapReduce概述&编程思想&WordCount案例
1.mapreduce定义和优缺点?
定义:
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
优点:
(1)MapReduce易于编程
(2)良好的扩展性
(3)高容错性
(4)适合PB级以上海量数据的离线处理
缺点:
(1)不擅长实时计算
(2)不擅长流式计算
(3)不擅长DAG(有向图)计算
2.mapreduce的数据类型
常用的数据类型对应的Hadoop数据序列化类型
String --> Text
Long --> LongWritable
Int --> IntWritable
Byte --> ByteWritable
Float --> FloatWritable
Double --> DoubleWritable
Boolean --> BooleanWritable
Map --> MapWritable
Array --> ArrayWritable
3.MapReduce的核心编程思想
1)分布式的运算程序往往需要分成至少2个阶段
2)第一个阶段的MapTask并发实例,完全并行运行,互不相干
3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出
4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
4.MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调
2)MapTask:负责Map阶段的整个数据处理流程
3)ReduceTask:负责Reduce阶段的整个数据处理流程。
5.查看官方的wordcount代码样例
采用反编译工具反编译源码,发现WordCount案例有Map类、Reduce类和驱动类,且数据的类型是Hadoop自身封装的序列化类型。
WordCount的设计思路:
首先,需要检查WordCount程序任务是否可以采用MapReduce来实现。适合用MapReduce来处理的数据集需要满足一个前提条件:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。在WordCount程序任务中,不同单词之间的频数不存在相关性,彼此独立,可以把不同的单词分发给不同的机器进行并行处理,因此可以采用MapReduce来实现词频统计任务。
其次,确定MapReduce程序的设计思路。思路很简单,把文件内容解析成许多个单词,然后把所有相同的单词聚集到一起,最后计算出每个单词出现的次数进行输出。
最后,确定MapReduce程序的执行过程。把一个大文件切分成许多个分片,每个分片输入给不同机器上的 Map 任务,并行执行完成“从文件中解析出所有单词”的任务。Map 的输入采用Hadoop默认的<key, value>输入方式,即文件的行号作为key,文件的一行作为value;Map的输出以单词作为key,1作为value,即<单词,1>表示单词出现了1次。Map阶段完成后,会输出一系列<单词,1>这种形式的中间结果,然后Shuffle阶段会对这些中间结果进行排序、分区,得到<key, value-list>的形式(比如<hadoop, <1,1,1,1,1>>),分发给不同的Reduce任务。Reduce任务接收到所有分配给自己的中间结果(一系列键值对)以后,就开始执行汇总计算工作,计算得到每个单词的频数并把结果输出到分布式文件系统。
WordCount的具体执行过程:
(1)执行WordCount的用户程序(采用MapReduce编写),会被系统分发部署到集群中的多台机器上,其中一个机器作为Master,负责协调调度作业的执行,其余机器作为Worker,可以执行Map或Reduce任务。
(2)系统分配一部分Worker执行Map任务,一部分Worker执行Reduce任务;MapReduce将输入文件切分成M个分片,Master将M个分片分给处于空闲状态的N个Worker来处理。
(3)执行Map任务的Worker读取输入数据,执行Map操作,生成一系列<key,value>形式的中间结果,并将中间结果保存在内存的缓冲区中。
(4)缓冲区中的中间结果会被定期刷写到本地磁盘上,并被划分为 R 个分区,这 R 个分区会被分发给R个执行Reduce任务的Worker进行处理;Master会记录这R个分区在磁盘上的存储位置,并通知 R个执行 Reduce任务的Worker来“领取”属于自己处理的那些分区的数据。
(5)执行Reduce任务的Worker收到Master的通知后,就到相应的Map机器上“领回”属于自己处理的分区。需要注意的是,正如之前在 Shuffle 过程阐述的那样,可能会有多个Map机器通知某个Reduce机器来领取数据,因此一个执行Reduce任务的Worker,可能会从多个Map机器上领取数据。当位于所有Map机器上的、属于自己处理的数据都已经领取回来以后,这个执行 Reduce 任务的 Worker 会对领取到的键值对进行排序(如果内存中放不下需要用到外部排序),使得具有相同key的键值对聚集在一起,然后就可以开始执行具体的Reduce操作了。
(6)执行Reduce任务的Worker遍历中间数据,对每一个唯一key执行Reduce函数,结果写入到输出文件中;执行完毕后,唤醒用户程序,返回结果。
6.自己实现wordcount代码