MapReduce计算框架

2019/2/18 星期一

MapReduce计算框架
Mapreduce 是一个分布式的运算编程框架,核心功能是将用户编写的核心逻辑代码分布式地
运行在一个集群的很多服务器上;

成都创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的10余年时间我们累计服务了上千家以及全国政企客户,如成都水处理设备等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称扬。

为什么要MAPREDUCE
(1)海量数据在单机上处理因为硬件资源限制,无法胜任,因为需要采用分布式集群的方式来处理。
(2)而一旦将单机版程序扩展到集群来分布式运行,将极大地增加程序的复杂度和开发难度
(3)引入mapreduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂×××由框架来处理

MAPREDUCE 程序运行演示
Hadoop 的发布包中内置了一个hadoop-mapreduce-example-2.4.1.jar,这个jar 包中有各种MR
示例程序,可以通过以下步骤运行:
启动hdfs,yarn
然后在集群中的任意一台服务器上执行,(比如运行wordcount):
hadoop jar hadoop-mapreduce-example-2.4.1.jar wordcount /wordcount/data /wordcount/out

MapReduce引入的问题
1、分发程序,并启动分发的程序
2、中间数据的缓存和调度
3、任务监控及失败处理

MapReduce框架运行机制

MapReduce计算框架

MapReduce分为3个过程:
1、map //A读取文件 B调用业务逻辑代码(程序员只关系这个部分) C收集调用结果
2、shuffle机制 //缓存一下
3、reduce //A拉取缓存中的数据 B调用业务逻辑代码(程序员只关系这个部分) C收集结果输出(最终结果)默认把最终结果写到hdfs中

MapReduce运行机制的数据流程

MapReduce计算框架

1、map //key:行起始偏移量 value:行的内容
2、shuffle //洗牌 按key分发:相同的key的kv必定会发给相同的reduce task
3、reduce //将key的值相同的整合成一组

mapreduce框架中的shuffle机制详解
Shuffle 缓存流程:
----shuffle 是MR 处理流程中的一个过程,它的每一个处理步骤是分散在各个maptask 和reduce task 节点上完成的,整体来看,分为3 个操作:
1、分区partition
2、Sort 根据key 排序
3、Combiner 进行局部value 的合并

MapReduce计算框架

shuffle阶段文字详解
1、map阶段先拿数据过来之后,会先调用map方法(我们自定义的)
2、拿到之后,map中会有一个context.write的输出结果 map端的输出结果就给到了shuffle阶段了
3、在map端有一个环形缓冲区(默认内存大小100M)【实现的功能就是把这些kv收集起来】collect thread 收集线程
4、在不断输出,不断收集的过程中环形的缓存区会不断的写,会写满,那么内部的机制是不会让他写满,写到80%就会溢出,还是在map端会把溢出来的数据被 (线程split thread)管理 在这里还会把溢出来的数据进行partition(分区) sort(排序)接下里split thread会把溢出来的数据存放到磁盘上面【这里存放在磁盘中的数据是分好区 排序好了的】。溢出文件分好区,且区内有序。
5、在map端,最后一次,会把数据全部的溢出来,也是分好区且区内有序的。然后会形成很多一系列分好区的小文件,接下来会进行merge(合并)小文件合并后形成大文件。这种合并是把分区内的数据一一对应的合并 所有1号区合并形成1号区 ... 这里同样是分区且区内有序(这是最后在map端形成的最后文件形式)。
6、shuffle不是在某一个节点上完成的。shuffle是map和reduce中间的数据调度机制过程 主要包括:缓存 分区 排序
7、reduce 端 reduce主动下载map端的最后形成的文件(先主动下载所有map端的1号区的内容)。这里1号区 2号区 0号区会被分别在不同的reduce task中
8、接下来,会把从map端的1号区中都拿个过来的数据进行一次reduce端的merge(合并)并排序 //归并排序
9、每个聚合调用一次reduce方法 传递的的参数 key:是这聚合组的相同的key,values:是这一聚合组的所有value的迭代器
//产生聚合values 迭代器来传递给reduce 方法,并把这组聚合kv(聚合的依据是GroupingComparator)中排序最前的kv 的key 传给reduce 方法的入参key 。 最终会形成一个有序的且归档的文件
提示:其他的reduce也是做相同的事情,只不过其他的reduce拿到的数据可能是1号区 2号区的内容,处理的过程同上。每个reduce task会形成一个最终的有序结果文件
10、reduce端最后形成的文件,在内部有序,但是在全部不一定有序,这个需要我们程序去干预 如果是全局排序的话,需要加上分区的控制,让这个分区按照一定的区段分区,最终形成reduce的全局有序。在某一个分界点 前面的一个key一个区,中间的一个key一个区,最后的key一个区等。

小结:整个shuffle 的大流程如下:
 map task 输出结果到一个内存缓存,并溢出为磁盘文件
 combiner 调用
 分区/排序
 reduce task 拉取map 输出文件中对应的分区数据
 reduce 端归并排序
产生聚合values 迭代器来传递给reduce 方法,并把这组聚合kv(聚合的依据是GroupingComparator)中排序最前的kv 的key 传给reduce 方法的入参key

shuffle不是在某一个节点上完成的。shuffle是map和reduce中间的数据调度机制过程 主要包括:缓存 分区 排序

在 MapReduce中的整个过程中有6次是需要进行io操作的,分别为:
1、在第一次拿数据(从hdfs中拿数据到map中发生第一次io操作)
2、溢出数据(发生第二次io操作)
3、merge(小文件合并为大文件发生第三次io操作)
4、combiner局部合并(发生第四次io操作)
5、归并排序(conbiner合并到reduce处理的过程发生第5次io操作)
6、reduce处理完的结果存储在hdfs上发生第6次io操作
这也是MapReduce与spark对比的最大的瓶颈 spark只有 在第一次从hdfs上拿数据发生io操作,和处理完任务之后,把文件存储在hdfs上也发生一次io操作,其中间的所有的处理过程都是在内存中,所有不存在 大量的io操作,速度快,所有spark为主流计算引擎。


网站题目:MapReduce计算框架
链接分享:http://scyanting.com/article/gdpsoh.html