本文已参与「新人创作礼」活动,一起开启掘金创作之路。
目录
MapReduce思想
先分再和,分而治之
将复杂的问题,按照一定的分解方法,分为等价规模的较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果。
Map
Map是第一阶段,负责拆分,把复杂任务分别为若干个简单子任务,进行拆分的前提是这些小任务可以进行并行计算,彼此之间没有依赖关系,map的含义是映射,将分解的子任务计算为一个结果,就因为这些子问题是等价规模的,所以就像一个函数一样,子问题的子问题的计算结果就是映射关系。
Reduce
Reduce是第二阶段,负责合计,将Map阶段的结果进行汇总。
编辑
编辑
编程模型
- MapReduce中定义了Map和Reduce两个接口,由用户去编程实现。
- NaoReduce处理的数据类型不管是输入还是输出都是key:value的键值对。
- MapReduce计算框架实现了数据存储,划分,分发,结果收集,错误恢复,分布代码执行,节点集群的自动调度等,程序员只需要关系应用层的具体计算问题。
MapReduce介绍
一句话概括:MapReduce是一个分布式计算的计算框架
分布式计算与集中式计算相对,分布式计算是将数据分解成许多部分,然后分配给多台计算机处理,从而提高效率。集中式计算就是让全让一台计算机去处理。
MapReduce的优点
- 易于编程:该框架隐藏了许多细节,程序员只负责实现简单的接口。
- 良好的拓展性:当计算机资源不够时,可以通过增加机器来扩展计算能力,并不会给计算造成负担,这是它很容易去处理海量数据的关键。
- MR在超级大量数据计算时是非常稳定的,像其它计算 框架如spark等计算速度快,但是可能不如MR稳定。
MapReduce的缺点
- 实时计算性能差:主要用于离线作业,无法做到秒级的数据响应。
- 不能进行流式计算:流式计算特点是源源不断得计算,并且数据是动态得,MapReduce只能针对静态数据去计算。
MapReduce的阶段
一个MapReduce编程模型只能包含一个Map阶段和Reduce阶段或者只能包含Map阶段,如果用户的业务逻辑复杂,只能进行多个阶段的处理,不能将Map的结果再交给下一个Map。
编辑
MapReduce的数据类型
在MapReduce中,数据是以key:value的形式计算的,考虑key的value的含义是很重要的,MapReduce的排序,分组等都和K有关。
比如统计全国订单总额,把用户编号作为key,同一个用户的订单就可以通过map聚到一起了,再求和。
MapReduce的实例进程
编辑
MRAppMaster只有一个,另外两个可以有多个,取决于数据量
运行MapReduce的示例
官方在Hadoop安装包中给了若干示例,一个完整的MR程序需要用户编写的代码和Hadoop自己实现的代码整合在一起才可以,用户负责map和reduce两个阶段的业务问题,Hadoop负责底层的技术问题。
计算圆周率
- 启动集群 start-all.sh
- 1.找到示例的路径:/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
- 2.找到实例程序:hadoop-mapreduce-examples-3.3.0.jar
- 3.提交(运行)该程序:提交到yarn集群上分布式执行,hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2 或者yarn jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2 ,后面的pi 2 2为参数
编辑
统计单词个数
编辑
Step1:可以先将需要统计的文件传到hdfs文件系统
编辑
Step2:找到示例路径/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
Step3:运行程序,jar hadoop-mapreduce-examples-3.3.0.jar wordcount /wordcount/4.txt /wordcount/5.txt
第一个路径是需要统计的文件路径,第二个路径是输出结果路径,注意,输出结果路径必须是不存在的文件夹,否则会报错。
编辑
编辑
流程图
编辑
具体的执行过程除了map和reduce过程还有其他几个更细节的过程。
map阶段包括了splitting和mapping,将数据处理后,每个数据都为键值对的样式。
shuffle阶段将数据排序分组,把k相同的分到一组。
reduce阶段将数据的值进行累加求和。
map阶段的执行流程
编辑
- 阶段一:把输入目录下文件按照一定标准逐个进行逻辑分片,默认一个切片大小为一个块的大小(128M),每个片都由一个MapTask处理。
- 阶段二:对切片中的数据按照一定规则解析返回<key,value>对,默认是按行读取,key表示第几行,value是本行的文本内容。
- 阶段三:调用Mapper类中的map方法,以空格为分隔符,为每次读取出来的数据转换为<key,value>格式。如<apple,1>等
- 阶段四:按照一定规则对Map输出的键值对进行分区partition,默认不分区,分区的数量是reducetask的数量,并且只有一个reducetask。
- 阶段五:将数据写入内存缓冲区,当内存缓冲区的数据达到一定数量,达到溢出状态,根据key进行排序sort,默认根据字母顺序排序。
- 阶段六:对所有溢出文件进行最终的merge合并到磁盘上,成为一个文件。
- 总结:先是将数据分开处理,变成键值对,然后再合到一起并排序。
reduce阶段的执行流程
- 阶段一:ReduceTask主动从MapTask复制拉取属于自己要处理的数据
- 阶段二:把拉取来的数据全部进行合并,即把分散的数据合并成一个大数据,再对合并的数据进行排序,因为拉取得时候不是一下全拉过来,是分开拉取得。
- 阶段三:对排序后的键值对调用reduce方法, 前后两个判断,判断key是否相等,如果相等就作为一组相加处理,最后把这些输出的键值对 写入HDFS文件中
shuffle过程机制
shuffle是一个过程,从map输出开始到reduce输入前结束。
shuffle本意是洗牌,混洗,将有序数据打乱成无序,而在这里,shuffle的操作更像是逆过程,将map端的无规则输出按指定的规则转换成具有一定规则的数据,以便reduce端处理。
shuffle全过程
编辑
Map端的shuffle过程
编辑
reduce端的shuffle过程
编辑
编辑
编辑
shuffle机制弊端
MapReduce的shuffle过程是程序的核心,但是该过程频繁涉及数据在内存和磁盘之间的往复,导致计算处理慢,例如将map方法的结果先存到内存,溢出后存到磁盘,拉取时到本地,最后再存到磁盘。
MapReduce计算处理慢,很大一部分原因是shuffle处理繁琐,