2019/2/18 星期一
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为主流计算引擎。