李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
01.MapReduce介绍
Leefs
2021-06-29 AM
1104℃
0条
# 01.MapReduce介绍 ### 一、简介 在分布式计算中,**MapReduce**框架负责处理了并行编程中`分布式存储`、`工作调度`、`负载均衡`、`容错均衡`、`容错处理`以及`网络通信`等复杂问题,把处理过程高度抽象为两个函数:`map`和`reduce`。 **MapReduce**采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。 **总结**:MapReduce就是"任务的分解与结果的汇总" ### 二、Map和Reduce **2.1 概念介绍** MapReduce 方法使用了拆分的思想,合并了map(映射)和reduce(归约)两种经典函数。 + **map**:接受一个键值对`(key-value pair)`,产生一组中间键值对。`MapReduce`框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。 + **reduce**:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。 **2.2 MapReduce编程模型** ![01.MapReduce介绍02.png](https://lilinchao.com/usr/uploads/2021/06/88609505.png) 说明: 1. user program链接了map reduce库,实现了最基本的map函数和reduce函数。 2. MapReduce库先把user program的输入文件划分为M份(划分到多少份是用户定义的),如上图所示,我们将用户输入文件划分为5份,分别是split0~split4. 3. user program用fork得到一个自己的副本进程,记为master,然后再fork几个进程记为worker,这个master是负责调度作业的,为空闲的worker分配任务。(Map作业,即是处理一个输入数据的分片;Reduce作业处理一个分区的中间键值对),woker的数量也是由用户指定的,用户想要fork几个就fork几个。 4. map得到的中间结果会被定期写入本地磁盘,且被分为R个区,R也是用户定义的,将来的每个区会对应一个reduce作业。这些中间结果的位置会被告知给master,master将这些信息告诉reduce worker。 5. reduce worker从master那里得到了自己负责的中间结果的位置,reduce worker得到所有的中间键值对,现对他们进行排序,使得相同键的键值对聚集在一起。 6. 然后reduce worker将得到键值及其相关联的值集合一起给reduce函数,reduce函数会将这些输出到这个分区的输出文件(HDFS)中。 7. 所有的map和reduce作业完成了,master唤醒user program,map reduce函数调用返回user program的代码。 **2.3 MapReduce中的shuffle** 整个MapReduce过程大致分为:`Map-->Shuffle(排序)-->Combine(组合)-->Reduce` ![01.MapReduce介绍01.jpg](https://lilinchao.com/usr/uploads/2021/06/1843506694.jpg) #### **流程分析** **Map端:** (1)**每个输入分片会让一个map任务来处理**。 > 默认情况下,以HDFS的一个块的大小(默认为64M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中,当该缓冲区快要溢出时(默认为缓冲区大小的80%),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。 (2)**在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。** > 这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combia操作,这样做的目的是让尽可能少的数据写入到磁盘。 (3)**当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。** > 合并的过程中会不断地进行排序和combia操作,目的有两个: > > 1. 尽量减少每次写入磁盘的数据量; > 2. 尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。 (4)**将分区中的数据拷贝给相对应的reduce任务。** > 有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就ok了哦。 **Reduce端:** (1)Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。 (2)随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在map端还是reduce端,MapReduce都是反复地执行排序,合并操作。 (3)合并的过程中会产生许多的中间文件,但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。 *附:* https://www.cnblogs.com/LUO77/p/5789346.html https://blog.csdn.net/zhinengxuexi/article/details/83351705
标签:
Spark
,
Spark Core
,
Spark RDD
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1264.html
上一篇
03.Livy中REST API使用
下一篇
02. Spark Shuffle过程介绍
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
高并发
Spark Streaming
序列化和反序列化
二叉树
数学
算法
Golang基础
微服务
递归
Shiro
散列
随笔
Ubuntu
Spark Core
CentOS
Livy
Tomcat
设计模式
FileBeat
Spark RDD
并发编程
Map
VUE
Eclipse
Kibana
Jenkins
JavaWeb
字符串
Filter
MySQL
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞