MapReduce计算框架
Mapreduce 是一个分布式的运算编程框架,核心功能是将用户编写的核心逻辑代码分布式地
运行在一个集群的很多服务器上;
为什么要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分为3个过程:
1、map //A读取文件 B调用业务逻辑代码(程序员只关系这个部分) C收集调用结果
2、shuffle机制 //缓存一下
3、reduce //A拉取缓存中的数据 B调用业务逻辑代码(程序员只关系这个部分) C收集结果输出(最终结果)默认把最终结果写到hdfs中
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 的合并
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为主流计算引擎。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。